控制/MCU
伺服电机广泛用于需要精确控制的地方,如机器人、自动化机械、机械臂等。然而,伺服电机的范围并不限于此,可以在许多应用中使用。
在本教程中,我们将使用 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);
}
}
全部0条评论
快来发表一下你的评论吧 !