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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機8路舵機PWM控制電路和源代碼 得不錯!

[復制鏈接]
跳轉到指定樓層
樓主
                                                          今天在網上發現8路舵機PWM控制電路和源代碼我覺得不錯!控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為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)依次變化時,舵機的分辨率最高,但是速度會減慢。



仿真:


源代碼:
  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. …………余下代碼請下載附件…………
復制代碼



下載:
8路舵機PWM控制電路和源代碼.zip (341.88 KB, 下載次數: 107)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:340880 發表于 2018-5-30 02:42 | 只看該作者
哪位大神知道這是用什么仿真的
回復

使用道具 舉報

板凳
ID:344400 發表于 2018-6-4 09:29 | 只看該作者
渣渣新 發表于 2018-5-30 02:42
哪位大神知道這是用什么仿真的

像是KEIL軟件,哪個版本不清楚
回復

使用道具 舉報

地板
ID:345120 發表于 2018-6-5 17:27 來自觸屏版 | 只看該作者
渣渣新 發表于 2018-5-30 02:42
哪位大神知道這是用什么仿真的

proteus ?
回復

使用道具 舉報

5#
ID:230020 發表于 2018-6-5 18:40 | 只看該作者
必須頂啊!
回復

使用道具 舉報

6#
ID:229106 發表于 2018-6-8 19:02 | 只看該作者
渣渣新 發表于 2018-5-30 02:42
哪位大神知道這是用什么仿真的

Protues下的isis
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成都精品91一区二区三 | 91精品国产91久久久 | av在线二区| 色欧美综合 | 欧美日韩一 | 国产精品中文字幕在线播放 | 日韩欧美国产精品一区二区 | 天天操天天拍 | 国产精品久久久久久影视 | 日韩一级电影免费观看 | 黄网站在线观看 | 99精品欧美一区二区三区 | 成人福利在线视频 | 日日精品 | 日韩精品久久一区 | 久久中文免费视频 | 精品国产乱码久久久久久1区2区 | 国产高清一区二区三区 | 日韩91| 日本成人在线播放 | 成人欧美一区二区三区视频xxx | 日本三级网址 | 午夜精品一区二区三区在线视频 | 91资源在线 | 日韩欧美在线观看视频 | 一区二区三区日本 | 91人人视频在线观看 | 99久久免费精品国产免费高清 | 中文字幕乱码一区二区三区 | 一区二区三区四区不卡 | www.日日夜夜 | 午夜无码国产理论在线 | 日韩视频在线观看中文字幕 | 免费人成激情视频在线观看冫 | av中文字幕在线 | av一区二区三区在线观看 | 欧一区| 国产一区二区精品在线 | 国产美女高潮 | 红色av社区 | 国产精品极品美女在线观看免费 |