最近在做一部智能扫地车,初步可以nrf无线控制,蔽障,吸尘模块,现在还差路径规划,尽量做到空房间里遍历每一个角落,目前采用左右电机各装一个编码盘,进行计数然后通过比较两者进行走直线调整,就是请求大神指导一下,感激不尽
走直线,左右电机采用同样的PWM,不就可以直线行走了吗,要想转弯,两边的PWM相互调节下不就可以转弯了吗?
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
思路是对的 两边比较走直线~
物致DIY 欢迎你的加入~
QQ群:646461928 公众号:智物知心致成
小店
轮子滑动因素不考虑,要闭环操作,编码器检测转速相同
刚开始看了自己的说法,有点草率,在理想的状态下,两边电机给相同PWM可以走直线,但考虑到环境因素的影响,加上闭环的反馈可以做到及时的纠正,这样,你需要给自己定一个时间,去看反馈,比较两个电机转速的大小,做出及时的纠正。
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直线,后面想改用3个定时器,但是苦于现在用的是stc89c52rc的单片机据说有3个定时器以前没用过,没把握
嗯嗯,没事,我现在试了好几种变成方式,比如用外部中断的2个计数器,和一个定时器作用但是发现走不了直线,后面想改用3个定时器,但是苦于现在用的是stc89c52rc的单片机据说有3个定时器以前没用过,没把握
附上我的程序,用外部中断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的值
}
}
请大家指正
我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下
我同时用两个外部中断计数,一个定时器计时,实际还是走歪了,上了程序,兄弟帮我指正下
轮子防滑怎么样?如果闭环速度控制还是不能走直线的话,你可以计路程,但是首先轮子防滑做的好
不要用停顿的方式,PID实时调节速度 和电机测速组成PID
物致DIY 欢迎你的加入~
QQ群:646461928 公众号:智物知心致成
小店
检测到碰撞后,随机避让
作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
主要是要做到空房间里的每一个地方都遍历
我是打算采用如图,就要让车到走直线的时候尽量走直线