伺服电动机广泛用于需要精确控制的地方,例如机器人,自动化机械,机械臂等。但是,伺服电动机的范围并不仅限于此,可以用于许多应用中。要了解更多有关伺服电动机的基础知识,理论和工作原理的信息,请点击链接。
我们以前将伺服电机与许多微控制器接口:
- 伺服电机与ARM7-LPC2148的接口
- 将伺服电机与MSP430G2连接
- 伺服电机与STM32F103C8的接口
- 使用MPLAB和XC8将伺服电机与PIC单片机接口
- 伺服电机与Arduino Uno接口
- 伺服电机与8051单片机的接口
在本教程中,我们将使用Atmel Studio 7.0将Micro Servo Motor与Atmega16 AVR Microcontroller接口。伺服电机的额定工作电压为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官方数据表中找到更多描述。
要将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
这意味着要达到最大程度,即ICR1应该为1999的180 0。
对于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的内部库,即
连接USBASP v2.0并按照此链接中的说明使用USBASP和Atmel Studio 7.0对Atmega16 AVR微控制器进行编程。只需构建草图并使用外部工具链上传即可。
演示视频的完整代码如下。通过了解伺服电机在机器人技术中的重要性,还可以了解更多有关伺服电机的信息。