找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2502|回复: 2
收起左侧

如何让超声波舵机避障小车更加精准 附单片机代码

[复制链接]
ID:473410 发表于 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);                                            */
        }
}


回复

使用道具 举报

ID:432823 发表于 2019-4-25 12:16 | 显示全部楼层
主程序中软件延时太长了,有1.5S多。
回复

使用道具 举报

ID:473410 发表于 2019-4-25 15:06 | 显示全部楼层
yaoji123 发表于 2019-4-25 12:16
主程序中软件延时太长了,有1.5S多。

仅仅是延时的问题吗?我听别人说需要对超声波所传回来的数据进行处理,而不是所有的都能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表