当前位置:   article > 正文

通过单片机的PWM控制SG90舵机运动_舵机占空比750

舵机占空比750
 

一.PWM介绍

1.PWM概念

英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
时间占据整个信号周期的百分比,例如方波的占空比就是50%.


2.要点概括


1.2.1:他可以调节脉冲的宽度
1.2.2:通过占空比模拟编码信号
1.2.3:占空比:在一个周期内,高电平占全部周期的百分比

二、实现PWM的方法

1.芯片模块块内部自带的PWM输出,一般可以通过软件手册查询是否支持
2.芯片模块没有自带:可以通过指定的IO端口模拟PWM信号,但是精度相较于芯片自带的比较差

三.如何控制舵机

1.对于舵机而言,一般有三根线,其中两条是电源线,另外一条是PWM信号线,通过给PWM信号线输入信号,使得舵机旋转相应的角度,进而控制舵机
2.其中PWM的频率不能太高,通常情况下,一般为50Hz,也就是0.02s,就是20ms为一个周期

PWM数据转动角度
高电平时间舵机旋转的角度函数对应的占空比
0.5ms0度2.5%占空比250
1.0ms45度5.0%占空比500
1.5ms90度7.5%占空比750
2.0ms135度10.0%占空比1000
2.5ms180度12.5%占空比1250

不同的舵机有可能旋转角度不同,具体的根据舵机手册查询

四.编程实现

1.编程思路:

通过上面的表格可以发现,高电平都是基于0.5ms的,也就是说所有的都是以0.5ms为基础来进行,我们可以通过设定一个0.5ms也就是500微秒的定时器,通过统计定时器的爆表次数来控制PWM信号,比如想让电机旋转90度,那么高电平就是1.5ms,通过定时器爆表3次(1.5ms是0.5ms的3倍),如果定时器爆表次数小于3,则将定义的PWM管脚输出高电平,其余输出低电平,这样就输出一个可以使电机旋转90度的PWM信号。当爆表次数到达40次之后,将计数归零,重新开始计数。

2.程序代码

  1. #include <regx52.h>
  2. #include <intrins.h>
  3. sbit SG90_PWM = P1^0;
  4. int ctu;
  5. int angle;
  6. void Delay300ms() //@11.0592MHz
  7. {
  8. unsigned char i, j, k;
  9. _nop_();
  10. i = 3;
  11. j = 26;
  12. k = 223;
  13. do
  14. {
  15. do
  16. {
  17. while (--k);
  18. } while (--j);
  19. } while (--i);
  20. }
  21. void Delay2000ms() //@11.0592MHz
  22. {
  23. unsigned char i, j, k;
  24. _nop_();
  25. i = 15;
  26. j = 2;
  27. k = 235;
  28. do
  29. {
  30. do
  31. {
  32. while (--k);
  33. } while (--j);
  34. } while (--i);
  35. }
  36. /*定时器初始化函数*/
  37. void Timer0Init(void)
  38. {
  39. AUXR &= 0x7F;
  40. TMOD &= 0xF0;
  41. TMOD |= 0x01;
  42. TL0 = 0x33;
  43. TH0 = 0xFE;
  44. TF0 = 0;
  45. TR0 = 1;
  46. EA = 1;
  47. }
  48. /*主函数调用部分*/
  49. void main()
  50. {
  51. Delay300ms();
  52. Timer0Init(void);
  53. while(1)
  54. {
  55. angle = 3;
  56. ctu = 0;
  57. Delay2000ms();
  58. angle = 1;
  59. ctu = 0;
  60. Delay2000ms();
  61. }
  62. }
  63. void Time0Handler() interrupt 1
  64. {
  65. ctu++; //每次经过0.5ms,计数值就自动加一
  66. TL0=0x33;
  67. TH0=0xFE;
  68. if( ctu< angle)
  69. {
  70. sg90_PWM = 1;
  71. }
  72. else
  73. {
  74. sg90_PWM = 0;
  75. }
  76. if(ctu == 40)
  77. {
  78. ctu = 0;
  79. sg90_PWM = 1;
  80. }
  81. }

3.可能产生的疑问

(1)定义“angle”的意义:定义angle是为了更方便的控制电机旋转的角度,电机控制的角度不在是一个固定值

(2)angle = 3; 
        ctu = 0;
        Delay2000ms();
        angle = 1; 
        ctu = 0;
        Delay2000ms();

以上代码的含义是:给出确定的角度,当电机每次发生一次跳变时,便会将计数值归零一次,防止产生误差

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/281067?site
推荐阅读
相关标签
  

闽ICP备14008679号