项目场景:
红外遥控的编码协议: NEC、RC-5、RC-6。
NEC协议采用的是PPM(Pluse Position Modulation,脉冲位置调制)进行编码。当我们按下遥控器的一个按键时,会发送一帧的数据。这一帧的数据由引导码、地址码、地址反码、数据码、数据反码以及一位结束位(可忽略)组成。
红外线遥控是利用近红外光传送遥控指令的,波长为0.76um~1.5um。
红外发射器件(红外发光管)与红外接收器件(光敏二极管、三极管及光电池)的发光与受光峰值波长一般为0.8um~0.94um,在近红外光波段内,二者的光谱正好重合,能够很好的匹配,可以获得较高的传输效率及较高的可靠性。
红光波长:620nm~720nm之间
问题描述
这个可能是我目前做的最艰辛的实验了,不是说实验有多难,而是波形图画的我是实在心力憔悴,如果其他实验做完就是完成了,那么这个实验绝对有必要去总结一下。
实验目标很简单就是利用FPGA将接收到的已经解调的信号进行解码,将解码后的信号显示在数码管上,当接受到重复信号时,让led灯进行闪烁。
实现该模块功能共需要数据接收解调模块,led灯驱动模块和数码管动态显示模块。
首先是数据接收解码模块
由于各个状态的跳变条件比较复杂,在这里使用状态机来实现该模块最合适不过了。
解调信号初始状态为高电平,当下降沿触发信号到来时,转变为9ms判断状态,如果接收到的信号为9ms的高电平就进入仲裁状态根据高电平的保持时间来判别接收到信号是引导码,重复码还是错误信号来决定下一个状态如何进行跳变。
问题分析到这里我们可以确定一下接下来要使用的变量
首先要声明一个计数器变量cnt来判别信号的保持时间是否满足状态的跳变条件,
其次要明确计数器何时进行清零来重新进行计数,这就需要一个计数开始的标志信号和一个计数结束的标志信号。这里使用输入信号inf_in打拍来得到,打两拍得到信号的上升沿信号与下降沿信号。第一个上升沿可以作为作为初始状态到TIME_9MS状态进行跳变的触发条件,第一个下降沿可以作为9ms计数器归零的标志信号,
当然这里还要声明一些信息传递完成的标志信号
例如;flag_560us,flag_1_69ms,flag_4.5ms,flag_9ms,flag_2.25ms来进行数据码的判断。当然这里对cnt计数器计数开始与结束的条件还需要进行进一步的判别,深究。
状态的转换还需要上升或下降沿与标志信号一同判别。
这也是该模块主要的核心问题,其次就是数据的赋值。
上升沿与下降沿与计数标志信号相配合是计数器计数的关键,也是状态进行跳变的关键。还影响了数据计数器的赋值和数据的提取。因此该实验绘制波形图是解决问题的关键。关于led等的点亮延时也可根据信号打拍来实现。因此本体的关键是波形图的绘制。
原因分析:
提示:这里填写问题的分析:
例如:Handler
发送消息有两种方式,分别是 Handler.obtainMessage()
和 Handler.sendMessage()
,其中 obtainMessage
方式当数据量过大时,由于 MessageQuene
大小也有限,所以当 message
处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
解决方案:
提示:这里填写该问题的具体解决方案:
例如:新建一个 Message
对象,并将读取到的数据存入 Message
,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
换成 mHandler.sendMessage()
。