风筝
发表于: 2019-2-20 22:05:48 | 显示全部楼层

伺服电机广泛用​​于需要精确控制的场合,例如机器人、自动机械、机械臂等。然而,伺服电机的范围不仅限于此,并且可以用于许多应用中。要了解伺服电机的基础知识,理论和工作原理,请阅读论坛的其他内容。


在本篇文章中,我们将使用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(任何颜色)


伺服电机的引脚说明

Servo-Motor-Pinout.jpg

1. 红色=电源(4.8V至6V)

2. 棕色=地

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


电路原理图

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

Circuit-Diagram-for-Interfacing-Servo-Motor-with-Atmega16_0.png

连接完成后,效果如下所示:

Interfacing-Servo-Motor-with-AVR-Microcontroller-Atmega16.jpg


用AVR ATmega16控制伺服电机

与步进电机一样,伺服电机不需要任何外部驱动器,例如ULN2003或L293D电机驱动器。只需PWM就足以驱动伺服电机,很容易从微控制器产生PWM。该伺服电机的扭矩为2.5kg / cm,因此如果需要更大的扭矩,则该伺服不适用。


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

servo-rotation.gif


获得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官方数据表中找到更多相关说明。

Atmega16-Operation.png


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

  1. fpwm = fcpu / n x (1 + TOP)
复制代码

可以简化为,

  1. 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微控制器进行编程。只需编译草图,然后使用外部工具链上传。


代码

  1. #define F_CPU 1000000UL
  2. #include<avr/io.h>
  3. #include<util/delay.h>


  4. void main()
  5. {
  6. //Configure TIMER1
  7. TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); //NON Inverted PWM
  8. TCCR1B|=(1<<WGM13)|(1<<WGM12)|(0<<CS11)|(1<<CS10); //PRESCALER=1 MODE 14(FAST PWM)
  9.    
  10. ICR1=19999; //fPWM=50Hz (Period = 20ms Standard).

  11. DDRD|=(1<<PD4)|(1<<PD5); //PWM Pins as Out
  12.    
  13. while(1)
  14. {

  15.         OCR1A=0; //0 degree
  16.         _delay_ms(1000);

  17. OCR1A=600; //45 degree
  18. _delay_ms(1000);

  19. OCR1A=950; //90 degree
  20. _delay_ms(1000);

  21. OCR1A=1425; //135 degree
  22. _delay_ms(1000);

  23. OCR1A=1900; //180 degree
  24. _delay_ms(1000);
  25.       
  26.     OCR1A=1425; //135 degree
  27.         _delay_ms(1000);

  28. OCR1A=950; //90 degree
  29. _delay_ms(1000);

  30. OCR1A=650; //45 degree
  31. _delay_ms(1000);

  32. }
  33. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 32 | 回复: 41



手机版|

GMT+8, 2024-4-26 15:50 , Processed in 0.053179 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表