第十八享,测速模块

网友投稿 2019-04-23 14:33

本次所谓的测速,为电机的转速,不是物体的移动速度,是角速度。

测速模块为一U型卡槽。

https://cdn.china-scratch.com/timg/190425/14332S0L-0.jpg

原理,和循迹模块是一样的,为红外收发管,遮挡为1,不遮挡为0;再配合码盘使用,码盘:

https://cdn.china-scratch.com/timg/190425/14332R1R-1.jpg

码盘上有20个缝隙,20个遮挡,如此,将码盘安装在电机转轴上,当电机转动时,测速模块会不断输出高低电平的变换。

    接线如图

https://cdn.china-scratch.com/timg/190425/14332a134-2.jpg

        先上代码

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