将微型伺服电机与Atmega16连接起来的方法

控制/MCU

1882人已加入

描述

  伺服电机广泛用​​于需要精确控制的地方,如机器人、自动化机械、机械臂等。然而,伺服电机的范围并不限于此,可以在许多应用中使用。

  在本教程中,我们将使用 Atmel Studio 7.0将微型伺服电机与 Atmega16 AVR 微控制器连接起来。伺服电机额定工作电压为4.8-6V。我们可以通过应用脉冲串或PWM信号来控制它的旋转角度和方向。请注意,伺服电机不能移动完整的 360 度旋转,因此它们用于不需要连续旋转的地方。旋转角度为 0 -180 度或 (-90) – (+90) 度。

  所需组件

  SG90 Tower Pro 微型伺服电机

  Atmega16微控制器IC

  16Mhz 晶体振荡器

  两个 100nF 电容器

  两个 22pF 电容器

  按钮

  跳线

  面包板

  USBASP v2.0

  LED(任何颜色)

  伺服电机引脚说明

伺服电机

  红色 = 正电源(4.8V 至 6V)

  棕色 = 接地

  橙色 = 控制信号(PWM 引脚)

  电路原理图

  如下图所示连接所有组件,以使用 AVR 微控制器旋转伺服电机。有四个 PWM 引脚,我们可以使用 Atmega16 的任何 PWM 引脚。在本教程中,我们使用引脚 PD5 (OC1A) 来生成PWM。PD5直接接伺服电机橙色线,为输入信号脚。连接任何颜色的电源指示灯。此外,在复位引脚中连接一个按钮,以便在需要时复位 Atmega16。将 Atmega16 与适当的晶体振荡器电路连接。所有系统将由 5V 电源供电。

伺服电机

伺服电机

  完整的设置如下所示:

伺服电机

  用 AVR ATmega16 控制伺服电机

  与步进电机一样,伺服电机不需要任何外部驱动器,例如 ULN2003 或 L293D 电机驱动器。只需 PWM 就足以驱动伺服电机,并且很容易从微控制器生成 PWM。这个伺服电机的扭矩是2.5kg/cm,所以如果你需要更大的扭矩那么这个伺服是不合适的。

  众所周知,伺服电机每20ms寻找一个脉冲,正脉冲的长度将决定伺服电机的旋转角度。

伺服电机

  获得 20ms 脉冲所需的频率为 50Hz (f = 1/T)。所以对于这个伺服电机,规范说0度需要0.388ms,90度需要1.264ms,180度需要2.14ms脉冲。

  为了生成指定的脉冲,我们将使用 Atmega16 的 Timer1。CPU 频率为 16Mz,但我们将只使用 1Mhz,因为我们没有太多外围设备连接到微控制器并且微控制器上的负载也不大,所以 1Mhz 就可以完成这项工作。预分频器设置为 1。因此时钟被划分为 1Mhz/1 = 1Mhz (1uS),这很好。Timer1将用作快速 PWM 模式,即模式 14。您可以使用不同的定时器模式来生成所需的脉冲序列。参考如下,您可以在Atmega16 Official Datasheet中找到更多描述。

伺服电机

  要将Timer1 用作快速 PWM模式,我们需要 ICR1(输入捕捉寄存器 1)的 TOP 值。要找到 TOP 值,请使用下面给出的公式:

  f pwm = f cpu / nx (1 + TOP)

  这可以简化为,

  TOP = ( f cpu / ( f pwm xn)) – 1

  其中,N = 预分频器设置的值

  f cpu = CPU 频率

  f pwm =伺服电机脉冲宽度,即 50Hz

  现在计算 ICR1 值,因为我们拥有所需的所有值,

  N = 1,f cpu = 1MHz,f pwm = 50Hz

  只需将值放在上面的公式中,我们就会得到

  ICR1 = 1999

  这意味着要达到最大程度,即 180 0,ICR1 应该是 1999。

  对于 16MHz 晶振和预分频器设置为 16,我们将有

  ICR1 = 4999

  现在让我们继续讨论草图。

  使用 USBasp 编程 Atmega16

  下面给出了用于控制伺服电机的完整 AVR 代码。代码很简单,很容易理解。

  在这里,我们对 Atmega16 进行了编码,以将伺服电机从 0 0旋转到 180 0并再次从 180 0旋转到 0 0。此转换将在 9 个步骤中完成,即 0 – 45 – 90 – 135 – 180 – 135 – 90 – 45 – 0。对于延迟,我们将使用 Atmel Studio 的内部库,即 《util/delay.h》

  连接您的 USBASP v2.0 并按照此链接中的说明使用 USBASP 和 Atmel Studio 7.0 对 Atmega16 AVR 微控制器进行编程。只需使用外部工具链构建草图并上传即可。
 

#define F_CPU 1000000UL

#include

#include

无效的主要()

{

//配置TIMER1

TCCR1A|=(1<

TCCR1B|=(1<

ICR1=19999;//fPWM=50Hz(周期 = 20ms 标准)。

DDRD|=(1<

而(1)

{

        OCR1A=0;//0度

        _delay_ms(1000);

OCR1A=600;//45度 

_delay_ms(1000);

OCR1A=950;//90度 

_delay_ms(1000);

OCR1A=1425;//135度 

_delay_ms(1000);

OCR1A=1900;//180度 

_delay_ms(1000);

    OCR1A=1425;//135度

        _delay_ms(1000);

OCR1A=950;//90度

_delay_ms(1000);

OCR1A=650;//45度

_delay_ms(1000);

}

}

#define F_CPU 1000000UL

#include

#include

无效的主要()

{

//配置TIMER1

TCCR1A|=(1<

TCCR1B|=(1<

ICR1=19999;//fPWM=50Hz(周期 = 20ms 标准)。

DDRD|=(1<

而(1)

{

        OCR1A=0;//0度

        _delay_ms(1000);

OCR1A=600;//45度 

_delay_ms(1000);

OCR1A=950;//90度 

_delay_ms(1000);

OCR1A=1425;//135度 

_delay_ms(1000);

OCR1A=1900;//180度 

_delay_ms(1000);

    OCR1A=1425;//135度

        _delay_ms(1000);

OCR1A=950;//90度

_delay_ms(1000);

OCR1A=650;//45度

_delay_ms(1000);

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分