本帖最后由 mars4zhu 于 2014-9-25 23:46 编辑
LPCXpresso1549试用报告——
基于LPC15xx的智能自学习万用红外遥控器
| |
| LPCXpresso1549, LPC1549, Keil MDK,万用红外遥控,智能遥控器,自学习 |
| 本文记述了采用LPC15xx系列芯片设计开发的智能自学习万用红外遥控器,采用HS0038B一体化红外接收头接收原配遥控器波形,并使用LPC15xx的SysTimer记录波形脉冲间隔。并将记录的间隔数据控制LPCX15xx的SCT生成38K载波,驱动外部红外二极管。实现学习-控制的红外遥控。 |
Mar4zhu
目 录
插图索引
表格索引
错误!未找到目录项。
1 概述空调已进入千家万户,空调遥控器作为空调的用户界面,其设计的原理已成熟。目前,对学习型智能遥控器的研制开展了大量的工作,旨在提高遥控器的智能化和通用性,取得了较大的进展,并有部分产品进入市场。当前研制开发的学习型智能遥控器主要采用38KHz固定载波频率,接收学习已有遥控器发出的红外编码,储存在自身内部并映射在固定实体面板的每个按键上。
遥控器其核心元器件就是编码芯片,将需要实现的操作指令例如选台、快进等事先编码,设备接收后解码再控制有 关部件执行相应的动作。显然,接收电路及CPU也是与遥控器的编码一起配套设计的。编码是通过载波输出的,即所有的脉冲信号均调制在载波上,载波频率通常 为38K。载波是电信号去驱动红外发光二极管,将电信号变成光信号发射出去,这就是红外光,波长范围在840nm到960nm之间。在接收端,需要反过来 通过光电二极管将红外线光信号转成电信号,经放大、整形、解调等步骤,最后还原成原来的脉冲编码信号,完成遥控指令的传递,这是一个十分复杂的过程。
2 设计要求本项目采用基于LPC15xx的LPCXpresso1549开发板,板载一个三色LED,用于状态指示。三个用户按键,其中一个(SW1)作为模式按键,在学习与发射状态之间切换。另外两个按键(SW2/SW3)作为遥控按键。外部连接HS0038B一体化红外接收头,利用PINT中断检测输出的遥控代码波形间隔时间并存储。利用LPC15xx内部的SCT3生成38K的红外载波,并按照存储的代码波形间隔数据,控制输出到外部引脚。输出引脚连接红外二极管,生成所需的遥控红外信号。达到遥控的目的。
该设计在物理层直接学习遥控代码,不进行任何解码。同时代码尽量采用可移植性编写,仅仅需要硬件支持生成38KHz的高低电平信号和50us中断,以及外部引脚上升/下降沿中断。
3 硬件设计根据设计要求,硬件电路实物图如下,其中电源采用手机移动充电宝提供:
图 31 智能自学习万用红外遥控器的硬件实物图
4 软件设计4.1. 用户交互用户交互的状态图如下:
图 41 智能自学习万用红外遥控器的的用户交互状态图
在按键中断以及相应的接收、发射中断中完成状态切换,对应的代码如下:
4.2. 遥控波形学习使用HS0038B的边沿触发中断PINT,在中断例程中记录Systicker的计时并保存。从而保存波形间隔的数据。
- void PIN_INT3_IRQHandler(void) {
- LPC_PINT->IST =1<<3; // clear the PINT3
- static unsigned int IREdgeCount = 0;
-
- if (IREdgefirst == 0) {
- IREdgefirst = 1;
- IREdgeCount = 0;
- SysTickers_50us = 0;
- }
- else {
- if (IREdgeCount <= MAXDATAPULSE) { // store the tickers of time to rawBuf.
- buf[tempRecvIndex].Pulse[IREdgeCount] = SysTickers_50us;
- IREdgeCount++;
- buf[tempRecvIndex].PulseNumber = IREdgeCount;
- SysTickers_50us = 0;
- }
- // Too large IR, skip
- else {
- IREdgefirst = 0;
- }
- }
- }
复制代码
4.3. 遥控波形生成采用SysTicker定时控制SCT3的启动与停止,从而生成38KHz的包络(调制前的原始数据波形),采用SCT3生成38KHz载波(调制后的载波波形),最后通过引脚控制红外LED,发射红外遥控信号。以下程序每隔50us执行一次。
- static inline void IRtransmitHook() {
- if (currentPulseNumber <= buf[tempTransIndex].PulseNumber) {
- if((SysTickers_50us+4) >= buf[tempTransIndex].Pulse[currentPulseNumber]) {
- SysTickers_50us = 0;
- currentPulseNumber++;
- }
- if(currentPulseNumber %2) IR38K_Stop();
- else IR38K_Start();
- }
- else {
- IR38K_Stop();
- currentPulseNumber = 0;
- change2State(STATE_TRANSMIT_KEY);
- }
- return ;
- }
复制代码
波形测试硬件电路与波形截图分别如下。
图 42 红外遥控接收的硬件测试电路图
图 43 “开/关”键码全貌图(上:接收;下:发送)
图 44 38KHz载波截图
发送红外二极管引脚对地电压(红外二极管阳极连接VCC,因此此处测出低电平代表二极管发射红外光,可见载波频率38KHz,占空比(26-9):26 ~= 1:3)
图 45 发射波形与接收输出波形
从图中可以看到,发射的38KHz的载波,在一体化红外接收管HS0038B的解调下,已经将载波去除,而只输出原始波形即38KHz波形的包络(envelope)
5 实现效果
图 51 发射波形与接收输出波形
6 总结本项目灵活利用了NXP的LPC15xx芯片的各项外设功能,而SWM模块可自由分配功能到各个引脚。多个Timer并可灵活配置各个事件、多通道比较器等性能可快速实现应用开发。
本项目依然存在一些不完善的地方。需要改进。
版本历史(Revision History)
LPC1500体验 (6)基于LPC15xx的智能自学习万用红外遥控器.pdf
(694.32 KB, 下载次数: 25)
LPC_IrRemote.rar
(116.29 KB, 下载次数: 26)