一、简介:
由于在B站上很多人私信我要红外遥控源码,因此本期出一期讲解,不会涉及很深入的理论讲解请放心享用,如果需要源码评论区留下邮箱,笔者看到第一时间会发送到指定邮箱。本章讲解红外收发原理以及实验,如有不对请大家指出改正。
二、传感器:
市面上有很多红外收发模块,以及遥控器,遥控器里面也是内嵌一个红外发射模块哈,我们可以购买如下常见的传感器作为本次实验器件。
三、红外收发原理:
3.1、 原理:
首先红外收发是基于NEC协议的,要知道它发送时是以38Khz的载波将数据发送出去的,为什么使用38Khz?因为38Khz不容易被干扰!,因此只需要将定时器调制成38Khz,然后按照NEC协议即可发送数据;那么接收呢?很简单接收的时候与发送是反相的电平,比如发送9ms高电平,那么接收的时候是9ms低电平;为什么是反相?这就跟NEC协议有关了,我们继续往下看。
3.2、NEC协议:
3.2.1 简介:
NEC协议红外遥控通信中广泛使用的一种协议,通常使用38kHz的载波频率进行调制,它采用了反相逻辑,在传输过程中,逻辑‘1’可能对应于红外LED的关闭状态(即没有光发射),而逻辑‘0’则对应于开启状态(即有光发射),因此接收时反过来接收判断即可。
3.2.2 NEC协议帧:
协议帧内由几个重要的码制,如下图,后面的高低电平时间的组合就得到前面的码制,引导码就可以理解为帧头,重复码就是长按的时候命令的重复发送,而不重新发送完整的地址和命令数据。
① 引导码:9ms的低电平+4.5ms的高电平
② 重复码:9ms的低电平+2.25ms的高电平
③ 数据1: 560us的低电平+1680us的高电平
④ 数据0: 560us的低电平+560us的高电平
3.2.3 NEC数据格式:
通过3.2.2学习我们知道了各种码制,可见下图,实际上结束码不存在图里面显化,这是因为结束码实际就是一个时间间隔,标志着一次完整消息的结束。这个高电平的时间长度可以更长,取决于控制器何时开始下一次传输。一帧完整的数据帧格式应由如下组成:
五、代码实现:
5.1、STM32红外发送逻辑:
extern uint16_t cmt;
/**************************************************************************
** -------------------------------------------------------------------- **
** @name : ADVANCE_TIM_Mode_Config
** @brief : None
** @param : None
** @retval : None
** @author data : 轩哥 2023-05-15
** @attention : None
** -------------------------------------------------------------------- **
**************************************************************************/
static void ADVANCE_TIM_Mode_Config(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure; //输出比较定时器结构体声明
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定时器时基结构体声明
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); // 开启定时器时钟,即内