It's_me 发表于 2014-5-4 09:40 
你看一下这个码盘测速的原理,还是不懂我再给你讲讲
time = millis();//以毫秒为单位,计算当前时间
//计算出每0.5秒钟内,编码器码盘计得的脉冲数,
if(abs(time - old_time) >= 500) // 如果计时时间已达0.5秒
{
detachInterrupt(0); // 关闭外部中断0
detachInterrupt(1); // 关闭外部中断1
//此直流减速电机的编码器码盘为334个齿,减速比为21.3。
//把编码器每0.5秒钟计得的脉冲数,换算为当前转速值的计算式
rpm_right =(float)count_right*60*2/(334*21.3);
rpm_left =(float)count_left*60*2/(334*21.3);
//根据左右车轮转速差,乘以比例调节因子2,获得比例调节后的左侧电机PWM功率值
PWM_left=(float)PWM_left+(rpm_right-rpm_left)*2;
//根据刚刚调节后的小车电机PWM功率值,
//及时修正小车前进或者后退状态,以使小车走直线
if(flag=='a')
advance();
if(flag=='b')
back();
count_right = 0; //把脉冲计数值清零,以便计算下一个0.5秒的脉冲计数
count_left = 0;
old_time= millis(); // 记录每次0.5秒测速后的时间节点
attachInterrupt(0, Code_right,FALLING); // 重新开放外部中断0
attachInterrupt(1, Code_left,FALLING); // 重新开放外部中断1
}
}
//右侧电机编码器码盘计数中断子程序
void Code_right()
{
count_right += 1; // 编码器码盘计数加一
}
//左侧电机编码器码盘计数中断子程序
void Code_left()
{
count_left += 1; // 编码器码盘计数加一
}
其实这里有这个代码,是为了能够保持转速一致的,想到从端口读取,但是应该直接连到端口就可以了吧,然后INPUT,不知道楼主把那两根线是如何连接的,楼主给的原理图已经看懂~谢谢~~ |