第三十二章 红外遥控实验 本章,我们将向大家介绍如何通过STM32来解码红外遥控器的信号。ALIENTK战舰STM32开发板标配了红外接收头和一个很小巧的红外遥控器。在本章中,我们将利用STM32的输入捕获功能,解码开发板标配的这个红外遥控器的编码信号,并将解码后的键值TFTLCD模块上显示出来。本章分为如下几个部分: 32.1 红外遥控简介 32.2 硬件设计 32.3 软件设计 32.4 下载验证 32.1红外遥控简介 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。 红外遥控的编码目前广泛使用的是:NEC Protocol 的PWM(脉冲宽度调制)和Philips RC-5 Protocol 的PPM(脉冲位置调制)。ALIENTEK战舰STM32开发板配套的遥控器使用的是NEC协议,其特征如下: 1、8位地址和8位指令长度; 2、地址和命令2次传输(确保可靠性) 3、PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”; 4、载波频率为38Khz; 5、位时间为1.125ms或2.25ms; 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高电平组成),如果在一帧数据发送完毕之后,按键仍然没有放开,则发射重复码,即连发码,可以通过统计连发码的次数来标记按键按下的长短/次数。 第十五章我们曾经介绍过利用输入捕获来测量高电平的脉宽,本章解码红外遥控信号,刚好可以利用输入捕获的这个功能来实现遥控解码。关于输入捕获的介绍,请参考第十五章的内容。 32.2硬件设计 本实验采用定时器的输入捕获功能实现红外解码,本章实验功能简介:开机在LCD上显示一些信息之后,即进入等待红外触发,如过接收到正确的红外信号,则解码,并在LCD上显示键值和所代表的意义,以及按键次数等信息。同样我们也是用LED0来指示程序正在运行。 所要用到的硬件资源如下: 1) 指示灯DS0 2)TFTLCD模块(带触摸屏) 3) 红外接收头 4) 红外遥控器 前两个,在之前的实例已经介绍过了,遥控器属于外部器件,遥控接收头在板子上,与MCU的连接原理图如32.2.1所示: 图32.2.1 红外遥控接收头与STM32的连接电路图 红外遥控接收头连接在STM32的PB9(TIM4_CH4)上。硬件上不需要变动,只要程序将TIM4_CH4设计为输入捕获,然后将收到的脉冲信号解码就可以了。 开发板配套的红外遥控器外观如图32.2.2所示: 图32.2.2 红外遥控器 32.3软件设计 打开上一章的工程,首先在HARDWARE文件夹下新建一个REMOTE的文件夹。然后新建一个remote.c和remote.h的文件保存在REMOTE文件夹下,并将这个文件夹加入头文件包含路径。 打开remote.c文件,输入如下代码: #include "remote.h" #include "delay.h" #include "usart.h" //红外遥控初始化 //设置IO以及定时器4的输入捕获 void Remote_Init(void) { RCC->APB1ENR|=1ODR|=1PSC=71; //预分频器,1M的计数频率,1us加1. TIM4->CCMR2|=1 |
非常感谢 |