單片機PWM舵機控制原理

舵機的控制一般需要一個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 <reg52.h>  
  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<jd) //輸出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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章