小车电机测速模块和代码介绍

        本人还是新手入门阶段所以代码都是比较低级,还望大佬指导优化。

        小车电机测速模块有霍尔和光电传感器,这里我采用的是光电,就是红外。它的特点就是被颜色深的物体遮挡会触发,使用也非常简单接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;
............

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在STM32中,光电码盘测速是通过光电编码器实现的。光电编码器由光源、光码盘和光敏元件组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。当电动机旋转时,光栅盘与电动机同速旋转。光电编码器通过检测光栅盘上的脉冲信号来计算电动机的转速。\[3\] 在STM32编码器模式中,A相和B相每产生一个上升沿或者下降沿,计数器就会加1。通过测量单位时间内A相和B相输出的脉冲数,可以得到电动机的速度信息。可以使用M法、T法或M/T法来测量速度。M法是通过检测脉冲个数来获得被测速度,适用于测量高速速度。T法是测量相邻两个脉冲间的时间,再来反算速度,适用于测量低速速度。M/T法是同时测量检测时间和在此时间内脉冲发生器发出的脉冲个数来测量速度。\[1\] 另外,为了提高编码器的精度,可以使用编码器倍频的方法。通过测量A相和B相编码器的上升沿和下降沿,可以在同样的时间内计数更多次,从而提高精度。这是一种实用的技术,可以将编码器的精度提升4倍。\[2\] #### 引用[.reference_title] - *1* *3* [STM32(HAL库)——光电编码器、M/T法测量电机转速](https://blog.csdn.net/DIVIDADA/article/details/130198779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32——编码器测速原理及STM32编码器模式](https://blog.csdn.net/cyj972628089/article/details/112852960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值