|
最近在项目中添加了使用红外遥控的功能,可以在产品不打开盖的情况下修改参数。下面简单介绍一下基于NXP的LPC1752实现红外遥控的过程。 使用的红外接收器型号是ROHM的RPM7238-H8R,该型号的载波频率是 37.9KHZ。红外遥控分为两种编码方式:PWM编码(脉宽调制)和PPM编码(脉冲位置调制)。该型号采用的是PPM方式。关于这两种方式的不同,可以在网上搜索一下。PPM遥控编码脉冲由前导码、16位地址码(8位地址码、8 位地址码的反码)和16位操作码(8位操作码、8位操作码的反码)组成。
PPM通过脉冲串之间的时间间隔来实现信号的调制。逻辑“0”是由0.56ms的38KHZ载波和0.560ms的无 载波间隔组成;逻辑“1”是由0.56ms的38KHZ载波和1.68ms的无载波间隔组成;结束位是0.56ms的38K载波。
硬件原理图 红外接收器的输出引脚接到LPC1752的P0.3口,使用3.3V供电。下图是RPM7238与LPC1752的连接图。
红外接收器接收到红外线信号后,经过内部的放大、检波、整型后滤除了37.9KHz的载波,输出接收到的信号。下图是红外接收器的内部原理框图。
输出的有用信号与原PPM编码信号相反,如下图接收到的波形与对应输出波形:
程序介绍 项目中使用LPC1752的P0.3口连接到红外接收器,因此设定P0.3为输入引脚。每隔20uS读取红外接收器的引脚状态,RPM7238没有接收到红外信号时输出高电平,接收到红外信号的引导程序后,输出低电平,然后进入解码函数。 解码过程中共有六种状态: - typedef enum _IR_STATE {
- IR_STATE_IDLE,
- IR_STATE_BOOT,
- IR_STATE_RECV_HIGH,
- IR_STATE_RECV_LOW,
- IR_STATE_RECV_OK,
- IR_STATE_ERROR
- } IR_STATE;
复制代码IR_STATE_IDLE:空闲状态,等待接收红外遥控的引导程序 IR_STATE_BOOT:引导程序处理,如果引导程序持续时间4.5ms,则转到接收程序。如果持续时间是2.25ms,则判定为重复信号。 IR_STATE_RECV_HIGH:接收数据的高电平处理,等待数据的低电平 IR_STATE_RECV_LOW:接收数据的低电平处理,如果低电平持续时间等于1.5ms,则接收的数据为'1',如果持续的时间为0.5ms,则接收的数据为'0'; IR_STATE_RECV_OK:接收数据完成,置位标志位IRKey_Recv_Finished。 IR_STATE_ERROR:数据处理过程中出错,返回空闲状态。 以下代码是解码函数: 主函数每次查询该标志位,如果为1,则进入键值处理函数。接收数据的后16位是具体的键值。 - void IRKey_Recv_App()
- {
- uint8_t Key_value;
- uint8_t Recv_buf, Recv_buf_reverse;
- if(IRKey_Recv_Finished == 1)
- {
- IRKey_Recv_Finished = 0;
- Recv_buf = IRKey_Recv_Value >> 24;
- Recv_buf_reverse = (IRKey_Recv_Value >> 16) & 0xFF;
- // if(Recv_buf == (uint8_t)~Recv_buf_reverse)
- if(Recv_buf == 0xE1 && Recv_buf_reverse == 0xA2)
- {
- Recv_buf = IRKey_Recv_Value >> 8;
- Recv_buf_reverse = IRKey_Recv_Value & 0xFF;
- if( Recv_buf == (uint8_t)~Recv_buf_reverse)
- {
- Key_value = Recv_buf;
- }
- }
- }
- }
复制代码 |