3931|0

190

帖子

10

TA的资源

一粒金砂(中级)

楼主
 

[LPC54102]红外遥控介绍与接收 [复制链接]

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。
    由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。
其中最好的介绍是以下的链接
http://www.sbprojects.com/knowledge/ir/index.php

    红外传输就是依靠PWM来驱动红外光的传输。都在传输过程,发送端有PWM称为MARK状态(工作),没的PWM称为SPACE状态(空闲)。而接收端,由上图可以看到高低电平,但实际上这样是没有意义的,接收端先确定SPACE状态,就是没有收到任何红外光是的电平状态(一般为高电平,但可以为低电平),这时的电平就认为是SPACE状态;与SPACE状态相反的状态称为MARK状态。
    至于怎么传输数据?时间换数据,就是SPACE 与MARK 持续的时间来判断是0 或者1 或者是其他信号。最基本的就分为引导信号,0信号,1信号,当然还有其他信号。
下面以NEC为例(我找到的资料在解释NEC的最多)
        NEC 分为引导信号,0信号,1信号 以及Repeat(按下键没有放时产生的信号),其中 0 1 组成了地址与命令有用的信号。
NEC协议,其特征如下:
http://www.sbprojects.com/knowledge/ir/nec.php
1、8位地址和8位指令长度;
2、地址和命令2次(补码)传输(确保可靠性)
3、PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为38Khz  1/3duty or 1/4duty;
5、逻辑数据时间为1.125ms或2.25ms;
6、数据命令发送一次



NEC码的位定义:一个脉冲对应560us的连续载波(载波频率为38Khz 1/3duty),一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。
NEC遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的mask电平和一个4.5ms的space电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。
把我收藏的资料一起奉献给大家。如下:
学习型遥控器的设计及实现.pdf (39.67 KB, 下载次数: 70)


IrDA原理图.pdf (33.37 KB, 下载次数: 49)


常见红外遥控器编码与格式.pdf (1 MB, 下载次数: 90)


红外编码资料.pdf (817.44 KB, 下载次数: 25, 售价: 1 分芯积分)


红外遥控编码资料.pdf (1 MB, 下载次数: 23, 售价: 1 分芯积分)


红外遥控系统原理.pdf (8.19 MB, 下载次数: 15, 售价: 1 分芯积分)


红外遥控系统原理及单片机软件解码实例.pdf (138.44 KB, 下载次数: 22, 售价: 1 分芯积分)


红外遥控学习模块在空调控制的应用说明.doc (404 KB, 下载次数: 42)


基于RC5_编码的红外遥控器的设计(毕业论文).doc (705.5 KB, 下载次数: 40)


    如果你看完之后,同样有一个感觉协议都是各个厂家自己规定的,就算是同一品牌的不同型号产品协议都可能不一样,并没有统一的规定。而这些协议都是厂家自己内部使用,却很少公开,或者某些牛B的开发者透协出来的。对这些创客们表示无限的致敬。
    红外的传输分为发送与接收。我们先来说接收,至于怎么读取红外的信号,在上面已经分析了,无非就是记录高低电平持续的时间。
     而单片机的实现就需要用到两个资源,(1)读取IO状态,(2)定时器,1us以上的级别的中断,当然并不是非要1us,如NEC,最少的电平的持续的时间为560us,这时可以设置为10us
    程序设计:
    中断设计,记录时间,读取IO状态,由IO状态判断MARK/SPACK的电平的变化,当变化时记录时间并时间重新计数,当然同时判断是否超时。
    当然也可以用IO的跳变中断来做,这样中断就没有那么的频率,只有超时作出特殊的处理即可。(以后再来改进)
关键代码如下:(从IRremote移植)
void IRrecv_ISR(void)
{
  uint8_t irdata = 0;
  IRrecv_ISR_TICK_TEST();//test the freq
  IRrecv_TIMER_RESET();
  IRrecv_ISR_IF_START();
  irdata = (uint8_t)IRrecv_pinRead(irparams.recvport,irparams.recvpin);
  irparams.timer++; // One more 50us tick
if (irparams.rawlen >= RAWBUF) {
// Buffer overflow
    irparams.rcvstate = STATE_STOP;
}
switch(irparams.rcvstate) {
case STATE_IDLE: // In the middle of a gap
if (irdata == MARK) {
if (irparams.timer < GAP_TICKS) {
// Not big enough to be a gap.
        irparams.timer = 0;
}
else {
// gap just ended, record duration and start recording transmission
        irparams.rawlen = 0;
        irparams.rawbuf[irparams.rawlen++] = irparams.timer;
        irparams.timer = 0;
        irparams.rcvstate = STATE_MARK;
}
}
break;
case STATE_MARK: // timing MARK
if (irdata == SPACE) { // MARK ended, record time
      irparams.rawbuf[irparams.rawlen++] = irparams.timer;
      irparams.timer = 0;
      irparams.rcvstate = STATE_SPACE;
}
break;
case STATE_SPACE: // timing SPACE
if (irdata == MARK) { // SPACE just ended, record it
      irparams.rawbuf[irparams.rawlen++] = irparams.timer;
      irparams.timer = 0;
      irparams.rcvstate = STATE_MARK;
}
else { // SPACE
if (irparams.timer > GAP_TICKS) {
// big SPACE, indicates gap between codes
// Mark current code as ready for processing
// Switch to STOP
// Don't reset timer; keep counting space width
        irparams.rcvstate = STATE_STOP;
}
}
break;
case STATE_STOP: // waiting, measuring gap
if (irdata == MARK) { // reset gap timer
      irparams.timer = 0;
}
break;
}
if (irparams.blinkflag) {
if (irdata == MARK) {
      BLINKLED_ON(); // turn pin 13 LED on
}
else {
      BLINKLED_OFF(); // turn pin 13 LED off
}
}
  IRrecv_ISR_IF_END();
}
在rawlen-2 记录MARK 与SPACE 的总个数,一头一尾是多余的信号
rawbuf记录MARK 与SPACE  对应的持续时间
if (IRrecv_decode(&results)) {
            count = results.rawlen;
for(i=0; i
                uart_printf_block("num %d is %d us\r\n",i,results.rawbuf*USECPERTICK);
}
//Serial.println(results.value, HEX);
            uart_printf_block("%ld,0x%x\r\n",results.value,results.value);
            IRrecv_resume(); // Receive the next value
}
显示如下

到这里,红外的接收已经解决了,如果想做万能遥控的,只要记录的MARK 与 SPACE的时间并发送出去即可。但是这是初级版的万能遥控。这就是为什么市面上的遥控要学习的原因。
对于红色部分有500 550 600 650 700 感觉数据很乱的感觉,这就是下一篇要分析的红外编码与解码。


如果有看不清楚图可到我博客地址查看:[红外]01、红外遥控介绍与接收[url]http://blog.sina.com.cn/s/blog_7e7fa4c80102vmbc.[/url]html


此帖出自NXP MCU论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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