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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

怎樣在這個超聲波避障程序里添加pwm函數 想實現控制小車的速度

[復制鏈接]
跳轉到指定樓層
樓主
ID:449368 發表于 2018-12-21 20:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 褲衩青年 于 2018-12-21 20:50 編輯

/****************************************************************************
         硬件連接
        ****************************************************************************/

        #include<AT89x51.H>
        #include <intrins.h>

        #define Sevro_moto_pwm     P2_7           //接舵機信號端輸入PWM信號調節速度

        #define  ECHO  P2_4                                   //超聲波接口定義
        #define  TRIG  P2_5                                   //超聲波接口定義
   

    #define Left_moto_go      {P1_0=1,P1_1=0;}                   //左電機向前走
        #define Left_moto_back    {P1_0=0,P1_1=1;}                         //左電機向后轉
        #define Left_moto_Stop    {P1_0=0,P1_1=0;}                 //左電機停轉                     
        #define Right_moto_go     {P1_2=1,P1_3=0;}                      //右電機向前走
        #define Right_moto_back   {P1_2=0,P1_3=1;}                     //右電機向后走
        #define Right_moto_Stop   {P1_2=0,P1_3=0;}                    //右電機停轉   

   

        unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
        unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
        unsigned char disbuff[4]          ={ 0,0,0,0,};
    unsigned char posit=0;

           unsigned char pwm_val_left  = 0;//變量定義
        unsigned char push_val_left =14;//舵機歸中,產生約,1.5MS 信號
    unsigned long S=0;
        unsigned long S1=0;
        unsigned long S2=0;
        unsigned long S3=0;
        unsigned long S4=0;
        unsigned int  time=0;                    //時間變量
        unsigned int  timer=0;                        //延時基準變量
        unsigned char timer1=0;                        //掃描時間變量                                       
/************************************************************************/
                 void delay(unsigned int k)          //延時函數
{   
     unsigned int x,y;
           for(x=0;x<k;x++)
             for(y=0;y<2000;y++);
}
/************************************************************************/
   /* void Display(void)                                  //掃描數碼管
        {
         if(posit==0)
         {P0=(discode[disbuff[posit]])&0x7f;}//產生點
         else
         {P0=discode[disbuff[posit]];}

          if(posit==0)
         { P2_1=0;P2_2=1;P2_3=1;}
          if(posit==1)
          {P2_1=1;P2_2=0;P2_3=1;}
          if(posit==2)
          {P2_1=1;P2_2=1;P2_3=0;}
          if(++posit>=3)
          posit=0;
        }*/
/************************************************************************/
     void  StartModule()                       //啟動測距信號
   {
          TRIG=1;                                       
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TRIG=0;
   }
/***************************************************/
          void Conut(void)                   //計算距離
        {
          while(!ECHO);                       //當RX為零時等待
          TR0=1;                               //開啟計數
          while(ECHO);                           //當RX為1計數并等待
          TR0=0;                                   //關閉計數
          time=TH0*256+TL0;                   //讀取脈寬長度
          TH0=0;
          TL0=0;
          S=(time*1.7)/100;        //算出來是CM
          disbuff[0]=S%1000/100;   //更新顯示
          disbuff[1]=S%1000%100/10;
          disbuff[2]=S%1000%10 %10;
        }
/************************************************************************/
//前速前進
     void  run(void)
{                                   
         Left_moto_go ;     //左電機往前走
         Right_moto_go ;    //右電機往前走
}
/************************************************************************/
//前速后退
     void  backrun(void)
{
         Left_moto_back ;   //左電機往后走
         Right_moto_back ;  //右電機往后走
}
/************************************************************************/
//左轉
     void  leftrun(void)
{
         Left_moto_back ;   //左電機往后走
          Right_moto_go ;   //右電機往前走
}
/************************************************************************/
//右轉
     void  rightrun(void)
{
         Left_moto_go ;     //左電機往前走
         Right_moto_back ;  //右電機往后走
}
/************************************************************************/
//STOP
     void  stoprun(void)
{
         Left_moto_Stop ;   //左電機停走
         Right_moto_Stop ;  //右電機停走
}
/************************************************************************/
void  COMM( void )                       
  {
               
                 
                  push_val_left=5;          //舵機向左轉90度
                  timer=0;
                  while(timer<=4000); //延時400MS讓舵機轉到其位置
                  StartModule();          //啟動超聲波測距
          Conut();                           //計算距離
                  S2=S;  
  
                  push_val_left=23;          //舵機向右轉90度
                  timer=0;
                  while(timer<=4000); //延時400MS讓舵機轉到其位置
                  StartModule();          //啟動超聲波測距
          Conut();                          //計算距離
                  S4=S;         
        

                  push_val_left=14;          //舵機歸中
                  timer=0;
                  while(timer<=4000); //延時400MS讓舵機轉到其位置

                  StartModule();          //啟動超聲波測距
          Conut();                          //計算距離
                  S1=S;         

          if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
                  {
                  backrun();                   //后退
                  timer=0;
                  while(timer<=4000);
                  }
                  
                  if(S2>S4)                 
                     {
                                rightrun();          //車的左邊比車的右邊距離小        右轉        
                        timer=0;
                        while(timer<=4000);
                     }                                      
                       else
                     {
                       leftrun();                //車的左邊比車的右邊距離大        左轉
                       timer=0;
                       while(timer<=4000);
                     }
                                             

}

/************************************************************************/
/*                    PWM調制電機轉速                                   */
/************************************************************************/
/*                    左電機調速                                        */
/*調節push_val_left的值改變電機轉速,占空比            */
                void pwm_Servomoto(void)
{  

    if(pwm_val_left<=push_val_left)
               Sevro_moto_pwm=1;
        else
               Sevro_moto_pwm=0;
        if(pwm_val_left>=200)
        pwm_val_left=0;

}
/***************************************************/
///*TIMER1中斷服務子函數產生PWM信號*/
         void time1()interrupt 3   using 2
{        
     TH1=(65536-100)/256;          //100US定時
         TL1=(65536-100)%256;
         timer++;                                  //定時器100US為準。在這個基礎上延時
         pwm_val_left++;
         pwm_Servomoto();

         timer1++;                                 //2MS掃一次數碼管
         if(timer1>=20)
         {
         timer1=0;
         Display();        
         }
}
/***************************************************/
///*TIMER0中斷服務子函數產生PWM信號*/
         void timer0()interrupt 1   using 0
{        
           
}

/***************************************************/

        void main(void)
{

        TMOD=0X11;
        TH1=(65536-100)/256;          //100US定時
        TL1=(65536-100)%256;
        TH0=0;
        TL0=0;  
        TR1= 1;
        ET1= 1;
        ET0= 1;
        EA = 1;

        delay(100);
    push_val_left=14;          //舵機歸中


        while(1)                       /*無限循環*/
        {

         if(timer>=1000)          //100MS檢測啟動檢測一次
           {
               timer=0;
                   StartModule(); //啟動檢測
           Conut();                  //計算距離
           if(S<20)                  //距離小于20CM
                   {
                   stoprun();          //小車停止
                   COMM();                   //方向函數
                   }
                   else
                   if(S>30)                  //距離大于,30CM往前走
                   run();
           }

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

使用道具 舉報

沙發
ID:449368 發表于 2018-12-21 20:52 | 只看該作者
在線等大佬   急求 解決方法
回復

使用道具 舉報

板凳
ID:169944 發表于 2018-12-22 11:01 | 只看該作者
在中斷里邊加就行了,避障方式也沒說,而且你寫的直接給電機高低電平,也沒用pwm,重新寫個函數,對電機的控制引腳高低電平用pwm控制,來控制速度
回復

使用道具 舉報

地板
ID:169944 發表于 2018-12-22 11:22 | 只看該作者
counter++;
if(counter >= 255) counter = 0;
    if(counter >= PWM_0) Left_moto_go; else Left_moto_Stop
    if(counter >= PWM_1) Right_moto_go; else Right_moto_Stop
把這個放中斷里,修改PWM0和PWM1的值來改變速度,直行就用這個就行,你寫的那個函數是全速跑的,理論上,可以通過改變PWm的值實現直行,停止,轉彎,這個需要你實際測。
   
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频精品在线 | 精品一区二区三区四区视频 | 中文字幕一区二区在线观看 | 超碰在线免费av | 国产精品美女久久久久久免费 | 天天综合成人网 | 亚洲一区免费在线 | 国产精品久久久久久久久久久久冷 | 美女逼网站 | 欧美天堂在线观看 | 精品三区| 日韩免费视频一区二区 | 欧美一区二区三区久久精品 | 奇米av| 最新国产在线 | 美国一级黄色片 | 日本不卡一区 | 成人精品鲁一区一区二区 | 久久久人| 99亚洲精品 | 欧美a在线看 | 九九99精品 | 久久99精品视频 | 精久久久 | 日本在线中文 | 美女视频h | 亚洲久草视频 | 日韩亚洲一区二区 | 亚洲一区二区在线 | 九九热在线视频免费观看 | 国产资源在线观看 | 视频在线一区二区 | 久久一久久 | 成人精品一区二区三区中文字幕 | 欧美精品一区二区三区蜜桃视频 | 国产精品毛片一区二区三区 | 欧美日韩成人在线观看 | 北条麻妃99精品青青久久 | 日韩成年人视频在线 | 亚洲手机视频在线 | 国产精品久久在线观看 |