基于嵌入式系统的红外通讯解码应用①
2019-08-22钟炜楠吴允平苏伟达李汪彪王廷银
钟炜楠, 吴允平,2,3, 苏伟达, 李汪彪, 王廷银
1(福建师范大学 光电与信息工程学院,福州 350007)
2(福建省光电传感应用工程技术研究中心,福州 350007)
3(数字福建环境监测物联网实验室,福州,350117)
1 引言
红外通讯是以波长为0.76 μm~1.5 μm的红外光作为通讯载体实现的数据传送. 由于红外光通信方向性很强,在短距离无线通信领域有着广泛的应用. 通常,红外通讯主要由发射和接收两部分组成[1-3],红外发射过程是:先将一帧数据调制成红外光信号,利用发射电路将信号放大后向外发射[4]; 而红外接收是发射的逆过程,接收电路将收到的调制信号存储下来后,解调还原成数字信号,最后由微处理器进行后续解码处理. 红外信号的编码方式有很多种[5],区别主要在于高、低电平的时间宽度不同,编码位数不同等,目前较为常用的编码协议有:脉冲宽度编码(PWM码)的SIRC协议、Manchester编码的RC-5协议和脉冲位置编码(PPM码)的NEC协议等[6,7]. 数据报文通常由引导码、地址码、地址反码、指令和指令反码等部份组成,以PPM码的NEC协议为例,如图1所示,其特点为[8]:
(1) 8 bit地址码和8 bit指令码;
(2) 载波频率为38 kHz;
(3) 引导码由一个9 ms低电平和4.5 ms高电平组成;
(4) 逻辑1由560 μs低电平和1680 μs高电平表达,逻辑0由560 μs低电平和560 μs高电平表达.
图1 NEC协议红外数据波形
目前,红外收发控制器的硬件已经成熟商用,市面上的成品比较丰富,可选择性大,因此一般会将重点放在红外解码上[9]. 目前现有的方法总体上相似,就是应用定时器中断和外部中断资源捕捉红外波形,然后由微处理器检查引导码、数据拼接、校验无误后,得到地址码和指令,完成后续解码操作[10-13].
2014年,李雪莹为将波形中的高低电平时长数据都记录下来,在每次进入IO口中断后改变中断的触发方式[14]; 2015年,杨萍选择不使用中断,而是在接收到引导码后,通过每次固定延时560 μs后,探测此时电平是高或低来判断数据为逻辑1或逻辑0[15]; 2017年,张春雨把IO口中断设置为下降沿触发,在进入IO口中断时,启动计时器,因此每次IO口中断得到的记录时长是一个低电平和高电平的累计时长; 最后通过进入外部中断的次数和相对应的计时器数据解码得到地址码与指令[16].
可见,围绕如何使红外通讯的解码方法适用于多种不同的红外通讯协议,提高兼容性,协调IO口中断和定时器中断资源,提高微处理器红外通讯的处理效率,是红外解码中最主要的几个问题. 研究一种方法,既可将数据接收和解码工作各自独立,具有较高的通用性,能方便应用于不同的红外通讯协议和移植到不同的微处理器上,还有较好的性能,提高微处理器的效率.
2 红外通讯接收
2.1 硬件配置
选购1838一体化红外接收头,该红外接收头的工作电流约为1 mA,具体电路如图2所示,IRData接收红外数据,连接到微处理器IO口,IRPower来自微处理器另一个IO,负责对接红外接收头供电,可以用来控制红外通讯的低功耗工作模式[17].
图2 红外接收电路
2.2 软件设计
目前现有的红外通讯的接收解码方法由波形采集和数据分析解码两部分组成,都安排在中断中完成,导致这两部分关联性较强,代码普适性弱,程序开发和维护的复杂度高. 因此,将波形采集、数据分析分割则可以解决上述不足,设计的红外通讯接收及解码过程如图3所示,将红外波形的高、低电平数据都捕获下来,即记录完整的波形数据,再进行数据分析解码.
为此,设计的结构体名如下(IR是InfraRed首字母缩写):
其中,IR_Wave[]为储存波形高低电平时长的缓冲区数组,pIR_Wave为数组下标,Timer_Count是记录进入定时器中断的次数,IsIR_Done指示波形采集完成标志位,Is_Decode表示解码完成标志位.
图3 红外通讯接收过程
为了实现对波形高低电平的全采集,将IO口设置为跳变中断方式,即上升沿和下降沿都可以触发IO口外部中断,在IO口外部中断中开启定时器,来记录高电平或低电平的时长,在整个波形数据采集完成后才申请后续数据分析解码处理. IO口外部中断服务的具体流程如图4所示.
图4 外部中断流程图
进入IO口外部中断后,需检查当前是否有解码任务在执行,这一步是为了保障缓冲区中待解码的数据不会被“污染”. 外部中断的流程如图4所示,特别需要注意的是,由于进入外部中断后才打开定时器中断,因此当前Timer_Count记录的时长是两次外部中断的间隔时长,也就是高电平或低电平的持续时长; 流程中首先检查pIR_Wave是否等于0,如果是,说明第一次进入外部中断,此时不将Timer_Count的数据记录保存到IR_Wave中; 只有当pIR_Wave不为0时,此时Timer_Count记录的数据才是有效的,需要保存到缓冲区中,然后将pIR_Wave后移一位,Timer_Count清0,打开定时器中断. 由于IRData空闲时是高电平,因此第一次触发外部中断的必然为下降沿,可以进一步分析得到,IR_Wave缓冲区中偶数下标记录的是低电平时长,而奇数下标则为高电平时长.
本方法中,定时器周期为0.2 ms,根据红外波形的特点可知电平状态的最长为9 ms,因此如果Timer_Count记录数超过45(9/0.2=45),则说明红外通讯结束.定时器中断流程如图5所示,任务相对简单,仅对Timer_Count进行累计加一处理; 然后检查Timer_Count是否大于50时,满足这个条件,判断有两种情况:判断数据传输完毕、数据有异常. 但无论是哪种情况,处理的方式都是相同的,先将接收完成标志位IsIR_Done置成TRUE,然后关闭定时器中断,防止系统被定时器中断长时间占据而出现崩溃的现象. 当IsIR_Done为TRUE时,说明波形采集工作已经完成,申请下一步进行数据分析解码.
图5 定时器中断流程图
数据分析解码具体流程如图6所示. 由于红外波形特点,因此需在IR_Wave缓冲区中寻找连续两字节引导码特征数据(9 ms低电平和4.5 ms高电平),第一字节数值在43-47(9/0.2=45)之间,第二字节在22-26(4.5/0.2=23.5)之间; 找到后,第二位数据的后64位(4×8×2=64)数据可根据红外协议中逻辑0和1的特点解码成32(64/2=32)个0或1,再拼接成地址码、指令以及两者的反码; 最后进行校验检查,即将地址码和指令与其反码相加,验证两者之和是否为0FFH,校验无误后,得到地址码和指令,本次红外通讯结束. 如果上述过程中出现任何错误,立刻退出并初始化MyIR结构体,等待下一次红外通讯的信号接收.
图6 数据分析解码流程图
总结来说,整个红外通讯接收过程中,严格将波形的采集、数据分析解码各自独立,逻辑清晰,由于把波形的高、低电平持续时长全部记录下来,再按照红外通讯编码协议进行解码,理论上准确率能达到100%.一般对红外通讯的实时性要求不高,在100 ms内完成接收和解码工作即可,所以在使用该方法时耗时不会影响使用,且占用的资源和复杂度没有增加. 如果担心红外信号多,系统会错过其中的信号,只需要将存储数据的数组适当放大,就可以接收更多字节的数据,避免漏接数据.
3 实际应用与展望
如图7(a)所示,利用示波器观察红外信号的波形,先从验证单个红外信号是否接收解码正确开始,然后,如图7(b)所示,核对串口输出的红外解码四字节数值是否和波形匹配,最后,如图7(c)所示,使用多组不同型号红外发射器发送100个红外信号,验证该方法的接收解码正确率. 持续72小时的不间断测试,微处理器未出现异常或者错误的现象,可使用任意一款红外发射器进行红外通讯,微处理器反应迅速,且通讯的距离满足正常的使用,且接收解码正确率为100%. 因此,使用本红外通讯方法完全满足实际应用的需求,与之前的方法相比,具有以下几方面有所优势:
(1) 波形的采集、数据分析解码的采用独立分割,代码可移植性、可读性和逻辑性高;
(2) 由于采集了完整的红外波形,因此可解码多种红外协议,提高了兼容性;
(3) 外部中断在电平的上升沿和下降沿都会触发,提高了准确率.
图7 测试界面与效果
本方法在实际应用当中,取得了较为满意的效果,在红外接收及时和准确,任务调度得当,不会影响系统其余的正常工作. 如果需要进行代码的移植,只需要注意芯片的频率并进行对应的修改,保证定时器的进入频率符合要求,相应的IO口可以触发外部中断即可.本方法具有移植性、兼容性和准确率高的优点,具体的控制方案可根据行业应用需要进行微调.