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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1973|回復: 2
收起左側

單片機控制舵機轉動異常

[復制鏈接]
ID:638967 發表于 2020-12-4 23:38 | 顯示全部樓層 |閱讀模式
我想做個小車,但現在的問題是:舵機本應左中右各轉動一下,現在卻只會居中和右轉,懂的朋友能不能幫我看一下是不是代碼的問題?代碼是網上找的

單片機源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. typedef unsigned char u8;
  4. typedef unsigned int  u16;
  5. typedef unsigned long  u32;
  6. sbit Sevro_moto_pwm = P2^6;           //接舵機信號端輸入PWM信號調節速度
  7. sbit  ECHO= P1^1;                                   //超聲波接口定義           
  8. sbit  TRIG= P1^0;                                   //超聲波接口定義
  9. sbit ENB = P2^5;          //左電機高電平
  10. sbit ENA = P2^4;          //右電機高電平



  11. sbit IN1 = P2^3;
  12. sbit IN2 = P2^2;          //左電機
  13. sbit IN3 = P2^1;
  14. sbit IN4 = P2^0;          //右電機

  15. sbit K1 = P3^2;                  //功能轉換按鍵
  16. sbit K2 = P3^3;                  //加速鍵
  17. sbit K3 = P3^4;          //減速鍵
  18. u8 connt;                          //調速周期
  19. u8 PWM_time;                          //高電平時間
  20. u8 a=0,c=0;                          //標志位
  21. u8 COM;
  22. u8 pwm_val_left  = 0;//變量定義
  23. u8 push_val_left ;//舵機歸中,產生約,1.5MS 信號
  24. u32 S=0;                        //距離變量定義
  25. u32 S1=0;
  26. u32 S2=0;
  27. u32 S3=0;
  28. u32 S4=0;
  29. u16 time=0;                    //時間變量
  30. u16 timer=0;                        //延時基準變量
  31. u8 non=0,t=0;


  32.                                        
  33. /************************************************************************/
  34. void delay(u16 k)          //延時函數
  35. {   
  36.      u16 x,y;
  37.            for(x=0;x<k;x++)
  38.              for(y=0;y<2000;y++);
  39. }
  40. void delay1(u16 j)          //延時函數
  41. {   
  42.      u16 x,y;
  43.            for(x=0;x<j;x++)
  44.              for(y=0;y<120;y++);
  45. }
  46. /************************************************************************/

  47. void keyspeed(void)                                 
  48. {
  49.          
  50.          if(K2==0)                                           // 加速
  51.          {
  52.              delay1(10);
  53.                  if(K2==0)
  54.                  {
  55.                     
  56.                          PWM_time--;
  57.                  }
  58.                  while(!K2);                           //松鍵檢測
  59.          }
  60.          if(K3==0)                                           //減速
  61.          {
  62.              delay1(10);
  63.                  if(K3==0)
  64.                  {
  65.                   
  66.                          PWM_time++;
  67.                  }
  68.                  while(!K3);
  69.          }
  70. }
  71. void SC()                                //剎車
  72. {
  73.     IN1 = 0;   
  74.          IN2 = 0;
  75.         IN3 = 0;
  76.         IN4 = 0;
  77. }
  78. void QJ()                                //前進
  79. {
  80.     IN1 = 1;   
  81.          IN2 = 0;
  82.         IN3 = 1;
  83.         IN4 = 0;
  84. }
  85. void HT()                                //后退
  86. {
  87.     IN1 = 0;   
  88.          IN2 = 1;
  89.         IN3 = 0;
  90.         IN4 = 1;
  91. }
  92. void ZZ1()                                //左大轉
  93. {
  94.     IN1 = 0;   
  95.          IN2 = 1;
  96.         IN3 = 1;
  97.         IN4 = 0;
  98. }

  99. void YZ1()                                //右大轉
  100. {
  101.     IN1 = 1;   
  102.          IN2 = 0;
  103.         IN3 = 0;
  104.         IN4 = 1;
  105. }

  106. /************************************************************************/
  107.      void  StartModule()                       //啟動測距信號
  108.    {         
  109.           TRIG=1;                                       
  110.           _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.           _nop_();
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           _nop_();
  129.           _nop_();
  130.           _nop_();
  131.           TRIG=0;
  132.          
  133.    }

  134. void InitUART(void)                 //串口中斷初始化函數
  135. {
  136.     SCON=0x50;                        //設置為工作方式1
  137.         TMOD=0x20;                        //設置計數器工作方式2
  138.         PCON=0x00;                        //波特率不加倍
  139.         TH1=0xfd;                                //計數器初始值設置,注意波特率是9600的
  140.         TL1=0xfd;
  141.         ES=1;                                                //打開接收中斷
  142.         EA=1;                                                //打開總中斷
  143.         TR1=1;                                        //打開計數器
  144.         
  145. }
  146. /***************************************************/
  147.           void Conut(void)                   //計算距離
  148.         {
  149.           while(!ECHO);                       //當RX為零時等待
  150.           TR1=1;                               //開啟計數
  151.           while(ECHO);                           //當RX為1計數并等待
  152.           TR1=0;                                   //關閉計數
  153.           time=TH1*256+TL1;                   //讀取脈寬長度
  154.           TH1=0;
  155.           TL1=0;
  156.           S=(time*1.7)/100;        //算出來是CM
  157.          
  158.         }

  159. /************************************************************************/
  160. void  COMM( void )                       
  161.   {
  162.                
  163.                   push_val_left=23;          //舵機向左轉90度
  164.                   timer=0;
  165.                   while(timer<=4000); //延時400MS讓舵機轉到其位置                 4000
  166.                   StartModule();          //啟動超聲波測距
  167.           Conut();                           //計算距離
  168.                   S2=S;
  169.   
  170.                   push_val_left=5;          //舵機向右轉90度
  171.                   timer=0;
  172.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  173.                   StartModule();          //啟動超聲波測距
  174.           Conut();                          //計算距離
  175.                   S4=S;        
  176.                            
  177.           push_val_left=14;          //舵機歸中
  178.                   timer=0;
  179.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  180.           StartModule();          //啟動超聲波測距
  181.           Conut();                          //計算距離
  182.                   S1=S;

  183.           if((S2<20)||(S4<20)||(S1<20)) //只要左右各有距離小于,20CM小車后退
  184.                   {
  185.                   HT();                   //后退
  186.                   timer=0;
  187.                   while(timer<=4000);
  188.                   }
  189.                   if((S2<20)&&(S4<20)&&(S1<20)) //只要左右各有距離小于,20CM小車后退
  190.                   {
  191.                   HT();                   //后退
  192.                   timer=0;
  193.                   while(timer<=4000);
  194.                   }
  195.                   
  196.                   if(S2>S4)                 
  197.                      {
  198.                                 ZZ1();          //車的左邊比車的右邊距離小        右轉        
  199.                         timer=0;
  200.                         while(timer<=4000);
  201.                      }                                      
  202.                        else
  203.                      {
  204.                        YZ1();                //車的左邊比車的右邊距離大        左轉
  205.                        timer=0;
  206.                        while(timer<=4000);
  207.                      }
  208. }

  209. /************************************************************************/
  210. /*                    PWM調制舵機轉速                                   */
  211. /************************************************************************/
  212. /*                    舵機調速                                        */
  213. /*調節push_val_left的值改變電機轉速,占空比            */
  214. void pwm_Servomoto(void)
  215. {  

  216.     if(pwm_val_left <= push_val_left)
  217.                Sevro_moto_pwm=1;
  218.         else
  219.                Sevro_moto_pwm=0;
  220.         if(pwm_val_left>=100)
  221.         pwm_val_left=0;

  222. }

  223. void keychange()                                  //按鈕控制功能轉換
  224. {
  225.      COM=0;
  226.          if(K1==0)
  227.          {
  228.              delay1(10);
  229.                  if(K1==0)
  230.                  {
  231.                      COM++;
  232.                  }
  233.                  while(!K1);   
  234.          }
  235.          if(COM==4)
  236.          COM=0;

  237. }


  238. /***************************************************/
  239. ///*TIMER1中斷服務子函數產生PWM信號*/
  240. void time0()interrupt 1   
  241. {        
  242.      TH0=(65536-100)/256;          //100US定時
  243.          TL0=(65536-100)%256;
  244.          timer++;                                  //定時器100US為準。在這個基礎上延時
  245.          pwm_val_left++;
  246.          pwm_Servomoto();

  247.          t++;
  248.          if(t==5)                                                 //PWM調制左右電機速度   
  249.          {
  250.              t=0;
  251.                  non++;
  252.          }
  253.          if( non == PWM_time )                                 
  254.     {
  255.              ENA = 1;
  256.          ENB = 1;
  257.     }
  258.     if( non == connt )
  259.     {
  260.              non = 0;
  261.          if( PWM_time != 0)
  262.                 {
  263.              ENA = 0;
  264.              ENB = 0;
  265.                 }







  266.     }
  267. }

  268. void lin()                                                //避障功能
  269. {  
  270.       if(timer>=1000)          //100MS檢測啟動檢測一次         1000
  271.            {
  272.                timer=0;
  273.                    StartModule(); //啟動檢測
  274.            Conut();                  //計算距離
  275.            if(S<=25)                  //距離小于30CM
  276.                    {
  277.                        SC();          //小車停止
  278.                        COMM();                   //方向函數
  279.                    }
  280.                    else
  281.                    if(S>25)                  //距離大于,30CM往前走
  282.                    QJ();
  283.                                     
  284.            }                                             
  285.          
  286. }
  287. /***************************************************/
  288. ///*TIMER0中斷服務子函數產生PWM信號*/
  289.          void timer0()interrupt 3  
  290. {        
  291.            
  292. }

  293. /***************************************************/
  294. void UARTInterrupt(void) interrupt 4                         //串口中斷函數
  295. {   
  296.     unsigned char com;
  297.     if(a==1)                                                                //判斷能否執行
  298.         {
  299.         if(RI==1)        
  300.             com = SBUF;                   //暫存接收到的數據
  301.             RI=0;
  302.         }

  303.          switch(com)                                                 //接收到字符并要執行的功能
  304.         {
  305.             case 0: QJ();break;
  306.             case 1: SC();break;
  307.             case 2: ZZ1();break;
  308.             case 3: YZ1();break;
  309.                 case 4: HT();break;

  310.         }                        
  311.         
  312. }

  313. void main(void)
  314. {
  315.            
  316.     IP=0x10;           //外部中斷0設置為高優先級中斷
  317.         TMOD=0X11;
  318.         TH0=(65536-100)/256;          //100US定時
  319.         TL0=(65536-100)%256;
  320.         TR0= 1;
  321.         ET0= 1;
  322.         EA = 1;
  323.         connt = 20;                                                 //PWM的一個周期
  324.     PWM_time = 16;                                         //調速,數值越大速度越慢
  325.         delay(100);
  326.         push_val_left=14;
  327.            
  328.         while(1)                       /*無限循環*/
  329.         {
  330.         
  331.          
  332.          
  333.            keyspeed();
  334.          // keychange();
  335.           switch(COM)                                                 //接收到字符并要執行的功能
  336.         {            
  337.             case 0:TH1=0;TL1=0;ET1=1;lin();break;                                
  338.             case 1:SC();InitUART();ET1= 0;a=1;while(1);break;
  339.                 default:break;
  340.         }                                                         
  341.         }  
  342. }
復制代碼

友能不能幫我看一下是不是代碼的問題?代碼是網上找的

1.gif

代碼.zip

42.14 KB, 下載次數: 6

回復

使用道具 舉報

ID:1001952 發表于 2022-3-8 17:38 | 顯示全部樓層
樓主找到解決辦法了么?我也遇到了這個問題
回復

使用道具 舉報

ID:844772 發表于 2022-3-9 10:12 | 顯示全部樓層
dsrdsh 發表于 2022-3-8 17:38
樓主找到解決辦法了么?我也遇到了這個問題

他是代碼問題,void time0()interrupt 1 寫的太長了,設定的100微秒中斷,無法完成。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区在线视频 | 亚洲欧美中文日韩在线v日本 | 成人免费一区二区三区视频网站 | 国产精品毛片无码 | 99av成人精品国语自产拍 | 免费看91| 三区在线 | 欧美国产日韩一区二区三区 | 久久伊人精品 | 日韩成人在线网址 | 99av成人精品国语自产拍 | 亚洲一区二区在线视频 | 久久精品综合 | 日本一区二区三区免费观看 | 国产一区二区三区 | 国产成人99久久亚洲综合精品 | 亚洲精品国产电影 | 91视频导航 | 久久五月婷 | 国产综合久久 | 日韩在线视频精品 | 日本黄色免费片 | 日韩成人av在线 | av综合站 | 中文字幕久久久 | 国产精品毛片一区二区三区 | 韩日免费视频 | 天天曰天天曰 | 黄色一级毛片 | 欧美在线资源 | 久久激情视频 | av片毛片 | 伊人精品视频 | 日韩精品视频在线 | 精品在线播放 | 国产成人精品一区二区三区视频 | 国产免费福利小视频 | 国产精品激情 | www.日韩系列| 亚洲一区视频在线 | 国产美女精品视频 |