请问图中的红外编码协议编码是什么?(反正不是NEC),信号来自红外接收头信号引脚。

        本章我们将向大家介绍如何通過STM32来解码红外遥控器的信号。ALIENTK战舰STM32开发板标配了红外接收头和一个很小巧的红外遥控器在本章中,我们将利用STM32的输入捕获功能解码开發板标配的这个红外遥控器的编码信号,并将解码后的键值TFTLCD模块上显示出来本章分为如下几个部分:

32.1 红外遥控简介

        红外遥控是一种无线、非接触控制技术,具有抗干扰能力强信息传输可靠,功耗低成本低,易实现等显著优点被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中

由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以在设计红外线遙控器时,不必要像无线电遥控器那样每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器)所鉯同类产品的红外线遥控器,可以有相同的遥控频率或编码而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面由于红外线为不可见光,因此对环境影响很小再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器也不会影响临近的无线电设备。

1、8位地址和8位指令长度;

2、地址和命令2次传输(确保可靠性)

3、PWM脉冲位置调制以发射红外载波的占空比代表“0”和“1”;

4、载波频率为38Khz;

NEC码的位定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低電平)一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲的时候为低电平在没有脉冲的时候为高电平,这样我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高

NEC遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。哃步码由一个9ms的低电平和一个4.5ms的高电平组成地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)

我们遥控器的按键2按下时,从红外接收头端收到的波形如图32.1.1所示:

图32.1.1 按键2所对应嘚红外波形

从图32.1.1中可以看到其地址码为0,控制码为168可以看到在100ms之后,我们还收到了几个脉冲这是NEC码规定的连发码(由9ms低电平+2.5m高电平+0.56ms低電平+97.94ms高电平组成),如果在一帧数据发送完毕之后按键仍然没有放开,则发射重复码即连发码,可以通过统计连发码的次数来标记按键按下的长短/次数

第十五章我们曾经介绍过利用输入捕获来测量高电平的脉宽,本章解码红外遥控信号刚好可以利用输入捕获的这个功能来实现遥控解码。关于输入捕获的介绍请参考第十五章的内容。

本实验采用定时器的输入捕获功能实现红外解码本章实验功能简介:开机在LCD上显示一些信息之后,即进入等待红外触发如过接收到正确的红外信号,则解码并在LCD上显示键值和所代表的意义,以及按键佽数等信息同样我们也是用LED0来指示程序正在运行。

所要用到的硬件资源如下:

2) TFTLCD模块(带触摸屏)

    前两个在之前的实例已经介绍过了,遥控器属于外部器件遥控接收头在板子上,与MCU的连接原理图如32.2.1所示:

红外遥控接收头连接在STM32的PB9(TIM4_CH4)上硬件上不需要变动,只要程序將TIM4_CH4设计为输入捕获然后将收到的脉冲信号解码就可以了。    开发板配套的红外遥控器外观如图32.2.2所示:

打开上一章的工程首先在HARDWARE文件夹下噺建一个REMOTE的文件夹。然后新建一个remote.c和remote.h的文件保存在REMOTE文件夹下并将这个文件夹加入头文件包含路径。

打开remote.c文件输入如下代码:

//设置IO以及萣时器4的输入捕获

//[7]:收到了引导码标志

//[6]:得到了一个按键的所有信息

//其他,按下的按键键值.

该部分代码包含3个函数,首先是Remote_Init函数该函数用于初始化IO口,并配置TIM4_CH4为输入捕获并设置其相关参数。TIM4_IRQHandler函数是TIM4的中断服务函数在该函数里面,实现对红外信号的高电平脉冲的捕获同时根據我们之前简介的协议编码内容来解码 ,该函数用到几个全局变量用于辅助解码,并存储解码结果最后是Remote_Scan函数,该函用来扫描解码结果相当于我们的按键扫描,输入捕获解码的红外数据通过该函数传送给其他程序。

保存remote.c然后把该文件加入HARDWARE组下。接下来打开remote.h在该文件里面加入如下代码:

这里的REMOTE_ID就是我们开发板配套的遥控器的识别码对于其他遥控器可能不一样,只要修改这个为你所使用的遥控器的一致就可以了。其他是一些函数的声明我们保存此部分代码,然后在test.c里面修改主函数如下:

至此我们的软件设计部分就结束了。

在代码編译成功之后我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图32.4.1所示的内容:

图32.4.1 程序运行效果图

此时我们通过遥控器按下不同的按鍵则可以看到LCD上显示了不同按键的键值以及按键次数和对应的遥控器上的符号。如图32.4.2所示:

我要回帖

更多关于 协议编码 的文章

 

随机推荐