欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 初學單片機之PWM控制舵機的原理與C語言源程序 [打印本頁]

作者: Mr.wang7    時間: 2018-8-22 11:22
標題: 初學單片機之PWM控制舵機的原理與C語言源程序
1、舵機圖片如下:


舵機有三根線、一般按順序依次來說是: 地(GND),電源(VCC),信號線 ;

2.舵機的工作原理是:


控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。

3.舵機的控制:
舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應的控制關系是這樣的:
   0.5ms--------------0度;1.0ms------------45度;  1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度

4 總結經驗:
舵機 簡單來說 就是給它高電平延時xms;然后在低電平延時(20-x)ms,然后while 循環,就可以了  ;具體的程序 在 附件下載(其中包含了 步進電機的程序 可忽略)

提供以下方式的驅動程序:
使用T0、T1兩個定時器產生PWM控制
使用T0一個定時器產生PWM控制
使用PCA的16位軟件定時器產生PWM控制單片機源程序如下:
  1. /***
  2. **項目名稱:舵機使用介紹(測試程序部分)
  3. **實現方法:使用PCA的16位軟件定時器產生PWM控制
  4. **編寫時間:2017.07.06
  5. **使用芯片:stc12c4052ad
  6. **時鐘頻率:使用外部晶振頻率12MHz
  7. **聯系方式:QQ群號-143867886
  8. *****更多內容可在微信公眾號(電子創客派 ID:e_diy_c)查看*****
  9. ***/

  10. #include <stc12c2052ad.h>
  11. #include <intrins.h>

  12. typedef unsigned char u8;
  13. typedef unsigned short int u16;

  14. sbit CTRL = P3^7;                                                                //舵機控制端口

  15. void delay_100ms(u16 x);

  16. u16 TIME = 20000;                                                                //PWM周期時間(單位us)
  17. u16 Min = 800;                                                                        //高電平最小持續時間
  18. u16 Max = 2200;                                                                        //高電平最大持續時間
  19. u16 aTime = 800;                                                                //高電平持續時間
  20. u8 Degree = 200;                                                                //單位時間寬度(最小是舵機死區設定大約10us)

  21. void main()
  22. {
  23.         CTRL = 0;
  24.        
  25.         //PCA0配置
  26.         CCAPM0 = 0x48;                                                                //設置PWM0為16位軟件定時器
  27.         CCAPM0 |= 0x01;                                                                //PCA0比較中斷使能
  28.         CL = 0;                                                                                                //PCA計數器低8位
  29.         CH = 0;                                                                                                //PCA計數器高8位
  30.         CCAP0L = aTime;                                                                //PCA0比較寄存器低8位
  31.         CCAP0H = aTime >> 8;                                        //PCA0比較寄存器高8位
  32.         CR = 1;                                                                                                //使能PCA計數
  33.         EPCA_LVD = 1;                                                                        //使能PCA中斷
  34.         EA = 1;                                                                                                //打開中斷總開關
  35.        
  36.         while(1)
  37.         {
  38.                 //逆時針旋轉
  39.                 while(aTime < Max)
  40.                 {
  41.                         delay_100ms(5);
  42.                         aTime += Degree;
  43.                 }
  44.                
  45.                 //順時針旋轉
  46.                 while(aTime > Min)
  47.                 {
  48.                         delay_100ms(5);
  49.                         aTime -= Degree;               
  50.                 }
  51.         }
  52. }


  53. void Delay100ms()                //@12.000MHz
  54. {
  55.         unsigned char i, j, k;

  56.         _nop_();
  57.         _nop_();
  58.         i = 5;
  59.         j = 144;
  60.         k = 71;
  61.         do
  62.         {
  63.                 do
  64.                 {
  65.                         while (--k);
  66.                 } while (--j);
  67.         } while (--i);
  68. }

  69. void delay_100ms(u16 x)
  70. {
  71.         while(x--)  Delay100ms();
  72. }


  73. //PCA中斷
  74. void _PCA_() interrupt 6 using 1
  75. {
  76.         static u8 flag = 1;
  77.        
  78.         //PWM0比較中斷
  79.         if(CCF0)
  80.         {
  81.                 CCF0 = 0;                                                                                //中斷標志位要軟件清零

  82.                 if(flag)                                                                                //如果之前PWM0_CTRL是高電平,則接下來產生時間寬度為TIME-aTime的低電平
  83.                 {
  84.                         CTRL = 0;
  85.                         CCAP0L = TIME;
  86.                         CCAP0H = TIME >> 8;
  87.                 }
  88.                 else                                                                                                //如果之前PWM0_CTRL是低電平,則接下來產生時間寬度為aTime的高電平
  89.                 {
  90.                         CTRL = 1;
  91.                         CL = 0;
  92.                         CH = 0;
  93.                         CCAP0L = aTime;
  94.                         CCAP0H = aTime >> 8;
  95.                 }
  96.                
  97.                 flag = 1 - flag;
  98.         }
  99. }
  100. ……………………

  101. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
制作步進電機控制模塊_C51程序.zip (5.28 KB, 下載次數: 67)
用PWM仿真DAC數模轉換.zip (503.86 KB, 下載次數: 35)
步進電機使用介紹_測試程序.zip (1.99 MB, 下載次數: 44)
[attach]139546[/attach]
舵機測試C51程序.zip (3.44 KB, 下載次數: 186)



作者: Mr.wang7    時間: 2018-8-22 11:23
如果使用 51 單片機控制多個的話 考慮到 功率問題 可以加個 三極管;(放大信號

作者: admin    時間: 2018-8-22 17:22
好資料,51黑有你更精彩!!!
作者: mygoko111    時間: 2018-8-22 18:40
學到了,學到了
作者: 284213945    時間: 2018-8-24 10:27

如果使用 51 單片機控制多個的話 考慮到 功率問題 可以加個 三極管;(放大信號
作者: _橙    時間: 2019-1-3 18:21
厲害了
作者: bbk215    時間: 2019-3-1 17:07
可以的,非常詳細的資料
作者: 1246698540    時間: 2019-3-8 23:14
感謝分享
作者: 日霂澧    時間: 2019-5-20 19:14
感謝分享,謝謝
作者: Elcrace2019    時間: 2019-8-2 23:12
學到了,點贊
作者: qpg    時間: 2019-8-3 15:53
謝謝分享,點贊
作者: 疾風未雨    時間: 2019-8-5 18:33
51黑上面的好資料
作者: CC51heiW    時間: 2019-11-12 11:17
Mr.wang7 發表于 2018-8-22 11:23
如果使用 51 單片機控制多個的話 考慮到 功率問題 可以加個 三極管;(放大信號

三極管是加在哪里的呢,因為是初學者不是特別明白
作者: linnyshow    時間: 2020-3-17 15:02
不錯。
作者: 小肥仔    時間: 2020-4-14 23:44
大神好厲害
作者: 六位數碼管    時間: 2020-5-7 09:19
很好感謝分享




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1