楼主在做一个智能扫地车,关于小车如何走直线的问题请教一下各位大神
最近在做一部智能扫地车,初步可以nrf无线控制,蔽障,吸尘模块,现在还差路径规划,尽量做到空房间里遍历每一个角落,目前采用左右电机各装一个编码盘,进行计数然后通过比较两者进行走直线调整,就是请求大神指导一下,感激不尽走直线,左右电机采用同样的PWM,不就可以直线行走了吗,要想转弯,两边的PWM相互调节下不就可以转弯了吗? 思路是对的 两边比较走直线~ 轮子滑动因素不考虑,要闭环操作,编码器检测转速相同 刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响,加上闭环的反馈可以做到及时的纠正,这样,你需要给自己定一个时间,去看反馈,比较两个电机转速的大小,做出及时的纠正。
ywlzh 发表于 2016-4-27 22:24
刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响 ...
嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直线,后面想改用3个定时器,但是苦于现在用的是stc89c52rc的单片机据说有3个定时器以前没用过,没把握 <div class='shownolgin' data-isdigest='no'>皈依 发表于 2016-4-27 22:15
思路是对的 两边比较走直线~
嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直线,后面想改用3个定时器,但是苦于现在用的是stc89c52rc的单片机据说有3个定时器以前没用过,没把握</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <div class='shownolgin' data-isdigest='no'>附上我的程序,用外部中断1,2计数和定时器T0计时,但是还是走不了直线
#include<reg52.h>//单片机头文件
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);
}
voidzuostop(void)
{
zuo1=1;
zuo2=1;
delay(20);
}
voidyoustop(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 1using 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<speed2) youstop();//右边走得快就停顿一下
else if(speed1=speed2) qian();//左右相同,直走
}
motor1=0; //重新定义motor1的值
motor2=0; //重新定义motor1的值
}
}
请大家指正</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>皈依 发表于 2016-4-27 22:15
思路是对的 两边比较走直线~
我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>不知道叫什么 发表于 2016-4-27 22:18
轮子滑动因素不考虑,要闭环操作,编码器检测转速相同
我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>ywlzh 发表于 2016-4-27 22:24
刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响 ...
刚刚上了程序,兄弟帮忙指正下,谢谢</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>wzqvip 发表于 2016-4-28 09:30
我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下
轮子防滑怎么样?如果闭环速度控制还是不能走直线的话,你可以计路程,但是首先轮子防滑做的好</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>不知道叫什么 发表于 2016-4-28 09:54
轮子防滑怎么样?如果闭环速度控制还是不能走直线的话,你可以计路程,但是首先轮子防滑做的好
防滑还可以,就是感觉闭环没做好</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>wzqvip 发表于 2016-4-28 09:23
嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直 ...
不要用停顿的方式,PID实时调节速度 和电机测速组成PID</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>吸尘模块哪里买的?</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>皈依 发表于 2016-4-28 11:41
不要用停顿的方式,PID实时调节速度 和电机测速组成PID
pid还不懂,不用pid可以吗</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>quner 发表于 2016-4-28 12:33
吸尘模块哪里买的?
去买usb吸尘器改装的</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>检测到碰撞后,随机避让:victory:</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>人民币的幻想 发表于 2016-4-28 14:46
检测到碰撞后,随机避让
这个是其中的一部分,算是做好了</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>主要是要做到空房间里的每一个地方都遍历
我是打算采用如图,就要让车到走直线的时候尽量走直线
https://bbs.eeworld.com.cn/forum.php?mod=image&aid=238347&size=300x300&key=8a0d40cb272609f9&nocache=yes&type=fixnone
</div><script>showreplylogin();</script>
页:
[1]
2