第十八享,测速模块
本次所谓的测速,为电机的转速,不是物体的移动速度,是角速度。
测速模块为一U型卡槽。
原理,和循迹模块是一样的,为红外收发管,遮挡为1,不遮挡为0;再配合码盘使用,码盘:
码盘上有20个缝隙,20个遮挡,如此,将码盘安装在电机转轴上,当电机转动时,测速模块会不断输出高低电平的变换。
接线如图
先上代码
float n = 0;
float time;
float Speed;
void setup(){
Serial.begin(9600);
attachInterrupt(0,count,CHANGE);
}
void loop(){
time = millis();
Speed = (n/40)/(time/60000) ;
Serial.println(Speed);
}
void count(){
n += 1;
}
这里有两句代码比较重要,我们借此解释一下上面的代码:
attachInterrupt(interrupt,function,mode);
这是一句中断函数,函数有三个参数:
interrupt —— 中断源。可选值0和1,0 对应2号引脚;1 对应3号引脚。这里我们写的 0 ,即外部中断接数字引脚2号引脚。
function —— 中断处理函数。即发生中断时,去做什么。这里我们让它发生中断时,做 n+=1。用来计数模块被码盘遮挡时,电平变化的次数。
mode —— 触发模式。触发模式有四种类型:LOW(低电平触发)、CHANGE(电平变化时触发)、RISING(低电平变为高电平时触发)、FALLING(高电平变为低电平时触发)。这里我们选择CHANGE(电平变化时触发),前面讲了,码盘有20个缝隙,20个遮挡,这样,电机转一转时,为40次触发,即n=40,为n/40转。
millis();
此函数用于获取机器运行的时间长度,函数返回值为 unsigned long 型(毫秒ms),系统最长的记录时间为9小时22分钟,如果超出,则从0开始。
因此,我们所测的转速,为自系统运行开始时的平均角速度,并不是实时速度。
了解了这两句函数之后,再看上面的代码,不难理解,最终输出的为电机的转速,单位:转/分钟。
当然,如果将电机安装在小车上,转速*车轮周长=小车移动速度。n*车轮周长=小车行进总路程。
我们参照L298N电机驱动的代码,驱动一个小车上的减速直流电机,进行转速测试,在接下来的视频效果展示中,我们设置控制电机转速的PWM为50、100、200三个不同值,可看到转速明显的改变,并基本呈线性改变,可见这个模块还是可以的。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com