背景介绍:

作为一种近距离通讯的方法,红外通讯在我们的日常生活中就有很多应用,电视遥控器,空调遥控以及风扇遥控这些都是典型应用,但是红外控制具体是怎么样实现的,这里将为大家做简单讲解。

 

内容概述:

1 红外解码原理介绍

2 红外解码代码实现

 源代码地址:https://github.com/bigbearishappy/BBear_balance_car

 

红外解码原理介绍:

         当我们按下遥控器后,遥控器发出一帧数据。这一帧数据由前导码、用户码高8位、用户码低8位、数据码、数据反码组成。其中前导码为9ms高电平接着4.5ms低电平,标志数据帧的开始;用户码(共16位)为红外接收器识别遥控器的身份的标志,不同的遥控器一般用户码不同,以防止不同电器设备之间遥控码的干扰;数据码为红外接收器识别遥控器上不同的按键的标志,对同一遥控器来说,按不同的键所发出的二进制编码具有相同的用户码,不同的数据码,如下图所示.数据反码用于信息正确接收校验。

1、16位用户码,8位数据码和8位数据反码中的数据位定义 

以脉宽0.56ms间隔0.565ms周期1.125ms表示二进制“0”,以脉宽0.56ms间隔1.69ms周期2.25ms表示二进制“1”,其波形分别如下图 (a)和(b)所示。

2、重复码 

以9ms高电平,2.25ms低电平,再0.56ms高电平定义为重复码,持续按键时,该键编码连续发送,首帧为数据帧,其后为重复码,周期为108ms,如图3所示。

 

接收端的解码原理  

         解码就是将HX1838输出的脉冲还原为二进制的“0”和“1”,得到二进制“0”,“1”序列,进而分析所含的用户码和数据码。当HX1838在遥控有效距离内,接收到红外遥控脉冲信号后,由内部转换成电压信号并经放大、长时控制、干扰抑制、带通滤波并整形后输出遥控代码脉冲.脉冲的形式为遥控器发射脉冲的倒像.图4表明了遥控发射码与HX1838解码输出码之间的波形关系. 

注意:

一定要注意,单片机接收端与发射端的信号是倒像关系,发射端引导码是9ms高电平,2.25ms低电平,在单片机接收端就变成了9ms低电平和2.25ms高电平,发射端发射位0,则单片机接收端为高电平。

 

红外解码代码实现

         根据前面的原理讲解可以发现,我们对于数据内容的解析主要分为四个具体内容,如下所示:

1 引导码

2 数据位0

3 数据位1

4 重复码

 

而这些内容在波形上的不同可以通过其高电平的持续时间来判断,具体持续时间如下:

1 引导码:4.5ms

2 数据位0:0.565ms

3 数据位1:1.69ms

4 重复码:2.25ms

 

如此一来就有了利用代码实现解码的思路:通过判断每个高电平的持续时间来得到数据内容,经过数据处理后得到具体控制数据。

 

现在来看看具体的代码实现:

源代码地址:https://github.com/bigbearishappy/BBear_balance_car

 

首先放上代码截图

分为三个地方,分别如下图1,图2,图3,图4所示: 

图1

图2

图3

图4

红外解码程序的核心思想是利用stm32定时器的上升沿与下降沿捕获功能,同时计量每次上升沿的时间,进而获取到数据内容。

 

下面一张一张图片为大家解释代码实现的具体过程:

图4:这张图中的代码的作用是将定时器2的通道4设置为输入捕获模式,并且捕获的边沿是上升沿捕获。

问题:

为什么要设置为上升沿捕获?

答:因为红外解码中引导码的第一个有变化的边沿就是上升沿。

 

图2:这张图中的代码是红外解码的核心代码,涉及到了高电平持续时间的计量,信号内容的具体解析,以及信号具体内容的合成。下面是详细解析:

Line477这行是在检测到上升沿后就进入到if语句内部,这个if内部分为两个部分,分别为line478~line481还有line482~line503,

其中line478~line481为检测到上升沿并且读取的相应IO口电平(GPIOA3)为高时则将触发边沿改为下降沿同时清0定时器以及相关变量的置位操作。

Line482~line503部分的代码就是在检测到上升沿后对根据高电平持续时间的不同而解析出具体数据的实现。其中对于时间的处理上采用了一个范围值,这种方法可以避免遥控器的差异而导致的数据误差,减少了解析错误率。

 

图1:这张图中的代码主要是判断一个按键的数据内容是否接受完成,如果接受完成则对相应的位进行置位操作。

 

图3:这张图中的代码就是红外解析功能对外提供的一个接口函数,外部代码通过调用这个接口函数就可以获取到最新解析出的控制命令。进而完成相关操作,大家可以通过串口将获取到的红外解码数据打印到串口调试助手中进行查看。

 

刚才一直有提到一个置位操作,在这里具体指的是对代码中的RmtSta这个变量的操作,这个变量中每一位的意义如下所示:

Bit7:标记是否接收到引导码   

1:已经接收到引导码  0:没有接收到引导码

Bit6:标记是否接收完成一个按键信息

1:已经接收完成一个按键信息  0:没有接收完成一个按键信息

Bit5:无

Bit4:标记是否已经捕获上升沿

1:已经捕获到上升沿   0:没有捕获到上升沿

Bit3~bit0:这4位是用来进行计数的,它们的计数内容与引导码有关。达到一定数值后清除引导码标志位进而方便下次接收引导码。

 

同时放上通过逻辑分析仪抓取的波形图:

可以看出图中开始部分为一个数据包的内容,后面紧接着的是重复码,与我们之前讲解的原理一致。

 

欢迎大家关注我的个人公众号“四点能

公众号里我会根据基础技术制作出有趣的东西,我们一起体会技术的乐趣

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐