跳至主要内容

【转】关于红外遥控的一点资料整理

最近发现家里遥控器老是弄混(唉,遥控器多了,也是一件麻烦事)。如果有一种可对家中各种红外遥控器发射的控制信号进行识别、存储和再现的智能型红外遥控器,用这样一个遥控器控制家中所有电器该多好。这就是大家称作的学习型红外遥控器。于是,下了不少工夫查找了许多资料,对红外遥控也做了一点表面研究,现总结一点文档,与大家一同探讨(有不对之处,请大家指正!);另外由于本人愚顿还未开窍,还有部分东西想不太明白,在此也向专家们请教,请知道的老兄支点招,在此小弟先谢过了!!!
一、红外遥控概述
    红外遥控系统一般都是由发射部分和接收部分组成。
    1、发射部分的主要元件为红外发光二极管。它实际上是一只特殊的发光二极管,由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它发出的便是红外线而不是可见光。目前大量使用的红外发光二极管发出的红外线波长为940nm左右,外形与普通Φ5发光二极管相同,只是颜色不同。

    2、接收部分主要元件是红外接收管,它是一种光敏二极管(实际上是三极管,基极为感光部分)。在实际应用中要给红外接收二极管加反向偏压,它才能正常工作,亦即红外接收二极管在电路中应用时是反向运用,这样才能获得较高的灵敏度。
    由于红外发光二极管的发射功率一般都较小(100mW左右),所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。前些年常用μPC1373H、CX20106A等红外接收专用放大电路。最近几年不论是业余制作还是正式产品,大多都采用成品红外接收头。成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装(如图中的HS0038),均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。但在使用时注意成品红外接收头的载波频率。
http://bbs.21ic.com/upfiles/img/200682114849807.jpg(图一)
    
    3、红外通信的基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号,通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。
    红外遥控常用的载波频率为38kHz,这是由发射端编码芯片所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。也有一些遥控系统采用36kHz、40kHz、56kHz等。
    红外遥控的特点是不影响周边环境、不干扰其它电器设备。由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。
    由于各生产厂家生产了大量红外遥控专用集成电路,需要时按图索骥即可。因此,红外遥控在家用电器、室内近距离(小于10米)遥控中得到了广泛的应用。

二、红外遥控编码标准
    目前市面上出现的遥控编码有很多种,但常用的红外遥控编码主要是NEC标准和PHILIPS标准,其它都是这两类的变种。
1、NEC编码标准:编码芯片有PT2221/PT2222、HT6221/HT6222等
此标准下的发射端所发射的一帧码含有一个引导码、8位用户码、8位用户反码,8位键数据码、8位键数据反码。引导码由一个9ms的高电平和4.5ms的低电平组成。当按下持续时间超过108ms时,则发送简码(简码由9ms高电平和2.25ms的低电平组成)来告之接收端是某一个按一直按着,象电视的音量和频道切换键都有此功能,简码与简码之间相隔是108ms。"1"和"0"的区分采用脉冲位置调制方式(PPM)。如下图所示:
http://bbs.21ic.com/upfiles/img/200682114659710.jpg(图二)

2、PHILIPS的RC-5编码标准:编码芯片有SAA3010、PT2210/PT2211/PT1215、HT6230等
    RC-5编码标准的一帧有以下几部分组成:
1)起始码部分  2个逻辑1;
2)控制码部分,1位;
3)系统码部分,5位;
4)指令码部分,6位。
    连续发射时,重复波形与第一次发射波形相同。控制码位在前后再次按键中交替改变。0和1码传送采用双相位编码发送技术。编码规则如下图所示:
http://bbs.21ic.com/upfiles/img/20068211485728.jpg(图三)

3、其它变种的编码类型
    像TC9028、PT2212、PT2213等芯片的码型与NEC标准类似,只是引导码变为4.5ms高电平+4.5ms低电平,简码4.5ms高电平+4.5ms低电平+0.56ms高电平+1.68ms低电平+1.56ms高电平组成。
    像PT2461、LC7461等芯片的码型也是与NEC标准类似,数据帧长度变长了,引导码+13位用户码+13位用户反码+8位键数据码+8位键数据反码。简码为9ms高电平+4.5ms低电平+0.56ms高电平组成。

     三、红外信号的学习与再生(学习型遥控器的电路和编程实现)
    目前大多数人采用的方法都是用一体化接收头做为信号的接收,然后把解调出来的信号送入单片机进行学习(记录各个高低电平的时间长度),然后存入EEPROM内,学习OK后再发送的是把EEPROM的高低电平的时间数据读取并与38KHz载波进行调制然后发送出去。如下图所示:
http://bbs.21ic.com/upfiles/img/200682114921928.jpg(图四)
    例如:由AVR系列单片机ATmega8、一体化红外接收头HS0038、存储器、还原调制与红外发光管驱动电路组成。一体化红外接收头负责红外遥控信号的解调,将调制在38kHz上的红外脉冲信号解调并反向后再输入到ATmega8的INT0引脚,边沿触发方式,并由单片机计数器进行高电平与低电平宽度的测量。
这里使用具有I2C总线接口的E2PROM 芯片AT24C32作为存储器,其容量为4KB,用来保存识别出来的遥控信号的高电平与低电平宽度数据。通常遥控信号的二进制脉冲码长为32位,每位由一个高电平与一个低电平组成,应保存的信号宽度数据为64个,再加上引导码2个数据,共计66个数据,每个数据用一个字节来表示,一个遥控信号命令就需要66个字节来保存。考虑到不同的遥控系统有一定的区别,有些遥控信号命令长度较长,所以存储空间应适当留有余量。在实际应用中,可根据红外遥控设备的数量及每个设备的遥控命令数量等具体情况来决定E2PROM 芯片的容量和型号。

    遥控信号的还原和发射是通过单片机的一个IO口输出二进制脉冲码(高电平与低电平的维持时间为学习识别时保存的一组宽度数据)与38KHz载波进行调制,调制后的信号经驱动后通过红外发光管发射出去。
但这样的处理方法,因为一体化红外接收头工作电压一般都要求是5V,在供电能力方便的情况下采用这种方式还是不错的,但如果想象普通遥控器一样只能采用两节干电池供电,那以上方法是没法做到的。
  我看到过一款自学习型遥控器,其电路原理如下图所示:
http://bbs.21ic.com/upfiles/img/200682114949720.jpg(图五)
    现在有两点我没想明白:
1、这里接收红外信号是采用红外接收二级管,但这里经三极管放大反向之后送入单片机口线上的信号还是调制在38KHz的波形,也就是说这个波形是没有经过解调的。
我想弄明白的事:单片机是如何对这波形进行解调的吗?或者说这单片机处理程序是并没有进行解调而是直接记录特征数据,然后存入EEPROM,这样又是如何做到的吗?
2、存储于EEPROM的32字节数,是个什么样的特征数据,它能再生重新原样的发射出去。
     能只用32个字节的数据记录一个按键的红外遥控信息,这比之前用66个字节(甚至更多)的方法来得更加简洁,一个4K的EEPROM(AT24C32)能够记录的按键数就多得多了。
点击看大图

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总线的地址、数据和控制信号,并提供二级译码以产生APB外围设备的选择信号,从而实现AHB协议到APB协议的转换。 ====================================

【转】GPIO编程模拟I2C入门

ARM编程:ARM普通GPIO口线模拟I2C  请教个问题: 因为需要很多EEPROM进行点对点控制,所以我现在要用ARM的GPIO模拟I2C,管脚方向我设 置的是向外的。我用网上的RW24C08的万能程序修改了一下,先进行两根线的模拟,SDA6, SCL6,但是读出来的数不对。我做了一个简单的实验,模拟SDA6,SCL6输出方波,在示波 器上看到正确方波,也就是说,我的输出控制是没问题的。 哪位大哥能指点一下,是否在接收时管脚方向要设为向内?(不过IOPIN不管什么方向都可 以读出当前状态值的阿) 附修改的RW24C08()程序: #define  SomeNOP() delay(300); /**/ /* *********************************  RW24C08   **************************************** */ /**/ /* ----------------------------------------------------------------------------- ---  调用方式:void I2CInit(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CInit( void ) ... {  IO0CLR  =  SCL6;      // 初始状态关闭总线  SomeNOP();  // 延时   I2CStop();  // 确保初始化,此时数据线是高电平 }   /**/ /* ---------------------------------------------------------------------------- ----  调用方式:void I2CStart(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CStart( void )

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容: Config ARM_CS8900    tristate "CS8900 support" depends on NET_ETHERNET && A