首页 理论教育 C51单片机高效入门:红外遥控编码与软件解码

C51单片机高效入门:红外遥控编码与软件解码

时间:2023-11-17 理论教育 版权反馈
【摘要】:一帧完整的UPD6121的发射码由引导码、用户编码和键数据码三部分组成。下面就分别以UPD6121和SAA3010为例来看看PWM和PPM遥控器编码的解码方法。

C51单片机高效入门:红外遥控编码与软件解码

前面我们已经了解了红外遥控的硬件基础,可以看出,发射电路其实只能够给出两种状态,就是有信号和无信号。为了能够表示更多的信息,就要对发出的信号进行编码,就是要把遥控指令调制成一系列的脉冲串信号。

1.红外遥控的编码

红外遥控发射器是一种脉冲编码调制器,它在发射遥控指令时,把二进制数调制成一系列的脉冲串信号后再发射出去,常用的调制方法有脉冲宽度调制(PWM)和脉冲相位调制(PPM)两种,前面提到的IRT1250的编码方式就是一个很典型的脉冲宽度调制的例子,下面分别以UPD6121(PWM)和SAA3010(PPM)的编码来介绍这两种编码的方法。

从图10-73我们可以看到,UPD6121编码方式里,把低电平宽度为1个周期的信号定义为逻辑0,低电平持续3个周期的定义为逻辑1,这样通过对低电平宽度的区分我们就可以识别出0和1,然后就可以把遥控信号组成一个串行序列了。一帧完整的UPD6121的发射码由引导码、用户编码和键数据码三部分组成。引导码由1个9ms高电平脉冲及4.5ms的低电平脉冲组成;8位用户编码,被连续发送两次;8位的键数据码也被连续发送两次,第一次发送的是键数据码的原码,第二次发送的是键数据码的反码,这样就可以在接收侧实现对数据的校验,如图10-74所示。

978-7-111-30335-0-Chapter10-133.jpg

图10-73 UPD6121编码的逻辑0和1的定义

978-7-111-30335-0-Chapter10-134.jpg

图10-74 一帧完整的UPD6121的发射码构成

SAA3010(RC-5)格式的红外遥控信号是一种相位调制式脉冲编码,从图10-75可以看出逻辑0对应了从高电平到低电平的一次变化,而逻辑1的定义刚好与之相反。SAA3010的控制序列有以下一些信息构成,2bit启动位,1bit反转位,5bit系统编码,6bit按键数据编码。其发射码的构成及实际发射的脉冲包络波形如图10-76所示。

978-7-111-30335-0-Chapter10-135.jpg

图10-75 SAA3010编码的逻辑0和1的定义

前面已经说过,红外遥控的编码多种多样,不过用得最多的还是脉冲宽度调制方式,就是说都类似于UPD6121,只是有的0和1定义时高、低电平的宽度不同,也有的是没有引导码,再或者就是没有反码,总之整个规则是一样的。所以在实际使用中。可以参考具体的编码资料及针对遥控器的解码,只要掌握这两种类型的编码方式的解码,其他的也就基本类似了。

2.红外遥控的软件解码方法

到目前为止,我们已经清楚,从遥控器过来的信号,经过接收电路处理以后,将在输出端给出一个脉冲序列,而解码就是从这个脉冲序列中把信息恢复出来,不过注意很重要的一点:收到的信号是发射端信号的反相电平。下面就分别以UPD6121和SAA3010为例来看看PWM和PPM遥控器编码的解码方法。

UPD6121的编码在一体化接收头输出的信号前面部分如图10-77所示,9ms低电平+4.5ms高电平的引导码,接着就是用户码等。如果我们现在要来描述这个信息,我们会怎么说?还不就是9ms低电平+4.5ms高电平,是的,对引导码而言,只要我们能够确定低电平和高电平的时间长度在9ms和4.5ms左右就可以确定这个信息是引导码;同样对于后面的用户码和按键码,只要能够确定整个单位码长是2Tm或者4Tm即可确定代表的数字,然后从这串数字中,便可以恢复出遥控器发射出来的信息。总之,时间长度代表了信息,所以对UPD6121的编码,我们解码的途径就是获取电平的时间长度,然后按照给定参数识别出信息来。

978-7-111-30335-0-Chapter10-136.jpg

图10-76 一帧完整的SAA3010的发射码构成

978-7-111-30335-0-Chapter10-137.jpg

图10-77 UPD6121编码在一体化接收头输出的信号前面部分

目标有了,那么如何实现呢?应该很容易想到定时器吧?12MHz晶振的时候,定时器加1就是1μs,我们可以用引导码的下降沿来触发单片机的定时器开始计时处理,这样就可以获得电平的时间长度了,不过出于软硬件效率方面的取舍,仍然可以有不同的方法来实现。了解方法之前先交代一点,一般的遥控器编码在长按按键的时候,会连续发数据,可能是同样的数据,也有可能是个特定的所谓重复帧,虽然帧间的间隔大小不等,但一般在20~100ms之间,而有效的0和1的编码时间却基本小于10ms,就是说大致上15ms之内没有信号收到就表示当前的数据帧已经接收完毕,所以可以有如下一些接法:

①输出信号接单片机INT0端,同时该信号经过非门之后接INT1端,两个外部中断设置成下降沿触发,在INT0中断的时候开始记录低电平的宽度,在INT1中断的时候记录高电平的宽度,同时通过设定超时参数来检测数据接收完毕。如图10-78a所示。这种方法的优点是软件反应比较快,中断部分处理不占用太多时间。缺点是占用两个外部中断、两个定时器(一个用于计时处理,一个用于超时处理),还得再用一个非门,几乎快把单片机重要资源给耗光了。(www.xing528.com)

②输出信号接单片机的INT0和T0端,定时器T0和T1都初始化为定时器工作方式1,T0的GATE位置位。每次外部中断首先停止定时,记录T0、T1的计数值,然后将T0、T1的计数值清零,并重新启动定时。如图10-78b所示。T0的值即为高电平脉宽,T1-T0的值为低电平脉宽,这样不能做超时,虽然一般而言这种方法不太会有问题,但是不做超时处理并不是很好。这种方法效率不错,但是占用了两个外部引脚,两个定时器,且不可以做超时处理。

③输出信号只接单片机的INT0,引导电平的下降沿开始用T0计低电平的时间长度并等待电平变高,电平变高后保存T0并清0,然后开始记录高电平的时间,如此不停执行,直到某个高电平过程出现超时则数据帧接收完毕,如图10-78c所示。这种方法占用的硬件资源最少,但软件在中断程序里逗留时间比较长,在一些时间敏感的场合不合适使用。

978-7-111-30335-0-Chapter10-138.jpg

图10-78 接收头和单片机之间的连接方法

由于实验板上采用的是上述方案③,所以下面就具体看看如何在单接1根中断信号线的情况下,实现解码过程。

整个过程可以分成两步,第一步是读取并判断引导码是否正确,如果不是则直接返回并初始化检测参数;第二步是连续4次,按照每次8bit读取4个字节的后续数据,其中,检测过程中对0和1的判断必须是在开启计时之后,以减少因为程序执行而导致的测量时间长度上的误差。具体解码流程如图10-79所示。

978-7-111-30335-0-Chapter10-139.jpg

图10-79 UPD6121遥控器编码的解码子程序流程

a)一个位的识别流程 b)整个编码的识别流程

通过对UPD6121编码的解码,相信你已经掌握了基本方法了,不过SAA3010的解码同UPD6121还是不同的,这种类型的编码除了本身编码方式特别,并且在发射的数据不同的时候,也会有需要注意的不同点,首先关注一下图10-80中开始处和末尾处的实线和圆圈标记,这是两个特点所在,下面具体分析。

图10-80a给出的是一个发送端实际发射的脉冲包络波形,实际发射的波形本来是有2个起始位的,就是说有两个“1”,但是一般资料都说是1.5个起始位,为什么?我们可以看图10-80b,因为通常接收端平常保持高电平,所以发送的第一个bit“1”时的起始低电平部分在接收端就不能表现出来,所以真正有效的起始信号是从高电平开始的,也就是第一个bit“1”的后半部分,因此就有了1.5个起始位的说法。

978-7-111-30335-0-Chapter10-140.jpg

图10-80 SAA3010编码的发射接收波形

a)SAA3010遥控器发射端的波形,系统码0x0A,按键码0x0A

b)SAA3010编码在接收头输出的波形,系统码0x0A,按键码0x0A

再看波形的最右边部分,由于按键编码是0x0A,所以最低位就是0,这样最后的一个bit在接收端表现出来的高电平也将检测不到,这在解码过程中需要注意。

与UPD6121不同,我们还无法只从时间长度上识辨编码,因为编码的本意关注的就是跳变,所以我们可以从低电平到高电平和高电平到低点平这样的一对过程来确定编码。观察波形和图10-75中SAA3010编码的位定义,现在我们如果把850μs左右的时长定为一个有效电平的话,那么0的定义不就是“10”,而1的定义就变成了“01”?从波形可以看出,不管连续两个位置是任何数据,中间高低电平的长度只有两种可能,就是在850μs和1700μs左右,既然这样,我们就利用两个时间的中间值来判断一个电平里包含的是一个还是两个电平,比如我们可以从图10-80b中可以获得这样一个序列:

010100110011001010110011001

由于前面的1.5bit是起始位,一直保持不变(注意,有极少数SAA3010的编码起始位定义不一样,以具体资料为准),所以前面的010就是固定的,不需要理会。因为看的是接收端波形,所以我们把图10-75中1和0的位定义反过来看,这样,翻转位就是1(10),而系统码是01010(0110011001),按键码是001010(010110011001),到此为止,我们已经把数据从脉冲串里恢复出来了。具体的程序流程如图10-81所示。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈