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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10450|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)8路舵機(jī)PWM控制電路和源代碼 得不錯(cuò)!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
                                                          今天在網(wǎng)上發(fā)現(xiàn)8路舵機(jī)PWM控制電路和源代碼我覺得不錯(cuò)!控制信號(hào)由接收機(jī)的通道進(jìn)入信號(hào)調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個(gè)基準(zhǔn)電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號(hào),將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負(fù)輸出到電機(jī)驅(qū)動(dòng)芯片決定電機(jī)的正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過級(jí)聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn),使得電壓差為0,電機(jī)停止轉(zhuǎn)動(dòng)。舵機(jī)的控制一般需要一個(gè)20ms左右的時(shí)基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內(nèi)的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:

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

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

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

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

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

此電路設(shè)計(jì)51單片機(jī)控制PWM信號(hào),輸送到兩個(gè)按鍵開關(guān),從而來控制舵機(jī)的正轉(zhuǎn)和反轉(zhuǎn),轉(zhuǎn)動(dòng)角度范圍-90度到90度。

舵機(jī)的追隨特性:

假設(shè)現(xiàn)在舵機(jī)穩(wěn)定在A點(diǎn),這時(shí)候CPU發(fā)出一個(gè)PWM信號(hào),舵機(jī)全速由A點(diǎn)轉(zhuǎn)向B點(diǎn),在這個(gè)過程中需要一段時(shí)間,舵機(jī)才能運(yùn)動(dòng)到B點(diǎn)。圖中所示。
保持時(shí)間為Tw

當(dāng)Tw≥△T時(shí),舵機(jī)能夠到達(dá)目標(biāo),并有剩余時(shí)間;

當(dāng)Tw≤△T時(shí),舵機(jī)不能到達(dá)目標(biāo);

理論上:當(dāng)Tw=△T時(shí),系統(tǒng)最連貫,而且舵機(jī)運(yùn)動(dòng)的最快。

實(shí)際過程中w不盡相同,連貫運(yùn)動(dòng)時(shí)的極限△T比較難以計(jì)算出來。

假如我們的舵機(jī)1DIV =8us,當(dāng)PWM信號(hào)以最小變化量即(1DIV=8us)依次變化時(shí),舵機(jī)的分辨率最高,但是速度會(huì)減慢。



仿真:


源代碼:
  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;                //舵機(jī)PWM高電平時(shí)間 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 時(shí),誤差較大,原因暫時(shí)不明 【注: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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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; //+?是為了抵消執(zhí)行語句花的時(shí)間
  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. …………余下代碼請下載附件…………
復(fù)制代碼



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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

像是KEIL軟件,哪個(gè)版本不清楚
回復(fù)

使用道具 舉報(bào)

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

proteus ?
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

Protues下的isis
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表