stm32入门教程4--旋转编码器计次&对射红外传感器计次

对于stm32来说,想要获取的信号是外部驱动的很快的突发信号

比如旋转编码器的输出,可能很久都没有拧它,这时不需要stm32做任何事,但只要一拧它,就会有很多脉冲波形需要stm32接收,这个信号是突发的,stm32也不知道什么时候会来,同时旋转编码器是外部驱动的,stm32只能被动读取,这个信号非常快,stm32稍微晚来一点读取,就会错过很多波形,所以对于这种情况来说,可以考虑使用stm32的外部中断,有脉冲过来,stm32立即进入中断函数处理,没有脉冲的时候,stm32就专心做其他事情;

比如红外遥控接收头的输出,接收到遥控数据后,他会输出一段波形,但这个波形转瞬即逝,并且不会等你,所以需要我们用外部中断来读取;

最后比如按键,虽然也是外部驱动的突发事件,但不推荐按键使用外部中断来处理,因为外部中断不好处理抖动和松手检测的问题,对于按键来说,他的输出波形也不是转瞬即逝的,所以要求不高的话可以在主程序中循环读取,如果不想用主程序循环读取,可以考虑定时器中断读取的方式,这样既可以做到后台读取按键值、不阻塞主程序,也可以很好的处理按键抖动和松手检测的问题。

旋转编码器介绍:

旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出旋转速度方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。

类型:机械触点式/霍尔传感器/光栅式

左上角图一采用的是对射式红外传感器来测速的,为了测速还需要配合一个光栅编码盘,编码盘转动时,红外传感器的红外光就会出现遮挡、透过、遮挡、透过这样的现象,对应模块输出的电平就是高低电平交替的方波,这个方波的个数表示了转过的角度,方波的频率表示转速,我们就可以用外部中断来捕获方波的边沿,以此来判断位置和速度,但是该模块只有一路输出,正转反转输出的波形没法区分,所以这种测速方法只能测位置和速度,不能测旋转方向,为了进一步测量方向,我们可以用后面的几种编码器

接线图

 示例代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"

int16_t Num;			//定义待被旋转编码器调节的变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Encoder_Init();		//旋转编码器初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Num:");			//1行1列显示字符串Num:
	
	while (1)
	{
		Num += Encoder_Get();				//获取自上此调用此函数后,旋转编码器的增量值,并将增量值加到Num上
		OLED_ShowSignedNum(1, 5, Num, 5);	//显示Num
	}
}

对射红外传感器

红外对射传感器是一种常用于安防领域的传感器,可以测量两个位置之间的距离或者检测两个位置之间是否有物体存在。该传感器由发射器和接收器组成,发射器发射红外光束,接收器接收反射回来的红外光束,根据光的强度判断是否有物体存在。红外对射传感器有两种类型,一种是依靠反射红外光来检测物体,一种是依靠接收物体自带的红外光来检测物体。

工作原理

红外对射传感器的工作原理是利用发射器发射红外光束,光束经过物体反射后,被接收器接收。当物体靠近传感器时,反射回来的红外光束的强度会降低,接收器会感知到这一变化,从而触发相关的操作。如果没有物体存在,红外光束会被接收器正常接收,不会触发任何操作。

红外传感器的应用

红外对射传感器广泛应用于安防、门禁、自动控制、游乐场所等领域。在安防方面,可以用来检测入侵者、车辆等物体是否进入了特定区域;在门禁方面,可以用来检测门口是否有人站在门口,从而控制门的开启和关闭;在自动控制方面,可以用来控制机器人、无人车等设备的行动。红外对射传感器的应用范围非常广泛,其作用也非常重要,对于我们的生活及工作有着巨大的帮助。

接线图

示例代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();			//OLED初始化
	CountSensor_Init();		//计数传感器初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Count:");	//1行1列显示字符串Count:
	
	while (1)
	{
		OLED_ShowNum(1, 7, CountSensor_Get(), 5);		//OLED不断刷新显示CountSensor_Get的返回值
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是lamune

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值