[讨论] 楼主在做一个智能扫地车,关于小车如何走直线的问题请教一下各位大神

wzqvip   2016-4-27 16:32 楼主
最近在做一部智能扫地车,初步可以nrf无线控制,蔽障,吸尘模块,现在还差路径规划,尽量做到空房间里遍历每一个角落,目前采用左右电机各装一个编码盘,进行计数然后通过比较两者进行走直线调整,就是请求大神指导一下,感激不尽

回复评论 (23)

走直线,左右电机采用同样的PWM,不就可以直线行走了吗,要想转弯,两边的PWM相互调节下不就可以转弯了吗?
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-4-27 21:48
思路是对的 两边比较走直线~
物致DIY 欢迎你的加入~ QQ群:646461928 公众号:智物知心致成 小店
点赞  2016-4-27 22:15
轮子滑动因素不考虑,要闭环操作,编码器检测转速相同
点赞  2016-4-27 22:18
刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响,加上闭环的反馈可以做到及时的纠正,这样,你需要给自己定一个时间,去看反馈,比较两个电机转速的大小,做出及时的纠正。
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-4-27 22:24
引用: ywlzh 发表于 2016-4-27 22:24
刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响 ...

嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直线,后面想改用3个定时器,但是苦于现在用的是stc89c52rc的单片机据说有3个定时器以前没用过,没把握
点赞  2016-4-28 09:23
引用: 皈依 发表于 2016-4-27 22:15
思路是对的 两边比较走直线~

嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直线,后面想改用3个定时器,但是苦于现在用的是stc89c52rc的单片机据说有3个定时器以前没用过,没把握
点赞  2016-4-28 09:23
附上我的程序,用外部中断1,2计数和定时器T0计时,但是还是走不了直线


#include//单片机头文件

unsigned int motor1=0;         //计左电机码盘脉冲值
unsigned int motor2=0;         //计右电机码盘脉冲值
unsigned int speed1=0;         //计左电机码盘脉冲值
unsigned int speed2=0;         //计右电机码盘脉冲值
sbit zuo1=P0^0;//左电机控制端1
sbit zuo2=P0^1;//左电机控制端2
sbit you1=P0^2;//右电机控制端1
sbit you2=P0^3;//右电机控制端2
unsigned int k=0;
void delay(int z)//pwm中使用的延时函数
{
        int i,j;
        for(i=10;i>0;i--)          
        for(j=z;j>0;j--);       
}
void qian(void)
{
           you1=0;
        you2=1;
        zuo1=0;
        zuo2=1;
        delay(3);//pwm调速,若PWM1=7表示速度为全速的70%
        you1=1;
        you2=1;
        zuo1=1;
        zuo2=1;
        delay(7);
}
void  zuostop(void)
{
     
        zuo1=1;
        zuo2=1;
        delay(20);
}
  void  youstop(void)
{
    you1=1;
        you2=1;
        delay(20);
}

/*********************************************************************************************
主程序
/*********************外部中断INT0、INT1初始化函数***********************************************************************/
void main(void)
{               
        TMOD=0X01;
    TH0=(65536-50000)/256;                //50MS定时
    TL0=(65536-50000)%256;
        TR0= 1;
        ET0= 1;

        EX0=1;           //开启外部中断0
    IT0=1;           //下降沿有效
        IE0=0;
        EA = 1;
        EX1 = 1;
        IT1= 1;
    qian();

               
                
}

/*********************************************************************************************
外部中断INT0计算电机1的脉冲
/********************************************************************************************/
void intersvr1(void) interrupt 0 using 1
{
        motor1++;               
}
/*********************************************************************************************
外部中断INT1计算电机2的脉冲
/********************************************************************************************/
void intersvr2(void) interrupt 2 using 3
{
        motor2++;
}

/********************************************************************************************
定时器0中断函数
注意:这里的speed为简单书写,逻辑公式过程应该为
speed2=小车轮子周长/码盘格式*1秒的码盘脉冲格数
定时器做出的效果为算出一秒内的距离
/********************************************************************************************/
void timer0(void) interrupt 1  using 2
{     TH0=(65536-50000)/256;                //2MS定时
      TL0=(65536-50000)%256;
       k++;
         if(k>=10)        //10次即是,0.5S               
        {
                k=0;                        //重新定义k的值
                speed1=motor1;
                speed2=motor2;
        {
                  if(speed1>speed2) zuostop();//左边走得快就停顿一下
          else if(speed1           else if(speed1=speed2) qian();//左右相同,直走
         }
                motor1=0;                 //重新定义motor1的值
                motor2=0;                //重新定义motor1的值
        }               
}

请大家指正
点赞  2016-4-28 09:28
引用: 皈依 发表于 2016-4-27 22:15
思路是对的 两边比较走直线~

我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下
点赞  2016-4-28 09:30
引用: 不知道叫什么 发表于 2016-4-27 22:18
轮子滑动因素不考虑,要闭环操作,编码器检测转速相同

我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下
点赞  2016-4-28 09:30
引用: ywlzh 发表于 2016-4-27 22:24
刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响 ...

刚刚上了程序,兄弟帮忙指正下,谢谢
点赞  2016-4-28 09:31
引用: wzqvip 发表于 2016-4-28 09:30
我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下

轮子防滑怎么样?如果闭环速度控制还是不能走直线的话,你可以计路程,但是首先轮子防滑做的好
点赞  2016-4-28 09:54
引用: 不知道叫什么 发表于 2016-4-28 09:54
轮子防滑怎么样?如果闭环速度控制还是不能走直线的话,你可以计路程,但是首先轮子防滑做的好

防滑还可以,就是感觉闭环没做好
点赞  2016-4-28 10:45
引用: wzqvip 发表于 2016-4-28 09:23
嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直 ...

不要用停顿的方式,PID实时调节速度 和电机测速组成PID
物致DIY 欢迎你的加入~ QQ群:646461928 公众号:智物知心致成 小店
点赞  2016-4-28 11:41
吸尘模块哪里买的?
点赞  2016-4-28 12:33
引用: 皈依 发表于 2016-4-28 11:41
不要用停顿的方式,PID实时调节速度 和电机测速组成PID

pid还不懂,不用pid可以吗
点赞  2016-4-28 14:38
引用: quner 发表于 2016-4-28 12:33
吸尘模块哪里买的?

去买usb吸尘器改装的
点赞  2016-4-28 14:38
检测到碰撞后,随机避让
作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
点赞  2016-4-28 14:46
引用: 人民币的幻想 发表于 2016-4-28 14:46
检测到碰撞后,随机避让

这个是其中的一部分,算是做好了
点赞  2016-4-28 16:03
主要是要做到空房间里的每一个地方都遍历
我是打算采用如图,就要让车到走直线的时候尽量走直线



  • T5W@BC6FIQ4A(Y4F}_6YT1G.png
点赞  2016-4-28 16:10
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复