|
伺服电机广泛用于需要精确控制的场合,例如机器人、自动机械、机械臂等。然而,伺服电机的范围不仅限于此,并且可以用于许多应用中。要了解伺服电机的基础知识,理论和工作原理,请阅读论坛的其他内容。
在本篇文章中,我们将使用Atmel Studio 7.0将Micro Servo Motor伺服电机与Atmega16 AVR微控制器连接起来。伺服电机的额定工作电压为4.8-6V。我们可以通过应用脉冲或PWM信号来控制其旋转角度和方向。请注意,伺服电机无法完全旋转360度,因此可以在不需要连续旋转的情况下使用。旋转角度为0-180度或(-90) - (+ 90)度。
所需的组件 ● SG90 Tower Pro微型伺服电机 ● Atmega16微控制器IC ● 16Mhz晶体 ● 按钮 ● 跳线 ● 面包板 ● USBASP v2.0 ● Led(任何颜色)
伺服电机的引脚说明
1. 红色=电源(4.8V至6V) 2. 棕色=地 3. 橙色=控制信号(PWM引脚)
电路原理图 使用AVR微控制器旋转伺服电机,请参考下图所示连接所有组件。有四个PWM引脚,我们可以使用Atmega16的任何PWM引脚。在本文中,我们使用Pin 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的TOP值(输入捕捉寄存器1)。要找到TOP值,请使用以下公式: - fpwm = fcpu / n x (1 + TOP)
复制代码可以简化为, - TOP = (fcpu / (fpwm x n)) – 1
复制代码
其中,N =预分频器的值 fcpu = CPU Frequencey fpwm =伺服电机脉冲宽度为50Hz
现在计算ICR1值,因为我们有所需的所有值, N = 1,fcpu = 1MHz,fpwm = 50Hz
只需将值放在上面的公式中,我们就会得到 ICR1 = 1999 这意味着达到最大程度,即180,ICR1应该是1999。 对于16MHz晶振和预分频器设置为16,我们将得到 ICR1 = 4999
现在让我们讨论草图。
使用USBasp编程Atmega16 本文末尾给出了用于控制伺服电机的完整AVR代码。代码很简单,很容易理解。
在这里,我们编写了Atmega16的代码,将伺服电机从00旋转到1800,然后从1800回到00。这个过渡将完成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<avr/io.h>
- #include<util/delay.h>
-
-
- void main()
- {
- //Configure TIMER1
- TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); //NON Inverted PWM
- TCCR1B|=(1<<WGM13)|(1<<WGM12)|(0<<CS11)|(1<<CS10); //PRESCALER=1 MODE 14(FAST PWM)
-
- ICR1=19999; //fPWM=50Hz (Period = 20ms Standard).
-
- DDRD|=(1<<PD4)|(1<<PD5); //PWM Pins as Out
-
- while(1)
- {
-
- OCR1A=0; //0 degree
- _delay_ms(1000);
-
- OCR1A=600; //45 degree
- _delay_ms(1000);
-
- OCR1A=950; //90 degree
- _delay_ms(1000);
-
- OCR1A=1425; //135 degree
- _delay_ms(1000);
-
- OCR1A=1900; //180 degree
- _delay_ms(1000);
-
- OCR1A=1425; //135 degree
- _delay_ms(1000);
-
- OCR1A=950; //90 degree
- _delay_ms(1000);
-
- OCR1A=650; //45 degree
- _delay_ms(1000);
-
- }
- }
复制代码
|