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

標題: 如何讓超聲波舵機避障小車更加精準 附單片機代碼 [打印本頁]

作者: 放眼天下    時間: 2019-4-25 11:19
標題: 如何讓超聲波舵機避障小車更加精準 附單片機代碼
  就這一段時間,做了一個超聲波避障的小車,單獨的超聲波,和舵機程序測試的時候都很準確,但是合在一起的時候,就讓避障變得不太靈敏,可能是代碼寫的有些瑕疵吧。可以躲避障礙物,但是不是每次都能準確躲避,大多數情況下,轉幾次彎就會撞墻,但是網上看到別人的小車都很靈敏,基本是大多數的障礙都可以躲避。下面附上部分代碼,希望大家看看有什么問題吧。初學51,請多指教!

這一塊是超聲波部分:

void Conut(void)                    //超聲波計算距離
{
        time1=TH0*256+TL0;
        TH0=0;
        TL0=0;
        
        S=(time1*1.7)/100;     //算出來是CM

}

void jiance()                           //檢測障礙物是否在范圍內
{
        if((S>=600)||flag==1)
        {         
                flag=0;
                leftqian();
                rightqian();
                OLED_ShowChar(0,  4, ASCII[11]);
                 OLED_ShowChar(18, 4, ASCII[10]);        //顯示點
                  OLED_ShowChar(36, 4, ASCII[11]);
                  OLED_ShowChar(54, 4, ASCII[11]);
                 OLED_ShowChar(72, 4, ASCII[12]);        //顯示M
        }
        else if(S<40)
        {
               
                leftqian();
                righthou();
                delay(200);
                disbuff[0]=S%1000/100;
                  disbuff[1]=S%1000%100/10;
                  disbuff[2]=S%1000%10 %10;
                OLED_ShowChar(0, 4, ASCII[disbuff[0]]);
                  OLED_ShowChar(18, 4, ASCII[10]);        //顯示點
                  OLED_ShowChar(36, 4, ASCII[disbuff[1]]);
                  OLED_ShowChar(54, 4, ASCII[disbuff[2]]);
                OLED_ShowChar(72, 4, ASCII[12]);        //顯示M
        }
        else
        {
                leftqian();
                rightqian();
                led7=0;
                disbuff[0]=S%1000/100;
                  disbuff[1]=S%1000%100/10;
                  disbuff[2]=S%1000%10 %10;
                OLED_ShowChar(0, 4, ASCII[disbuff[0]]);
                  OLED_ShowChar(18, 4, ASCII[10]);        //顯示點
                  OLED_ShowChar(36, 4, ASCII[disbuff[1]]);
                  OLED_ShowChar(54, 4, ASCII[disbuff[2]]);
                OLED_ShowChar(72, 4, ASCII[12]);        //顯示M
        }

void  StartModule()                          //啟動模塊
{
        uint k;
        Trig=1;        
        for(k=0;k<21;k++)                             //啟動一次模塊
                _nop_();
        Trig=0;
}




這一塊是舵機部分:
void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0xFE;
    TL1 = 0x0C;
        if(count<jd)
                pwm=1;
        else
                pwm=0;
        count=count+1;
        count=count%40;
}        



下面是主程序:
void main()
{
        InitTimer0();
        InitTimer1();
        IrInit();
        OLED_Init();                        //初始化OLED
        leftqian();
        rightqian();
        jd=2;
        OLED_Clear();
        OLED_ShowCHinese2(0,0,0);//
        OLED_ShowCHinese2(18,0,1);//
        OLED_ShowCHinese2(36,0,2);//
        OLED_ShowCHinese2(54,0,3);//作
        OLED_ShowCHinese2(72,0,4);//品
        OLED_ShowCHinese2(90,0,5);//答
        OLED_ShowCHinese2(108,0,6);//辯               
        OLED_ShowCHinese(0,2,0); //測
        OLED_ShowCHinese(18,2,1);//量
        OLED_ShowCHinese(36,2,2);//距
        OLED_ShowCHinese(54,2,3);//離
        OLED_ShowCHinese(72,2,4);//:
        while(1)
        {                 
//                delay500ms();
                jd=jd+2;
                if(jd>5)
                        jd=2;                  
                switch(IrValue[2])
                {
                        case 24: leftqian();rightqian(); break;
                        case 82: lefthou();righthou(); break;
                        case  8: lefthou();rightqian(); break;
                        case 90: leftqian();righthou(); break;
                        case 28: leftting();rightting(); break;
                        default : break;
                }
                if(IrValue[2]==71)
                {
                        StartModule();
                        led8=0;
                       while(!Echo);                //當RX為零時等待
                       TR0=1;                            //開啟計數
                           while(Echo);                        //當RX為1計數并等待
                    TR0=0;                                //關閉計數
                 Conut();                        //計算
                        jiance();
                        led8=1;
//                        delayms(80);                //處理速度不夠,導致轉彎不靈敏
                }
                if(IrValue[2]==70)
                {                                                
                        StartModule();
                        led8=0;
                       while(!Echo);                //當RX為零時等待
                       TR0=1;                            //開啟計數
                           while(Echo);                        //當RX為1計數并等待
                    TR0=0;                                //關閉計數
                 Conut();                        //計算
                        jd=3;
                        while(S>20)
                        {
                                leftqian();
                                rightqian();
                                Conut();
                        }
                        leftting();
                        rightting();
                }                                                                 
                delay_ms(100);                                
//                OLED_Clear();
/*                delay_ms(500);
                OLED_Clear();
                delay_ms(500);
                OLED_DrawBMP(0,0,128,8,BMP1);    //顯示圖片1
                delay_ms(500);                                         
                OLED_DrawBMP(0,0,128,8,BMP2);         //顯示圖片2
                delay_ms(500);                                            */
        }
}



作者: yaoji123    時間: 2019-4-25 12:16
主程序中軟件延時太長了,有1.5S多。
作者: 放眼天下    時間: 2019-4-25 15:06
yaoji123 發表于 2019-4-25 12:16
主程序中軟件延時太長了,有1.5S多。

僅僅是延時的問題嗎?我聽別人說需要對超聲波所傳回來的數據進行處理,而不是所有的都能用




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1