STM32CUBEME(5)--自定义红外NEC解码,定时器TIM捕获方式

概述

本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。

硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:
在这里插入图片描述

选择芯片型号

在这里插入图片描述

配置时钟源

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可:
在这里插入图片描述

串口配置

本次实验使用的串口1进行串口通信,波特率配置为115200。
在这里插入图片描述

定时器配置

本次使用定时器1的通道2进行检测,配置入下。
在这里插入图片描述

红外接收管

这里使用VS838的接收管,如下所示:
在这里插入图片描述

红外编码

NEC协议载波:38khz
其逻辑1与逻辑0的表示如图所示:
在这里插入图片描述
NEC协议格式:
在这里插入图片描述

自定义红外编码

本文中数据1的低占空比设置为1120us,总时间为1.68ms,不是上图的2.25ms。

协议如下:

在这里插入图片描述

代码

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END 0 */

定时器配置

  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start(&htim1);
	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);
	printf("IR Capture !! \r\n");

  /* USER CODE END 2 *

红外接收代码

  • [4400,5000]是用于捕获4.5ms的信号
  • [550,700]是用于捕获560us的数据0信号
  • [1100,1250]是用于捕获1120us的数据1信号
  • [2000,2500]是用于捕获2240us的截止位信号
/* USER CODE BEGIN 4 */
// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	uint32_t fallingCount = 0 ; // 下降沿计数
	uint8_t temp = 0 ;
	// 判断是否是定时器1的外部捕获口2
	if(htim->Instance == TIM1)
	{
		// 捕获到了上升沿
		if(IR_IN1)
		{
			__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
			__HAL_TIM_SET_COUNTER(htim, 0); // 计数清零,从头开始计
		}
		else
		{
			fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 读取捕获计数,这个时间即为上升沿持续的时间
			__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿捕获
			if( ((fallingCount > 4400) && (fallingCount <5000))) 
				OK = 1;/// 4.5ms引导电平
			else if (((fallingCount > 550) && (fallingCount < 700)))	
			{
				temp = 0;//560 us,数据为0
			}	
			else if (((fallingCount > 1100) && (fallingCount < 1250)))
			{
			
				temp = 1;//1120 us,数据为1
			}
			
			else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500)))	//2.240ms截止码
			{
			  ReadyFlag = 1 ;
				OK = 0;
			}
			if(OK)
			{
				OrderData <<= 1 ;
				OrderData += temp ;
				KeyCount = 0; // 按键次数
			}
		}
	}
}
/* USER CODE END 4 */

结果演示

红外连续发送5次码值,发送分别为

  • 0101 0101(85)
  • 0000 0011(3)
  • 0000 1100(12)
  • 0011 1100(48)
  • 1100 0000(192)

分别如下所示:
在这里插入图片描述

最后

关注微信公众号『记贴』,持续更新文章和学习资料,可加作者的微信交流学习!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_24312945/article/details/106788973