红外线遥控是目前应用最广泛的一种通信和遥控手段。由于红外线遥控器具有体积小、功耗低、功能强、成本低等特点。因此在家电产品中有着广泛的应用。
相比与专用的控制芯片,微控制器具有开发灵活的特点,用户可以随意制定编解码格式。
但是,长期以来大家,特别是DIY爱好者对红外遥控的编码和解码原理和现实不太理解,以至于
无法根据自己的想法写出相应的程序,东奔西走,求爷爷告奶奶也无从得到,于是,今天在这里,咱们有心人开辟一个专题,来深刻地讨论,红外的编码和解码原理,以及实现程序,推而广之,电路的设计和电路图的分享。
好了,废话不多说了。我就把我所知道的和盘托出吧,高手们不要吝啬拍砖啊。
先说红外的编码吧:
一、 红外编码格式说明
用户采用红外模块时,编码格式非常灵活。目前市场上的红外编码格式非常多,每家公司都可以自己定义一种编解码格式。下面以一种比较常用的格式来做分析说明(示意图中高电平代表38K载波输出):
上面的波形格式包括前导码(Load Code)、身份码和身份反码(ID Code)、数据码和数据反码(Data Code)。
引导码(Load Code):引导码用来通知接受器其后为遥控数据,解码部分在接受到这个信号后就可以开始解码。
系统码(ID Code): 系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。
数据码(Data code): 数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。
数据帧间的空闲时间:有用信号中两帧数据间的空闲时间。
红外遥控数据传输系统中的关键是数据传输的可靠性。因此有些公司也会在系统码和数据码后面分别再传送一个同样的码或反码,供误码校验用。
在红外遥控编码中数据位的格式一般如下图所示,通过低电平的时间不同,来区别0和1。在解码的时候既可以根据总的时间长度不同来解码,也可以根据低电平时间的不同来解码。
[ 本帖最后由 libin200899 于 2011-5-16 22:21 编辑 ]
一、 红外编码发射接收软件实现部分
1、 红外编码发射部分软件实现方法:
红外发射管需要靠38K的载波驱动,才能将信号发送出去。有的MCU没有BUZZER输出功能,不能靠硬件实现38K载波,就必须用软件模拟38K载波的输出。而我们SN8P25XX,SN8P26XXS系列的BUZZER输出功能配合适当的震荡频率,可以很方便的实现38K载波的输出。
红外发射部分的软件实现一般可以分为两种:纯软件编码发射,计时器编码发射。
纯软件编码发射:根据编码格式,利用延时取得适当的时间段来控制载波的输出时间和输出间隔时间,达到编码正确发送的目的。这种方式思路简单容易实现,但比较浪费资源,实时性不高,也不利于程序的移植。
计时器编码发射:根据编码格式,采用计时器中断取得合适的时间段来控制载波的输出时间和输出间隔时间。这种方法充分利用了系统的资源,执行效率很高,并很容易实现程序的移植。
现采用SN8P2602A,外部晶振为3.58MHz所做的一款简单的遥控器,其编码发射流程图见图1。
1、 红外编码接收部分软件实现方法:
根据数据帧中不同的数据位格式和MCU中的资源,重要数据解码接收在程序设计中存在很大差别。一般有几种情况:纯软件解码、计时器解码、外部中断和计时器配合解码等。
纯软件解码:根据数据格式采用延时方式来取得合理的采样时间,每到达一次采样时间就测电平变化以确定解码数值。此种方法对MCU资源要求不高,无需计时器,也无需外部电平变换中断源,其实现方法也比较简单,并可以进行软件滤波处理。但此方法在解码过程中不能并行处理其他事,所以在比较复杂的系统中不推荐应用。
计时器解码:可以有两种思路来实现解码:一种方式是根据数据位格式利用计时器取得合理的采样时间,每达到一次采样时间就检测电平变化,根据在设定的时间内检测到高电平(或低电平)的次数来确定解码数值。另一种方法是累计电平变化的时间,计算两次电平变化之间的时间,再根据时间的长短来确定解码数值。
外部中断和计时器配合解码:利用外部中断的下降沿中断功能侦测编码信号的电平变化,利用计时器采样检测电平,累计时间以确定解码数值。此种方式效率高,解码灵敏,可以实现各种复杂系统中的准确解码。但在应用外部中断做信号变化侦测的时候,要注意外部干扰信号,需要在外部电路中做好滤波措施。
在SONIX的SN8P25XX,SN8P26XX系列中都有电平变化的外部中断源,因此非常适合各种编码格式的解码。下面为采用方式三解码的程序流程图,如下图。