久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14932|回復: 15
打印 上一主題 下一主題
收起左側

8路舵機PWM控制電路proteus仿真原理圖+單片機源程序

  [復制鏈接]
跳轉到指定樓層
樓主
舵機的工作原理和控制:

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





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

0.5ms--------------0度;

1.0ms------------45度;

1.5ms------------90度;

2.0ms-----------135度;

2.5ms-----------180度

此電路設計51單片機控制PWM信號,輸送到兩個按鍵開關,從而來控制舵機的正轉和反轉,轉動角度范圍-90度到90度。

舵機的追隨特性:

假設現在舵機穩定在A點,這時候CPU發出一個PWM信號,舵機全速由A點轉向B點,在這個過程中需要一段時間,舵機才能運動到B點。



保持時間為Tw

當Tw≥△T時,舵機能夠到達目標,并有剩余時間;

當Tw≤△T時,舵機不能到達目標;

理論上:當Tw=△T時,系統最連貫,而且舵機運動的最快。

實際過程中w不盡相同,連貫運動時的極限△T比較難以計算出來。

假如我們的舵機1DIV =8us,當PWM信號以最小變化量即(1DIV=8us)依次變化時,舵機的分辨率最高,但是速度會減慢。


proteus仿真原理圖:








原代碼:
  1. #include<reg52.h>

  2. sbit PWM0 = P1^0;
  3. sbit PWM1 = P1^1;
  4. sbit PWM2 = P1^2;
  5. sbit PWM3 = P1^3;
  6. sbit PWM4 = P1^4;
  7. sbit PWM5 = P1^5;
  8. sbit PWM6 = P1^6;
  9. sbit PWM7 = P1^7;

  10. sbit ADD = P3^6;
  11. sbit SUB = P3^7;

  12. #define uchar unsigned char
  13. #define uint unsigned int

  14. uint t_up0 = 1500;                //舵機PWM高電平時間 1000~2000表示1ms到2ms
  15. uint t_up1 = 1500;
  16. uint t_up2 = 1500;
  17. uint t_up3 = 1500;
  18. uint t_up4 = 1500;
  19. uint t_up5 = 1500;
  20. uint t_up6 = 1500;
  21. uint t_up7 = 1500;

  22. uint t0_h;
  23. uint t0_l;


  24. void delayms(uint ms)
  25. {        
  26.         unsigned char a,b,c;
  27.         while(ms--)
  28.         {               
  29.     for(c=1;c>0;c--)
  30.         for(b=142;b>0;b--)
  31.             for(a=2;a>0;a--);
  32.         }
  33. }
  34. void timer_init()
  35. {
  36.         EA = 1;
  37.         ET0 = 1;
  38.         PT0 = 1;
  39.         TMOD = 0x11;
  40.         TH0 = (65536 - t_up0)/256;
  41.         TL0 = (65536 - t_up0)%256;
  42. }

  43. uchar t0_flag = 0;
  44. uint num_max = 65535;        //直接用65535 - t_up 不用變量 - t_up 時,誤差較大,原因暫時不明 【注:65536不能存到uint類型變量中】
  45. uint t_change = 63036;//換路周期2.5ms    8路

  46. uchar error0 = 45;
  47. uchar error1 = 45;
  48. uchar error2 = 52;
  49. uchar error3 = 52;
  50. uchar error4 = 57;
  51. uchar error5 = 57;
  52. uchar error6 = 63;
  53. uchar error7 = 63;
  54. uchar error8 = 70;
  55. uchar error9 = 70;
  56. uchar error10 = 76;
  57. uchar error11 = 76;
  58. uchar error12 = 82;
  59. uchar error13 = 82;
  60. uchar error14 = 88;
  61. uchar error15 = 88;

  62. void timer0() interrupt 1
  63. {
  64.         
  65.         if(t0_flag == 0)
  66.         {
  67.                 PWM0 = 1;
  68.                 TH0 = (num_max - t_up0 + error0)/256; //+?是為了抵消執行語句花的時間
  69.                 TL0 = (num_max - t_up0 + error0)%256;
  70.                
  71.                 t0_flag = 1;
  72.         }
  73.         else if(t0_flag == 1)
  74.         {
  75.                 PWM0 = 0;
  76.                 TH0 = (t_change + t_up0 +error1)/256;
  77.                 TL0 = (t_change + t_up0 +error1)%256;
  78.                
  79.                 t0_flag = 2;
  80.         }
  81.         else if(t0_flag == 2)
  82.         {
  83.                 PWM1 = 1;
  84.                 TH0 = (num_max - t_up1 + error2)/256; //+?是為了抵消執行語句花的時間
  85.                 TL0 = (num_max - t_up1 + error2)%256;
  86.                
  87.                 t0_flag = 3;
  88.         }
  89.         else if(t0_flag == 3)
  90.         {
  91.                 PWM1 = 0;
  92.                 TH0 = (t_change + t_up1 +error3)/256;
  93.                 TL0 = (t_change + t_up1 +error3)%256;
  94.                
  95.                 t0_flag = 4;
  96.         }
  97.         else if(t0_flag == 4)
  98.         {
  99.                 PWM2 = 1;
  100.                 TH0 = (num_max - t_up2 + error4)/256; //+?是為了抵消執行語句花的時間
  101.                 TL0 = (num_max - t_up2 + error4)%256;
  102.                
  103.                 t0_flag = 5;
  104.         }
  105.         else if(t0_flag == 5)
  106.         {
  107.                 PWM2 = 0;
  108.                 TH0 = (t_change + t_up2 +error5)/256;
  109.                 TL0 = (t_change + t_up2 +error5)%256;
  110.                
  111.                 t0_flag = 6;
  112.         }
  113.         else if(t0_flag == 6)
  114.         {
  115.                 PWM3 = 1;
  116.                 TH0 = (num_max - t_up3 + error6)/256; //+?是為了抵消執行語句花的時間
  117.                 TL0 = (num_max - t_up3 + error6)%256;
  118.                
  119.                 t0_flag = 7;
  120.         }
  121.         else if(t0_flag == 7)
  122.         {
  123.                 PWM3 = 0;
  124.                 TH0 = (t_change + t_up3 +error7)/256;
  125.                 TL0 = (t_change + t_up3 +error7)%256;
  126.                
  127.                 t0_flag = 8;
  128.         }
  129.         else if(t0_flag == 8)
  130.         {
  131.                 PWM4 = 1;
  132.                 TH0 = (num_max - t_up4 + error8)/256; //+?是為了抵消執行語句花的時間
  133.                 TL0 = (num_max - t_up4 + error8)%256;
  134.                
  135.                 t0_flag = 9;
  136.         }
  137.         else if(t0_flag == 9)
  138.         {
  139.                 PWM4 = 0;
  140.                 TH0 = (t_change + t_up4 +error9)/256;
  141.                 TL0 = (t_change + t_up4 +error9)%256;
  142.                
  143.                 t0_flag = 10;
  144.         }
  145.         else if(t0_flag == 10)
  146.         {
  147.                 PWM5 = 1;
  148.                 TH0 = (num_max - t_up5 + error10)/256; //+?是為了抵消執行語句花的時間
  149.                 TL0 = (num_max - t_up5 + error10)%256;
  150.                
  151.                 t0_flag = 11;
  152.         }
  153.         else if(t0_flag == 11)
  154.         {
  155.                 PWM5 = 0;
  156.                 TH0 = (t_change + t_up5 + error11)/256;
  157.                 TL0 = (t_change + t_up5 + error11)%256;
  158.                
  159.                 t0_flag = 12;
  160.         }
  161.         else if(t0_flag == 12)
  162.         {
  163.                 PWM6 = 1;
  164.                 TH0 = (num_max - t_up6 + error12)/256; //+?是為了抵消執行語句花的時間
  165.                 TL0 = (num_max - t_up6 + error12)%256;
  166.                
  167.                 t0_flag = 13;
  168.         }
  169.         else if(t0_flag == 13)
  170.         {
  171.                 PWM6 = 0;
  172.                 TH0 = (t_change + t_up6 + error13)/256;
  173.                 TL0 = (t_change + t_up6 + error13)%256;
  174.                
  175.                 t0_flag = 14;
  176.         }
  177.         else if(t0_flag == 14)
  178.         {
  179.                 PWM7 = 1;
  180.                 TH0 = (num_max - t_up7 + error14)/256; //+?是為了抵消執行語句花的時間
  181.                 TL0 = (num_max - t_up7 + error14)%256;
  182.                
  183.                 t0_flag = 15;
  184.         }
  185.         else if(t0_flag == 15)
  186.         {
  187.                 PWM7 = 0;
  188.                 TH0 = (t_change + t_up7 + error15)/256;
  189.                 TL0 = (t_change + t_up7 + error15)%256;
  190.                
  191.                 t0_flag = 0;
  192.         }
  193.         
  194. }
  195. void main()
  196. {
  197.         uint t_while;
  198.         timer_init();
  199.         TR0 = 1;
  200.         while(1)
  201.         {
  202.                
  203.                 if(ADD == 0)
  204.                 {
  205.                         delayms(2);
  206.                         if(ADD == 0)
  207.                         {
  208.                                 if(t_up0 <= 1950)
  209.                                 {
  210.                                         t_up0 = t_up0 + 50;
  211.                                         t_up1 = t_up1 + 50;
  212.                                         t_up2 = t_up2 + 50;
  213.                                         t_up3 = t_up3 + 50;
  214.                                         t_up4 = t_up4 + 50;
  215.                                         t_up5 = t_up5 + 50;
  216.                                         t_up6 = t_up6 + 50;
  217.                                         t_up7 = t_up7 + 50;
  218.                                 }
  219.                                 
  220.                                 t_while = 50000;
  221.                                 while(t_while--)
  222.                                 {
  223.                                         if(ADD == 1)
  224.                                                 break;
  225.                                 }
  226.                                 
  227.                         }
  228.                 }
  229.                
  230.                 if(SUB == 0)
  231.                 {
  232.                         delayms(2);
  233.                         if(SUB == 0)
  234.                         {
  235.                                 if(t_up0 >= 1050)
  236.                                 {
  237.                                         t_up0 = t_up0 - 50;
  238.                                         t_up1 = t_up1 - 50;
  239.                                         t_up2 = t_up2 - 50;
  240.                                         t_up3 = t_up3 - 50;
  241.                                         t_up4 = t_up4 - 50;
  242.                                         t_up5 = t_up5 - 50;
  243.                                         t_up6 = t_up6 - 50;
  244.                                         t_up7 = t_up7 - 50;
  245.                                 }
  246.                                 
  247.                                 t_while = 50000;
  248.                                 while(t_while--)
  249.                                 {
  250.                                         if(SUB == 1)
  251.                                                 break;
  252.                                 }
  253.                                 
  254.                         }
  255.                 }
  256.         }
  257.         
  258. }
復制代碼
全部資料(壓縮包)下載:
原理圖和源代碼.rar (197.68 KB, 下載次數: 261)


舵機原理詳見:http://www.zg4o1577.cn/bbs/dpj-42994-1.html

評分

參與人數 1黑幣 +5 收起 理由
mamba321 + 5

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:207222 發表于 2017-6-5 22:19 | 只看該作者
太好了,有很大幫助
回復

使用道具 舉報

板凳
ID:283690 發表于 2018-2-13 21:31 | 只看該作者
非常感謝!
回復

使用道具 舉報

地板
ID:286354 發表于 2018-2-28 17:18 | 只看該作者
厲害
回復

使用道具 舉報

5#
ID:286354 發表于 2018-2-28 17:24 | 只看該作者
感謝
。。。。。
回復

使用道具 舉報

6#
ID:328368 發表于 2018-5-12 18:50 | 只看該作者
謝謝分享 很有幫助
回復

使用道具 舉報

7#
ID:340262 發表于 2018-6-7 14:46 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

8#
ID:138918 發表于 2018-6-14 18:02 | 只看該作者
好東西 果斷收藏學習
回復

使用道具 舉報

9#
ID:218046 發表于 2018-6-28 10:15 | 只看該作者
感謝樓主,很有幫助
回復

使用道具 舉報

10#
ID:336174 發表于 2018-7-4 22:41 | 只看該作者
你好,我想問一下舵機控制速度就是用的8路舵機PWM控制是嗎
回復

使用道具 舉報

11#
ID:390585 發表于 2018-10-6 11:13 | 只看該作者
請問有沒有stm32版的8路舵機PWM控制電路proteus仿真原理圖和源程序
回復

使用道具 舉報

12#
ID:436320 發表于 2018-11-30 09:51 | 只看該作者
想下載
回復

使用道具 舉報

13#
ID:532697 發表于 2019-5-10 20:34 | 只看該作者
終于找到自己需要的,值得學習
回復

使用道具 舉報

14#
ID:370510 發表于 2019-6-13 16:49 | 只看該作者
首先感謝下樓主大佬,然后想問這個設計中,晶振12Mhz的,電容多大的啊22的還是30的啊
回復

使用道具 舉報

15#
ID:634118 發表于 2020-4-19 17:25 | 只看該作者
非常感謝,幫助很大
回復

使用道具 舉報

16#
ID:656295 發表于 2020-4-22 23:07 | 只看該作者

非常感謝!贊贊贊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级片免费视频 | 久久久久久久成人 | 中文日韩在线视频 | 国产视频久久 | 黄视频免费 | 国产精品免费一区二区 | 久久亚洲欧美日韩精品专区 | 毛片在线看片 | 亚洲日本欧美日韩高观看 | 久久久精品国产 | 99精品国自产在线 | 中文字幕国产一区 | 久久综合久久久 | 国内精品久久精品 | 欧美专区在线 | 超碰精品在线观看 | 99久久久国产精品 | 日韩成人免费视频 | 99久久婷婷国产综合精品首页 | 亚洲一区中文字幕 | 欧美福利视频一区 | 日韩中文字幕免费 | h视频在线免费观看 | 国产精品爱久久久久久久 | 日本久久久久久久久 | 99久久免费精品国产男女高不卡 | 日韩视频中文字幕 | 欧美精品在线播放 | 免费在线一区二区 | 波波电影院一区二区三区 | 欧美国产日韩在线观看成人 | 国产精品www | 亚洲国产精品一区二区三区 | 欧洲av在线| 日日夜夜影院 | 久久国产精品免费一区二区三区 | 亚洲精品1区 | 曰批视频在线观看 | a级黄色片视频 | 亚洲欧美一区二区三区在线 | 亚洲一区二区三区免费视频 |