本人还是新手入门阶段所以代码都是比较低级,还望大佬指导优化。
小车电机测速模块有霍尔和光电传感器,这里我采用的是光电,就是红外。它的特点就是被颜色深的物体遮挡会触发,使用也非常简单接VCC GND DO(输出口)就好了。我们可以用它现实测量圈数,转速,速度。
我先介绍一下这次使用的模块,市面上我找得到有三款常用的,在功能上是没什么区别的,包括那个4脚的,它AO脚是不起作用的,主要看它们的螺丝孔位和槽间距来区分使用场景,它们的均价都在3元左右。
这里就拿最右边的来讲,它刚好适配我小车的底盘,不对,是完美适配!
首先就是实现计数功能(一步步来,慢慢掌握这个模块),下面就是效果,这个模块其实就是只能做到感应触发,计数测速都是要代码编辑。我采用的是51单片机,使用外部中断0接收信号,那么我将传感器DO引脚接在P3.2,设置成下降沿和低电平触发都行,但最好是下降沿触发。中断服务函数里就是让一个数加1(X++),并且显示出来,这样就是计数功能了。
#include <reg51.h> //51通用头文件
#include <oled.h> //OLED库函数
#define uchar unsigned char //用uchar 表示 unsigned char类型
#define uint unsigned int //用uint 表示 unsigned int类型
uint X;
void into() interrupt 0
{
X++;
}
void main(void)
{
OLED_Init(); //初始化OLED
OLED_Clear(); //清空屏幕
X=0;
EA=1
EX0=1;
IT0=1;
while(1)
{
OLED_ShowString(0,2,"----------------",16);
OLED_ShowString(12,0,"Expert-",16);
OLED_ShowCHinese(68 ,0,7); //阿
OLED_ShowCHinese(86 ,0,8); //诺
OLED_ShowCHinese(104 ,0,9); //蓝
OLED_ShowCHinese(5 ,4,3); //计
OLED_ShowCHinese(23 ,4,4); //数
OLED_ShowString(38,4,":",16);
OLED_ShowNum(45,4,X, 4,16);
}
}
实现后我们就在计数的基础之上计算,计算?对的就是算,但是要配合一个东西,小车电机测速码盘,这个东西一般你买小车套件的里面都有的,几个轮子配几个,就是这个黑色的圈圈。咦?我们为什么用它,它的结构很特殊,上面有20个规律的孔洞,那么就是说转一圈就要触发20次,就可以算出圈数。我们设置一个定时器规定时间,圈数 / 时间,码盘转一圈,轮胎也转了一圈,那么用圈数 X 周长=距离,距离 / 时间=速度,是不是有思路了,那你是打算看完还是现在就去敲代码,难度确实不打,那个,要不点赞再走(·-·) 。
OK这个时候我们在加一些定义,定时器0设置50m循环20次(0-19)服务函数内容
uchar G; //时间
uint V; //速度 mm/s
uint VH; //速度 km/h
uint R; //圈数
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
G++;
if(G=19)
{
R=X/2; //r X10
V=R*3.14*65; //(mm/s)毫米每秒 X10/10 65为轮胎直径 π=3.14.......
VH=V*3.6/10;
G=0;
X=0;
}
}
奇怪的来了,我在这个服务函数这里搞了挺久,如果我按正常的写 R=X/20 这样出来的小数位不到R就是整数,也就意味着V和VH这两个的速度值是几个固定值,比如5.4圈每秒测出来的显示速度和5.9圈/秒的显示速度一样,我当时就难受了,我看到出数据了我以为成了哈哈哈,结果是这样的,尝试设置为浮点型,但是报错,其实就是我不会用。
怎么办?我就这样,因为速度最快的时候大概是5圈多/秒,只能读出整数,除非超过10圈每秒这样就是两位数了就有点变化可以看到速度变动,所以我乘10,然后其他的速度计算最后再除10,这样在算速度的时候是两位数,比如2.6X10后是26,我电机慢了点变成了2.4,计算就是24,这样就可以看到速度的实时变化了最后速度除10就是真实速度了。你是不是开始笑我了,我就知道,你一定有好的方法,教我,师傅。
所以后面的显示有小数点以下的都是我放一个固定显示的小数点,比如想精确到后一位我就乘10,然后让个位显示在小数点后一个,十位显示在个位这里,以此类推。就这样才有了文章开头的效果,我只能这样将就这用了。
还有主函数里面要给定时器0做定义,其他参数显示在哪就自己选择吧
void main(void)
{
...................
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
............