单片机PWM舵机控制原理

2019-04-15 18:52发布

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;   如下图可形象地表示脉冲与角度关系  

[cpp] view plain copy  在CODE上查看代码片派生到我的代码片
  1. #include   
  2. unsigned char count;            //0.5ms次数标识  
  3. sbit pwm=P1^0;              //信号输出  
  4. sbit jia=P1^1;              //角度增加按键  
  5. sbit jan=P1^2;              //角度减小按键  
  6. char jd;                    //角度标识  
  7. void delay(unsigned int i)  
  8. {  
  9.     unsigned int j,k;  
  10.     for(j=i;j>0;j--)  
  11.         for(k=125;k>0;k--);  
  12. }  
  13. void Time0_init()           //定时器初始化  
  14. {  
  15.     TMOD=0x01;  
  16.     IE=0x82;  
  17.     TH0=0xff;  
  18.     TL0=0x19;               //12晶振,0.25ms  
  19.     TR0=1;                 //定时器开始  
  20. }  
  21. void Time0_int() interrupt 1            //中断程序  
  22. {  
  23.     TH0=0xff;  
  24.     TL0=0x19;  
  25.     if(count//输出count个高电平  
  26.         pwm=1;  
  27.     else  
  28.     pwm=0;    //其余输出低电平  
  29.     count++;  
  30.     count=count%40;  //时钟保持40个count 即20ms  
  31. }  
  32. void keyscan()              //按键扫描  
  33. {  
  34.     if(jia==0)              //角度增加键是否按下  
  35.     {  
  36.         delay(50);          //按下延时,消抖  
  37.         if(jia==0)  
  38.         {  
  39.             jd++;           //角度标识加1  
  40.             count=0;        //按键按下,则20ms周期重新开始  
  41.             if(jd==50)  
  42.                 jd=9;            //已经是180°则保持  
  43.                 while(jia==0);   //等待按键放开  
  44.         }  
  45.     }  
  46.     if(jan==0)                   //角度减小键是否按下  
  47.     {  
  48.         delay(10);  
  49.         if(jd==0);  
  50.         {  
  51.             jd--;                //角度标识减1  
  52.             count=0;  
  53.             if(jd==0)  
  54.                 jd=1;  
  55.             while(jan==0);  
  56.         }  
  57.     }  
  58. }  
  59.   
  60. void main()  
  61. {  
  62.     jd=1;  
  63.     count=0;  
  64.     Time0_init();  
  65.     while(1)  
  66.     {  
  67.         keyscan();  
  68. //      display();  
  69.     }  
  70. }