对射式红外传感器模块(测速传感器模块)

本文介绍了使用ITR9606高灵敏度光耦器件的测速传感器模块,包括其结构特点、工作原理、接线说明和应用示例,如与单片机配合测速、限位及报警功能。还特别提到不同版本的模块规格差异和编程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

产品特性:

        使用ITR9606高灵敏度槽型光耦器件,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为5mm。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。广泛用于电机转速检测,脉冲计数,位置限位等。

产品参数:

工作电压3.3V-5V
输出形式﹔数字开关量DO输出(o和1),模拟输出AO引脚无效

使用说明:

        接好VCC和GND,模块电源指示灯会亮,模块槽中无遮挡时,接收管导通,模块Do输出低电平,开关指示灯亮﹔遮挡时,DO输出高电平,开关指示灯灭。模块DO可与继电器相连,组成限位开关等功能,也可以与有源蜂鸣器模块相连,组成报警器。DO输出接口可以与单片机Io口直接相连,一般接外部中断,检测传感器是否有遮档,如用电机码盘则可检测电机的转速。

测速传感器模块使用说明书(宽槽版):

模块特色:

1、使用进口槽型光耦传感器,槽宽度 10mm。

2、有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。

3、有遮挡,输出高电平;无遮挡,输出低电平。

4、比较器输出,信号干净,波形好,驱动能力强,超过 15mA。

5、工作电压 3.3V-5V

6、输出形式 :数字开关量输出(0 和 1)

7、设有固定螺栓孔,方便安装

8、小板 PCB 尺寸:2.3cm x 2cm

9、使用宽电压 LM393 比较器 

模块使用说明(宽槽版):

1.模块槽中无遮挡时,接收管导通,模块 OUT 输出低电平,遮挡时, OUT 输出高电平;

2、OUT 输出接口可以与单片机 IO 口直接相连,检测传感器是否有遮 档,如用电机码盘则可检测电机的转速。

3.模块 OUT 可与继电器相连,组成限位开关等功能,也可以与有源蜂 鸣器模块相连,组成报警器。

产品接线说明(宽槽版):

1、VCC 接电源正极 3.3-5V

2、GND 接电源负极

3、OUT TTL 开关信号输出

---------------------------------------------------------------------------------------------------------------------------------

测速传感器模块使用说明书(窄槽版):

模块特色(窄槽版):

1、使用进口槽型光耦传感器,槽宽度 5mm。

2、有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。

3、有遮挡,输出高电平;无遮挡,输出低电平。

4、比较器输出,信号干净,波形好,驱动能力强,超过 15mA。

5、工作电压 3.3V-5V

6、输出形式 :数字开关量输出(0 和 1)

7、设有固定螺栓孔,方便安装

8、小板 PCB 尺寸:3.2cm x 1.4cm

9、使用宽电压 LM393 比较器  

模块使用说明(窄槽版):

1.模块槽中无遮挡时,接收管导通,模块 DO 输出低电平,遮挡时, DO 输出高电平;

2、DO 输出接口可以与单片机 IO 口直接相连,检测传感器是否有遮 档,如用电机码盘则可检测电机的转速。

3.模块 DO 可与继电器相连,组成限位开关等功能,也可以与有源蜂 鸣器模块相连,组成报警器。

产品接线说明(窄槽版):

1、VCC 接电源正极 3.3-5V

2、GND 接电源负极

3、DO TTL 开关信号输出

4、AO 此模块不起作用

程序设计:

  传感器51测试程序(宽槽版):

/******************************************
´«¸ÐÆ÷´¥·¢²âÊÔ
µ¥Æ¬»ú£ºSTC89C52
²¨ÌØÂÊ£º9600
*****************************************/
#include <reg52.h>
unsigned char date;
#define uchar unsigned char
#define uint unsigned int
sbit key1=P0^1;


/* º¯ÊýÉêÃ÷ -----------------------------------------------*/
void delay(uint z);
void Initial_com(void);

//***********************************************************

/*
********************************************************************************
** º¯ÊýÃû³Æ £º delay(uint z)
** º¯Êý¹¦ÄÜ £º ÑÓʱº¯Êý
********************************************************************************
*/
void delay(uint z)
{																							   
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
} 


//******************************

//*****´®¿Ú³õʼ»¯º¯Êý***********

//******************************
void Initial_com(void)
{
 EA=1;        //¿ª×ÜÖжÏ
 ES=1;        //ÔÊÐí´®¿ÚÖжÏ
 ET1=1;        //ÔÊÐí¶¨Ê±Æ÷T1µÄÖжÏ
 TMOD=0x20;   //¶¨Ê±Æ÷T1£¬ÔÚ·½Ê½2ÖжϲúÉú²¨ÌØÂÊ
 PCON=0x00;   //SMOD=0
 SCON=0x50;   // ·½Ê½1 Óɶ¨Ê±Æ÷¿ØÖÆ
 TH1=0xfd;    //²¨ÌØÂÊÉèÖÃΪ9600
 TL1=0xfd;
 TR1=1;       //¿ª¶¨Ê±Æ÷T1ÔËÐпØÖÆÎ»

}




//*************************
//**********Ö÷º¯Êý*********
//*************************
main()
{
	 Initial_com();
	 while(1)
	 {
	
	 	 if(key1==0)
		{
			delay();	  //Ïû¶¶¶¯
			if(key1==0)	  //È·ÈÏ´¥·¢
			{
				 SBUF=0X01;
				 delay(200);
				
			
			}
	   
		}
		 
		  if(RI)
		  {
			date=SBUF;    //µ¥Æ¬»ú½ÓÊÜ
			SBUF=date;    //µ¥Æ¬»ú·¢ËÍ
			RI=0;
		  }
		
		
	  }
}

  传感器51测试程序(窄槽版): 

/******************************************
´«¸ÐÆ÷´¥·¢²âÊÔ
µ¥Æ¬»ú£ºSTC89C52
²¨ÌØÂÊ£º9600
*****************************************/
#include <reg52.h>
unsigned char date;
#define uchar unsigned char
#define uint unsigned int
sbit key1=P0^1;


/* º¯ÊýÉêÃ÷ -----------------------------------------------*/
void delay(uint z);
void Initial_com(void);

//***********************************************************

/*
********************************************************************************
** º¯ÊýÃû³Æ £º delay(uint z)
** º¯Êý¹¦ÄÜ £º ÑÓʱº¯Êý
********************************************************************************
*/
void delay(uint z)
{																							   
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
} 


//******************************

//*****´®¿Ú³õʼ»¯º¯Êý***********

//******************************
void Initial_com(void)
{
 EA=1;        //¿ª×ÜÖжÏ
 ES=1;        //ÔÊÐí´®¿ÚÖжÏ
 ET1=1;        //ÔÊÐí¶¨Ê±Æ÷T1µÄÖжÏ
 TMOD=0x20;   //¶¨Ê±Æ÷T1£¬ÔÚ·½Ê½2ÖжϲúÉú²¨ÌØÂÊ
 PCON=0x00;   //SMOD=0
 SCON=0x50;   // ·½Ê½1 Óɶ¨Ê±Æ÷¿ØÖÆ
 TH1=0xfd;    //²¨ÌØÂÊÉèÖÃΪ9600
 TL1=0xfd;
 TR1=1;       //¿ª¶¨Ê±Æ÷T1ÔËÐпØÖÆÎ»

}




//*************************
//**********Ö÷º¯Êý*********
//*************************
main()
{
	 Initial_com();
	 while(1)
	 {
	
	 	 if(key1==0)
		{
			delay();	  //Ïû¶¶¶¯
			if(key1==0)	  //È·ÈÏ´¥·¢
			{
				 SBUF=0X01;
				 delay(200);
				
			
			}
	   
		}
		 
		  if(RI)
		  {
			date=SBUF;    //µ¥Æ¬»ú½ÓÊÜ
			SBUF=date;    //µ¥Æ¬»ú·¢ËÍ
			RI=0;
		  }
		
		
	  }
}

逻辑设计:

测距离:

        测速传感器输出为脉冲信号,一个脉冲中断一次﹔红外射线导通的时候是低电平,所以我们设置中断为低电平触法模式。一般码盘上有整数格子,无论是多少格其实原理一样,例如10格码盘,也就是有10个空格子,电机转一圈后便是射线导通10次,外部低电平触法10次﹔安装上面的思路,我们的测速传感器就可以发挥出效果了,我们知道一圈就有10个中断,于是我们计算中断次数,得到的总次数除于10也就是电机转动次数了,然后按照轮子的周长,计算轮子一圈是多长,就可以推算出小车已经跑多远了。

测速度;

        按照测距离的思路,我们用一个MCU定时器计算,1秒内接收多少个外部中断,例如一秒内接收了20个外部中断,我们就可以判断小车速度为i秒小车轮子转两圈,然后再计算出小车轮子的周长,就可得知小车1秒行驶的速度。

注意事项:

        正确接线!切勿将正负接反,使板子电子器件烧毁。Raspberry Pi
玩家应该设置MCU的I/o口为输入模式/接收模式,否则无法使用。其他MCU,或者更为高级的控制板如ARM这些,若需设置I/o口为输入输出模式,都必须设置为输入模式/接收模式,否则无法使用。51系列单片机可直接使用,无需设置输入输出模式。

### 使用STM32 HAL库实现对射红外传感器测速 #### 设备初始化与配置 为了使STM32能够通过HAL库处理来自对射红外传感器的数据,需先完成必要的硬件和软件初始化。这包括但不限于GPIO端口配置、外部中断(EXTI)线路设定以及定时器(Timer)资源准备。 对于GPIO端口而言,应将其模设为输入上拉或下拉状态以便于检测电平变化;而针对EXTI,则要指定哪个引脚触发何种类型的事件(上升沿/下降沿),从而启动相应的ISR (Interrupt Service Routine)[^1]。 ```c // 初始化 GPIO 和 EXTI 中断 static void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置 PA0 作为外部中断线 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* 设置优先级并启用 NVIC 中断通道 */ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } ``` #### 编写中断服务例程 当发生由红外光束遮挡引起的边沿跳变时,会激活预先定义好的中断向量表中的特定位置——即`EXTI0_IRQHandler()`函数,在这里可以增加计数值来统计单位时间内脉冲的数量,进而计算速度[^2]。 ```c volatile uint32_t pulse_count = 0; void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_0)) { __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0); // 清除标志位 pulse_count++; // 增加脉冲计数 } } ``` #### 定期读取数据并转换成实际物理意义的速度值 考虑到实时性和准确性之间的平衡,可以选择利用RTOS的任务调度机制或是简单的延时循环来周期性地获取当前累计的脉冲次数,并据此推算出瞬时转速或其他形的表现指标[^3]。 ```c float calculate_speed(uint32_t current_pulse_count, float time_interval_seconds) { const float pulses_per_rotation = 20.0f; // 每圈产生的脉冲数量 return ((current_pulse_count / pulses_per_rotation) * 60.0f) / time_interval_seconds; } int main(void) { ... while (true) { uint32_t start_pulses = pulse_count; HAL_Delay(1000); // 等待一秒 float speed_rpm = calculate_speed(pulse_count - start_pulses, 1.0f); printf("Current Speed: %.2f RPM\n", speed_rpm); } ... } ``` 上述代码片段展示了如何借助STM32 HAL库构建一套简易却有效的基于对射红外传感器的速度测量系统。值得注意的是,具体应用场合可能还需要考虑更多细节调整,比如滤波算法的应用以提高抗干扰能力等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式Dora

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

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

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

打赏作者

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

抵扣说明:

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

余额充值