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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機黑線尋跡小車程序,如何快速識別黑線,無延遲切換轉彎?

[復制鏈接]
跳轉到指定樓層
樓主
ID:582255 發表于 2022-4-8 08:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
程序功能:紅外尋跡小車,跑道為黑色,其他地方為白色。左右兩個紅外傳感器,當傳感器在黑線上時,沒有反射光進入傳感器,判斷壓線,左邊壓線就左轉,反之右轉。
實際效果:小車右邊檢測到黑線后不能馬上右轉,而是前進一下,前進后就脫離了跑道,不能再尋跡。
用KEIL單步調試時發現,如果直行時遇到了左右傳感器檢測到信號后,沒有馬上轉彎,而是反復執行了上一個狀態的前進函數,這就導致了在尋跡時不能馬上轉彎。請問一下如何快速檢測、快速切換前進狀態?主函數在下面

單片機源程序如下:
  1. #include<AT89X52.H>                  //包含51單片機頭文件,內部有各種寄存器定義
  2. #include<ZY-4WD_PWM.H>                  //包含IO口定義等函數

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. sbit pwm=P1^6;//PWM信號輸出口  舵機信號輸出口


  6. unsigned char n,count,angle;//距離標志位,0.5ms次數,角度標識

  7. uchar i;
  8. void DelayUs2x(uchar t)
  9. {   
  10.         while(--t);
  11. }
  12. void DelayMs(uchar t)
  13. {
  14.         while(t--)
  15.         {
  16.             //大致延時1mS        
  17.                 DelayUs2x(245);
  18.             DelayUs2x(245);
  19.         }
  20. }



  21. /*------------------------------------------------
  22.                     定時器01初始化
  23. //定時器1工作方式1 (舵機 ),定時器0 電機PWM調速控制信號
  24. ------------------------------------------------*/


  25. void Time1_Int() interrupt 3//舵機
  26. {
  27.         TH1=0xfe;         //0.5ms初值
  28.         TL1=0x33;         
  29.         if(count<angle)//判斷0.5ms次數是否小于角度標識
  30.     pwm=1;//確實小于,pwm輸出高電平
  31.     else
  32.     pwm=0;//大于則輸出低電平
  33.         count++;//0.5ms次數加1
  34.         count=count%40;//次數始終保持為200即保持周期為20ms
  35.         //if(count>=20)count=0;
  36. }


  37. //主函數
  38.         void main(void)
  39. {        

  40.           angle=3;//舵機居中
  41.     count=0;
  42.     P0=0XF0;   //關電機        


  43. /*        
  44. B:                for(i=0;i<50;i++) //判斷S4是否按下
  45.                 {
  46.                    delay(1);        //1ms內判斷50次,如果其中有一次被判斷到K4沒按下,便重新檢測
  47.                    if(P3_2!=0)//當S4按下時,啟動小車前進.

  48.                    goto B; //跳轉到標號B,重新檢測  
  49.                 }
  50. */
  51.         //本實驗學習的知識蜂鳴器,注意要在HJ-4WD頭文件里定義IO口
  52.                      BUZZ=0;        //50次檢測K4確認是按下之后,蜂鳴器發出“滴”聲響,然后啟動小車。
  53.                delay(50);
  54.                BUZZ=1;//響50ms后關閉蜂鳴器

  55.                          TMOD=0X11;
  56.                 TH0= 0XFc;                  //1ms定時
  57.                  TL0= 0X66;
  58.                    TR0= 1;
  59.                 ET0= 1;
  60.                 EA = 1;                           //開總中斷

  61.                 TH1=0xfe;        //0.5ms
  62.                 TL1=0x33;         
  63.                         ET1=1;
  64.                         TR1= 1;
  65.         


  66.         while(1)        //無限循環
  67.         {
  68. //有信號為0  沒有信號為1
  69.                  
  70.          
  71.                          //有信號為0  沒有信號為1

  72.               if(Left_1_led==1&&Right_1_led==1)

  73.                           {
  74.                        run();
  75.                       angle=3 ;
  76.                       } //調用前進函數

  77.                           else
  78.                          {                          
  79.                                                if(Left_1_led==1 && Right_1_led==0)            //左邊檢測到黑線
  80.                                   {
  81.             angle=4;
  82.                                           leftrun();                  //調用小車左轉  函數
  83.                                           for(time=0;time<100;time++);

  84.                              }
  85.                            
  86.                                                              if(Left_1_led==0 && Right_1_led==1)                //右邊檢測到黑線
  87.                                   {         
  88.                                       angle=2;
  89.                                                   rightrun();                   //調用小車右轉        函數
  90.               for(time=0;time<100;time++);
  91.                                   }


  92.                         }         
  93.          
  94.                                  
  95.          }
  96. }
復制代碼

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

使用道具 舉報

沙發
ID:855733 發表于 2022-4-8 09:19 | 只看該作者
調一下傳感器的靈敏度?試試用switch case?
回復

使用道具 舉報

板凳
ID:582255 發表于 2022-4-8 09:27 | 只看該作者
頭文件:
#ifndef _LED_H_
#define _LED_H_


    //定義小車驅動模塊輸入IO口
        sbit IN1=P0^0;
        sbit IN2=P0^1;
        sbit IN3=P0^2;
        sbit IN4=P0^3;
        sbit EN1=P0^4;
        sbit EN2=P0^5;
       

        /***蜂鳴器接線定義*****/
    sbit BUZZ=P0^6;

    #define Left_1_led      P3_5         // 左傳感器      
        #define Right_1_led       P3_6         //右傳感器  
       
        #define PWMSD            5         ////速度調節變量 0-20。。。0最小,20最大
            
        #define Left_moto_pwm          P0_4         //PWM信號端 ,EN1
        #define Right_moto_pwm          P0_5          //PWM信號端,EN2


        #define Left_moto_go      {P0_0=1,P0_1=0;}  //左電機向前走
        #define Left_moto_back    {P0_0=0,P0_1=1;}         //左邊電機向后轉
        #define Left_moto_Stop    {P0_4=0;}  //左邊電機停轉                     
        #define Right_moto_go     {P0_2=1,P0_3=0;}        //右邊電機向前走
        #define Right_moto_back   {P0_2=0,P0_3=1;}        //右邊電機向后走
        #define Right_moto_Stop   {P0_5=0;}        //右邊電機停轉  

        unsigned char pwm_val_left  =0;//變量定義
        unsigned char push_val_left =0;// 左電機占空比N/20
        unsigned char pwm_val_right =0;
        unsigned char push_val_right=0;// 右電機占空比N/20
        bit Right_moto_stop=1;
        bit Left_moto_stop =1;
        unsigned  int  time=0;
   
/************************************************************************/       
//延時函數       
   void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前進
     void  run(void)
{
     push_val_left=PWMSD;         //速度調節變量 0-20。。。0最小,20最大
         push_val_right=PWMSD;
         Left_moto_go ;   //左電機往前走
         Right_moto_go ;  //右電機往前走
}
    void stop(void)
                {
                                                Left_moto_Stop;
                                          Right_moto_Stop;
                }

//左轉
     void  leftrun(void)
{         
   push_val_left=PWMSD;
         push_val_right=PWMSD;
         Right_moto_go ;  //右電機往前走
     Left_moto_back   ;  //左電機后走
}

//右轉
     void  rightrun(void)
{
         push_val_left=PWMSD;
         push_val_right=PWMSD;
     Left_moto_go  ;   //左電機往前走
         Right_moto_back    ;  //右電機往后走       
}


/************************************************************************/
/*                    PWM調制電機轉速                                   */
/************************************************************************/
/*                    左電機調速                                        */
/*調節push_val_left的值改變電機轉速,占空比            */
                void pwm_out_left_moto(void)
{  
  if(Left_moto_stop)
        {               
    if(pwm_val_left<=push_val_left)
               {
                     Left_moto_pwm=1;

                   }
        else
               {
                 Left_moto_pwm=0;

                   }
        if(pwm_val_left>=20)
               pwm_val_left=0;
}
   else   
          {
           Left_moto_pwm=0;

                  }
}
/******************************************************************/
/*                    右電機調速                                  */  
   void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
              {
               Right_moto_pwm=1;

                   }
        else
              {
                   Right_moto_pwm=0;

                  }
        if(pwm_val_right>=20)
               pwm_val_right=0;
   }
   else   
          {
           Right_moto_pwm=0;

              }
}
      
/***************************************************/
///*TIMER0中斷服務子函數產生PWM信號*/
        void timer0()interrupt 1   using 2
{
     TH0=0XFc;          //1ms定時
         TL0=0X66;
         time++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}       

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

#endif
回復

使用道具 舉報

地板
ID:844772 發表于 2022-4-8 11:17 | 只看該作者
我一般根據情況使用下面方法:1、減慢車速,足夠慢,就不會錯過;2、加延時,其實你已經加了,就是加的太少了就是這句,for(time=0;time<100;time++);多加點,這個必須要調試的,而且跟電量有關,最好你能檢測電源電壓做個變量加到延時中。當然這種硬延時不大好,我喜歡加標志變量延時的,不影響路線檢測;3、改控制策略,比如左壓線后,要左轉到右壓線為止(記得要去掉上面的延時)。或者左壓線左轉到再次左壓線等這個也要測一下的。4、我覺得你最應該的是多上幾個紅外,使用pid控制,就能跑得飛快,要不搞舵機干啥。
回復

使用道具 舉報

5#
ID:582255 發表于 2022-4-8 11:25 | 只看該作者
感謝PID控制是個好方法啊。
如果我把速度調慢,怎么調啊?調pwm=P1^6這個的占空比嗎
回復

使用道具 舉報

6#
ID:844772 發表于 2022-4-8 12:08 | 只看該作者
aktuan007 發表于 2022-4-8 11:25
感謝PID控制是個好方法啊。
如果我把速度調慢,怎么調啊?調pwm=P1^6這個的占空比嗎

你那個顯然是舵機啊,你程序不全,感覺是count=count%40;在調占空比。看你的提問,覺得你先加延時,去試車比較好。
回復

使用道具 舉報

7#
ID:161164 發表于 2022-4-8 13:12 | 只看該作者
if(Left_1_led==1 && Right_1_led==0)            //左邊檢測到黑線
0=壓線
Right_1_led==0 是右壓線吧?

舵機是干什么用的?
中斷內time為什么要++?
回復

使用道具 舉報

8#
ID:123289 發表于 2022-4-8 13:44 | 只看該作者
比較一下:
你在黑夜開近光燈與開遠光燈拐彎的情形,你遠光燈會好一些!速度慢會好一些!
其實關鍵點是:有足夠的預判時間!
假設從你決定拐彎開始到完成拐彎,需要兩秒鐘的時間。那么你的預判時間就是兩秒!
所以,完成命題的需求是,傳感器必須在2秒之前得到拐彎信息!
大多數人認為拐彎需要減速,看上去是對的。其實關鍵點是:以低于最小的安全拐彎速度拐彎就可以了。
你要注意以下幾點:
1、最小拐彎速度。(道路環境條件相關)
2、完成拐彎的時間。(以當前速度、制動能力相關)
3、小車行進的速度。(與在何處開始起動拐彎程序相關)
4、依據1、2、3、計算出開始拐彎動作的起點在哪里。這個點,距拐彎點的距離,就是小車傳感器必須能探知的點(提前預判)!
余下的事,可參考其它人支著。
回復

使用道具 舉報

9#
ID:844772 發表于 2022-4-8 14:49 | 只看該作者
aktuan007 發表于 2022-4-8 11:25
感謝PID控制是個好方法啊。
如果我把速度調慢,怎么調啊?調pwm=P1^6這個的占空比嗎

之前沒看到你后來發的程序。 你已經定義速度了啊,#define PWMSD            5         ////速度調節變量 0-20。。。0最小,20最大
改一下就行了,但這個不是線性調整的,太小估計就走不動了。我覺得你程序很奇怪,明明用了舵機轉彎,為啥還要用電機差動轉彎呢,電機轉彎效率低啊。還有中斷內的time要刪掉,你應該增加主程序for循環產生的延時才對。你用的是什么底盤,配置的不太合理啊。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级视频 | 中文字幕亚洲一区二区三区 | 91麻豆精品国产91久久久久久 | 久久大香 | 国产精品久久久久久吹潮日韩动画 | 一区二区三区精品视频 | 亚洲精品日韩欧美 | 亚洲成人一区二区 | 亚洲欧美激情精品一区二区 | 伊人网站在线 | 中国美女撒尿txxxxx视频 | 国产一区二区三区四区五区加勒比 | 国产精品1区| 久久综合欧美 | 久久爱一区 | 国产成人在线视频播放 | 久久i| 伊人网一区 | 中文字幕国产精品 | 免费一级大片 | 蜜臀网| 亚洲成人一区 | 成人夜晚看av | www亚洲免费国内精品 | 一区二区三区欧美在线 | 日韩在线免费播放 | 国产高清在线 | 99免费精品视频 | 91九色porny首页最多播放 | 久久久久久国产精品mv | 亚洲a网 | 久久久久久国产精品免费免费 | 国产精品视频一 | 日韩a在线| 国产精品一区二区免费 | 一区二区三区视频在线观看 | 亚洲日本中文字幕在线 | 美女天堂在线 | 久久久久国产精品一区 | 天天综合操 | 亚洲精品乱码久久久久久按摩观 |