5.STM32_红外接收解码(外部中断)

STM32_红外接收解码(外部中断)

1.硬件

硬件:Nucleo-F103RBTx、红外接收管
注意事项:市面上红外接收管型号很多,引脚排序方式也不同,需注意引脚的排列方式,硬件不要接错了。
在这里插入图片描述
硬件连接:红外接收管与Nucleo-f103开发板用杜邦线按照下表进行连接
在这里插入图片描述

2.软件

CubeMX配置
PA8配置为外部中断模式,上/下沿方式触发,配置上拉电阻,使能中断,默认优先级。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码编写
根据正点原子库函数改写。

(1).hw.h

#ifndef _HW_H
#define _HW_H

#include "main.h"

//定义全局变量
extern uint32_t hw_code;
extern uint8_t  hw_flag;

void delay_us(uint32_t us);
uint8_t HW_time(void);

#endif

(2).hw.c

#include "hw.h"

uint32_t hw_code;	  //定义一个32位数据变量,保存接收码
uint8_t  hw_flag;  //定义一个8位数据的变量,用于指示接收标志


//微秒级延时函数,系统时钟频率位64MHz
void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 6000000 * us);
    while (delay--)
	{
		;
	}
}

//判断是否接收到有效红外信号(高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us)
uint8_t HW_time()
{
	uint8_t t=0;
	while(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)//高电平
	{
		t++;
		delay_us(20);
		if(t>=250) 
			return t;//超时溢出
	}
	return t;
}

//红外遥控外部中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	uint8_t Tim=0,Ok=0,Data,Num=0;
   while(1)
   {
	   	if(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)
			{
			  Tim=HW_time();//获得此次高电平时间
				
			  if(Tim>=250) 
					break;//不是有用的信号
				
			  if(Tim>=200 && Tim<250)
			  {
			 	  Ok=1;//收到起始信号
			  }
			  else if(Tim>=60 && Tim<90)
			  {
			 	  Data=1;//收到数据 1
			  }
			  else if(Tim>=10 && Tim<50)
			  {
			  	Data=0;//收到数据 0
			  }
				else
					break;

			  if(Ok==1)
			  {
			 	  hw_code<<=1;
				  hw_code+=Data;

				  if(Num>=32)
				  {
					  hw_flag=1;
				  	break;
				  }
			  }
			  Num++;
			}
   }
}

(3).main.c

while (1)
  {
  /* USER CODE BEGIN 3 */
		if(hw_flag==1)	 //如果红外接收到有效信号
		{
			hw_flag=0;	   //清除接收标志
			printf("红外接收码 %0.8X\r\n",hw_code);	//打印
			hw_code=0;		 //接收码清零
		}		
		HAL_Delay(10);
  }
  /* USER CODE END 3 */

如何实现串口发送功能此处省略。

3.操作

在这里插入图片描述
连接串口助手,红外遥控器对着红外接收管任意按键,当检测到有信号输入,单片机对信号解码并串口打印出来。

STM32外部中断红外遥控解码是指利用STM32微控制器的外部中断功能对红外遥控信号进行解码的过程。 首先,我们需要了解红外遥控信号的工作原理。红外遥控信号是通过红外线传输的,信号的编码通常采用NEC、RC5等协议。主要包括起始位码、地址码和命令码等。 解码的第一步是利用红外接收器将红外遥控信号转化为电信号。常用的红外接收器有红外管、红外模块等。电信号经过红外接收器的解调,得到了红外遥控信号的脉冲宽度调制(PWM)信号。 接下来,我们需要利用STM32外部中断功能对红外遥控信号进行解码。首先,需要配置STM32的GPIO引脚为外部中断模式,并设置中断触发方式。常用的触发方式有上升沿触发、下降沿触发和双边沿触发等。 当红外接收到PWM信号后,触发外部中断,将中断引脚与STM32外部中断输入管脚连接。当外部中断触发时,STM32会跳转到相应的中断服务函数进行处理。 在中断服务函数中,我们可以利用定时器和输入捕获功能来测量PWM信号的高电平时间和低电平时间。利用这些时间信息,我们可以解析出红外遥控信号的起始位码、地址码和命令码。 解码完成后,我们可以根据实际需求对红外遥控信号进行相应的处理。比如,可以控制某些设备的开关状态、调节音量、切换频道等。 需要注意的是,在实际应用中,还需要考虑红外遥控干扰、多个按键同时按下等问题,以提高系统的稳定性和抗干扰能力。 综上所述,STM32外部中断红外遥控解码是一种使用STM32微控制器的外部中断功能,对红外遥控信号进行解码的技术。通过这种技术,我们可以实现对红外遥控信号的解析和响应,从而控制不同设备的功能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值