3473|1

659

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

LPC1500体验+(6)基于LPC15xx的智能自学习万用红外遥控器——全原创项目 [复制链接]

本帖最后由 mars4zhu 于 2014-9-25 23:46 编辑






LPCXpresso1549试用报告——
基于LPC15xx的智能自学习万用红外遥控器


文档编号
AN-0002-A0
关键字
LPCXpresso1549,  LPC1549, Keil MDK,万用红外遥控,智能遥控器,自学习
摘要
本文记述了采用LPC15xx系列芯片设计开发的智能自学习万用红外遥控器,采用HS0038B一体化红外接收头接收原配遥控器波形,并使用LPC15xxSysTimer记录波形脉冲间隔。并将记录的间隔数据控制LPCX15xxSCT生成38K载波,驱动外部红外二极管。实现学习-控制的红外遥控。








Mar4zhu

目  录






插图索引




表格索引

错误!未找到目录项。



1 概述
空调已进入千家万户,空调遥控器作为空调的用户界面,其设计的原理已成熟。目前,对学习型智能遥控器的研制开展了大量的工作,旨在提高遥控器的智能化和通用性,取得了较大的进展,并有部分产品进入市场。当前研制开发的学习型智能遥控器主要采用38KHz固定载波频率,接收学习已有遥控器发出的红外编码,储存在自身内部并映射在固定实体面板的每个按键上。
遥控器其核心元器件就是编码芯片,将需要实现的操作指令例如选台、快进等事先编码,设备接收后解码再控制有 关部件执行相应的动作。显然,接收电路及CPU也是与遥控器的编码一起配套设计的。编码是通过载波输出的,即所有的脉冲信号均调制在载波上,载波频率通常 为38K。载波是电信号去驱动红外发光二极管,将电信号变成光信号发射出去,这就是红外光,波长范围在840nm960nm之间。在接收端,需要反过来 通过光电二极管将红外线光信号转成电信号,经放大、整形、解调等步骤,最后还原成原来的脉冲编码信号,完成遥控指令的传递,这是一个十分复杂的过程。
2 设计要求
本项目采用基于LPC15xxLPCXpresso1549开发板,板载一个三色LED,用于状态指示。三个用户按键,其中一个(SW1)作为模式按键,在学习与发射状态之间切换。另外两个按键(SW2/SW3)作为遥控按键。外部连接HS0038B一体化红外接收头,利用PINT中断检测输出的遥控代码波形间隔时间并存储。利用LPC15xx内部的SCT3生成38K的红外载波,并按照存储的代码波形间隔数据,控制输出到外部引脚。输出引脚连接红外二极管,生成所需的遥控红外信号。达到遥控的目的。
该设计在物理层直接学习遥控代码,不进行任何解码。同时代码尽量采用可移植性编写,仅仅需要硬件支持生成38KHz的高低电平信号和50us中断,以及外部引脚上升/下降沿中断。
3 硬件设计
根据设计要求,硬件电路实物图如下,其中电源采用手机移动充电宝提供:

图 31   智能自学习万用红外遥控器的硬件实物图
4 软件设计4.1. 用户交互
用户交互的状态图如下:

图 41   智能自学习万用红外遥控器的的用户交互状态图
在按键中断以及相应的接收、发射中断中完成状态切换,对应的代码如下:

  1. void change2State(State newState) {

  2. if (state != STATE_ERROR_INPUT)

  3. lastState = state;

  4. state = newState;        

  5. switch(state) {

  6. case STATE_TRANSMIT_IR:

  7. SysTickers_50us = 0;

  8. break;        

  9. case STATE_TRANSMIT_KEY:        

  10. break;        

  11. case STATE_STUDY_IR:

  12. IREdgefirst = 0;

  13. enableIRrecvInt();

  14. break;        

  15. case STATE_STUDY_KEY:

  16. disableIRrecvInt();

  17. break;        

  18. case STATE_ERROR_INPUT:

  19. blinkNumber = 3;

  20. break;        

  21. default:

  22. break;

  23. }

  24. showStateLED();

  25. }

  26. 三个用户按键的中断服务程序和状态切换。

  27. void PIN_INT0_IRQHandler(void) {

  28.     LPC_PINT->IST =1<<0; // clear the PINT0

  29. switch(state) {

  30. case STATE_TRANSMIT_KEY:

  31. change2State(STATE_STUDY_IR);

  32. break;

  33. case STATE_STUDY_IR:

  34. change2State(STATE_TRANSMIT_KEY);

  35. break;

  36. case STATE_ERROR_INPUT:

  37. break;

  38. default:

  39. change2State(STATE_ERROR_INPUT);

  40. break;

  41. }

  42. return;

  43. }



  44. void PIN_INT1_IRQHandler(void) {

  45.     LPC_PINT->IST =1<<1; // clear the PINT1

  46. uint8_t temp = 0;

  47.     switch(state) {        

  48. case STATE_TRANSMIT_KEY:

  49. if(buf[SW1Index].PulseNumber > 0) {

  50. tempTransIndex = SW1Index;

  51. change2State(STATE_TRANSMIT_IR);

  52. }

  53. else change2State(STATE_ERROR_INPUT);

  54. break;

  55. case STATE_STUDY_KEY:

  56. temp = SW1Index;

  57. SW1Index = tempRecvIndex;

  58. tempRecvIndex = temp;

  59. change2State(STATE_STUDY_IR);

  60. break;

  61. case STATE_ERROR_INPUT:

  62. break;

  63. default:

  64. change2State(STATE_ERROR_INPUT);

  65. break;

  66. }

  67. return;

  68. }



  69. void PIN_INT2_IRQHandler(void) {

  70.     LPC_PINT->IST =1<<2; // clear the PINT2

  71. uint8_t temp = 0;

  72.         switch(state) {        

  73. case STATE_TRANSMIT_KEY:

  74. if(buf[SW2Index].PulseNumber > 0) {

  75. tempTransIndex = SW2Index;

  76. change2State(STATE_TRANSMIT_IR);

  77. }

  78. else change2State(STATE_ERROR_INPUT);

  79. break;

  80. case STATE_STUDY_KEY:

  81. temp = SW2Index;        

  82. SW2Index = tempRecvIndex;

  83. tempRecvIndex = temp;

  84. change2State(STATE_STUDY_IR);

  85. break;

  86. case STATE_ERROR_INPUT:

  87. break;

  88. default:

  89. change2State(STATE_ERROR_INPUT);

  90. break;

  91. }

  92. return;

  93. }
复制代码


4.2.         遥控波形学习
使用HS0038B的边沿触发中断PINT,在中断例程中记录Systicker的计时并保存。从而保存波形间隔的数据。

  1. void PIN_INT3_IRQHandler(void) {

  2.     LPC_PINT->IST =1<<3; // clear the PINT3

  3.     static unsigned int IREdgeCount = 0;

  4.    

  5. if (IREdgefirst == 0) {

  6. IREdgefirst = 1;

  7. IREdgeCount = 0;        

  8. SysTickers_50us = 0;

  9. }

  10. else {

  11. if (IREdgeCount <= MAXDATAPULSE) { // store the tickers of time to rawBuf.

  12. buf[tempRecvIndex].Pulse[IREdgeCount] = SysTickers_50us;

  13. IREdgeCount++;

  14. buf[tempRecvIndex].PulseNumber = IREdgeCount;

  15. SysTickers_50us = 0;

  16. }

  17. // Too large IR, skip

  18. else {

  19. IREdgefirst = 0;

  20. }

  21. }

  22. }
复制代码


4.3. 遥控波形生成
采用SysTicker定时控制SCT3的启动与停止,从而生成38KHz的包络(调制前的原始数据波形),采用SCT3生成38KHz载波(调制后的载波波形),最后通过引脚控制红外LED,发射红外遥控信号。以下程序每隔50us执行一次。
  1. static inline void IRtransmitHook() {

  2. if (currentPulseNumber <= buf[tempTransIndex].PulseNumber) {

  3. if((SysTickers_50us+4) >= buf[tempTransIndex].Pulse[currentPulseNumber]) {

  4. SysTickers_50us = 0;

  5. currentPulseNumber++;

  6. }

  7. if(currentPulseNumber %2) IR38K_Stop();

  8. else IR38K_Start();

  9. }

  10. else {

  11. IR38K_Stop();

  12. currentPulseNumber = 0;

  13. change2State(STATE_TRANSMIT_KEY);

  14. }

  15. return ;

  16. }
复制代码

波形测试硬件电路与波形截图分别如下。

图 42   红外遥控接收的硬件测试电路图

图 43   “开/关”键码全貌图(上:接收;下:发送)

图 44   38KHz载波截图
发送红外二极管引脚对地电压(红外二极管阳极连接VCC,因此此处测出低电平代表二极管发射红外光,可见载波频率38KHz,占空比(26-9):26 ~= 1:3

图 45   发射波形与接收输出波形
从图中可以看到,发射的38KHz的载波,在一体化红外接收管HS0038B的解调下,已经将载波去除,而只输出原始波形即38KHz波形的包络(envelope
5 实现效果


图 51   发射波形与接收输出波形
6 总结
本项目灵活利用了NXPLPC15xx芯片的各项外设功能,而SWM模块可自由分配功能到各个引脚。多个Timer并可灵活配置各个事件、多通道比较器等性能可快速实现应用开发。
本项目依然存在一些不完善的地方。需要改进。


版本历史(Revision History

版本号
发布时间
内容
A0
2013-09-25
初次发布。



LPC1500体验 (6)基于LPC15xx的智能自学习万用红外遥控器.pdf (694.32 KB, 下载次数: 25)

LPC_IrRemote.rar (116.29 KB, 下载次数: 26)
此帖出自NXP MCU论坛

最新回复

不错的实例。。。。。。。。。。  详情 回复 发表于 2014-10-15 08:08

赞赏

1

查看全部赞赏

点赞 关注(1)
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
不错的实例。。。。。。。。。。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表