NEC红外遥控协议理解与实现
红外发射管有2个管脚,发送的是经过38KHz时钟调制过的信号。例如下图使用PWM产生一个等占空时钟信号用于调制。


接收管收下来的信号已经经过了解调,可以直接连接系统的外部中断脚。


下面通过逻辑分析仪来实际测量一下。
随便找了个红外遥控器,测量power键按下后的波形。首先是信号发送侧。

可以看到,0秒开始是一个按键动作,0.11秒后的那个波形是一个repeat,展开:

把波形重叠的部分展开,就可以看到这个38KHz的调制时钟

如果持续按下遥控器上的按键,那么就会发送连续的repeat信号,发送的间隔也基本满足协议上指出的110ms

下面是接收侧

可以看到信号被解调了,也就是说重叠的部分变成了低电平。
最后通过编写协议分析插件的方式,来描述如何通过程序来理解上面的波形。
我使用的逻辑分析软件是 Saleae Logic 1.1.15 编译环境是Microsoft Visual Studio 2008,编译时需要SaleaeAnalyzerSdk-1.1.14。完整的代码从这里下载。
分析的方法是测量两个信号下降沿之间的时间长度,这里先定义一些时间参数。
/* Timing define , unit : ms*/ #defineSTART_LOW_TIMING #defineSTART_HIGH_TIMING #defineREPEAT_HIGH_TIMING #defineLOGIC_ONE_TIMING (*) #defineLOGIC_ZERO_TIMING (*) #defineDATA_LOW_TIMING (*)
从逻辑分析仪测量的结果,可以发现发射器给出的信号并不是非常的精确,所以我们需要定义误差范围。
/* Timing Margin , unit : ms*/ #definedelta
在下面代码里,通过API函数AdvanceToNextEdge来获取下一个信号发生变化的采样点,如果对应的采样点是低电平,则表示下跳沿,这时和前一个下跳沿采样点的时间做差,按照采样频率换算成时间间隔。再根据上面定义的时间常量来判断这是一个START标记、REPEAT标记、逻辑1、逻辑0还是无效的信号。对于逻辑1和0的情况,需要通过移位来整理成32bits的有效数据,这里要特别注意协议里规定,先发送的是LSB,后发送的MSB。
void IRNECAnalyzer::WorkerThread()
{
U64 per_sample = ;
U64 cur_sample = ;
U64 starting_sample = ;
U64 differ = ;
char action = state_down;
U8 fail = ;
U64 data = ;
U32 code = ;
U8 count = ;
U8 data_f = ;
mResults.reset(new IRNECAnalyzerResults( this, mSettings.get() ) );
SetAnalyzerResults(mResults.get() );
mResults->AddChannelBubblesWillAppearOn(mSettings->mInputChannel );
mSampleRateHz= GetSampleRate();
mSerial= GetAnalyzerChannelData( mSettings->mInputChannel );
if( mSerial->GetBitState() == BIT_LOW )
mSerial->AdvanceToNextEdge();
for(;;){
mSerial->AdvanceToNextEdge();
cur_sample= mSerial->GetSampleNumber();
//只处理时钟的下跳沿
if(mSerial->GetBitState() == BIT_LOW){
differ= (cur_sample - per_sample)*/mSampleRateHz;
//判断是否是REPEAT信号
)<differ)&&((differ)<(START_LOW_TIMING+REPEAT_HIGH_TIMING+delta*))){
action=state_repeat;
fail=;
})<differ)&&((differ)<(START_LOW_TIMING+START_HIGH_TIMING+delta*))){
//判断是否是START信号
action=state_start;
fail=;
}else
)<differ)&&((differ)<(LOGIC_ONE_TIMING+DATA_LOW_TIMING+delta*))){
//判断是否是逻辑1
action=state_data;
data_f=;
fail=;
})<differ)&&((differ)<(LOGIC_ZERO_TIMING+DATA_LOW_TIMING+delta*))){
//判断是否是逻辑0
action=state_data;
data_f=;
fail=;
}else{
//否则为错误信号
fail=;
}
){
switch (action){
case state_start:
code= ;
count= ;
starting_sample= cur_sample;
AddFrame(per_sample,cur_sample, , FStart);
break;
case state_data:
data_f= data_f << count;
code= code | data_f;
count++;
){
count= ;
AddFrame(starting_sample,cur_sample, code, FData);
code= ;
starting_sample= cur_sample;
}
break;
case state_repeat:
AddFrame(per_sample,cur_sample, data, FRepeat);
break;
default:
break;
}
}
per_sample= cur_sample;
}
}
}
加载上面的插件后,可以看到分析的结果


所以如果将这份代码放在板卡上运行,首先应该将接收器的信号接到处理器的外部中断管脚,然后注册一个下跳沿触发的快速中断。然后最通常的情况你需要再注册一个标准的输入设备,映射一下遥控器码字和按键事件的对应关系就可以了。
NEC红外遥控协议理解与实现的更多相关文章
- 基于STM32的红外遥控重点解析
本文有两个内容:一.红外遥控协议的的讲解:二.解码程序解析(参考正点原子的代码) 红外的介绍.优点.缺点就不给大家说了,进入正题 一.红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Pr ...
- 红外遥控NEC协议使用总结
最近做了一个调试红外遥控三色灯的实习,花了一个多月的时间研究基于NEC协议的红外遥控,下面是这次实习技术方面的总结. 一.NEC协议特征: 8位地址和8位命令长度 每次传输两遍地址(用户码)和命令(按 ...
- 46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)
内核版本 : Linux 3.10.14 rc红外接收类型: GPIO 类型的NEC红外编码 本章内容 1) rc体系结构分析 2) 分析红外platform_driver平台驱 ...
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- 基于Arduino的红外遥控
1.红外接收头介绍 一.什么是红外接收头? 红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管 ...
- 基于Arduino、STM32进行红外遥控信号接收
catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...
- 46.Linux-创建rc红外遥控平台设备,实现重复功能(2)
上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1) 在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platf ...
- 玩转X-CTR100 l STM32F4 l 红外遥控接收
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器具有红外接收头,例程 ...
- STM32之红外遥控信号自学习实现
一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...
随机推荐
- Apache Commons Pool2 源码分析 | Apache Commons Pool2 Source Code Analysis
Apache Commons Pool实现了对象池的功能.定义了对象的生成.销毁.激活.钝化等操作及其状态转换,并提供几个默认的对象池实现.在讲述其实现原理前,先提一下其中有几个重要的对象: Pool ...
- 用于下载AD官网登录账号:User name: fuxin918@fuxin918.com Passeword: s6c0W1w8
用于下载AD官网登录账号:User name: fuxin918@fuxin918.com Passeword: s6c0W1w8
- syscomments 可以用来查找所有关于库中用到的某个关键词的所有相关脚本
syscomments SELECT * FROM syscomments
- Eclipse配置Maven开发环境
前言: 现在Eclipse版本越来越高.高版本的Eclipse甚至已经集成了Maven像是SpringSource的哪个版本.用习惯了Eclipse.在开发中还是不想更换掉自己的IDE.如此一来就又了 ...
- 不可或缺的企业OA面临问题,以及解决建议 软件定制开发 森普演示平台
---恢复内容开始--- 随着信息时代的来临,企业管理也相应的信息化,各种管理软件相继而出,各行各业的信息化有过成功,也有过失败(注:是以该项目是否达到用户的预期目标而言).据统计在信息化失败的案例中 ...
- UP UP UP!(dp)
UP UP UP! Time Limit: 1 Sec Memory Limit: 128 MB Submit: 92 Solved: 27SubmitStatusWeb Board Descri ...
- Yougth的最大化(好题,二分查找 0 1分数规划)
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价 ...
- powershell 将文本转换成表格的还有一种方式
$text=" 1 梦幻西游 216406 2014-01-21 资料片 2 炉石传说 15905 2014-01-24 公測 3 新大话西游 214465 2002-08-01 公測 4 ...
- JS给元素循环添加事件的问题
<ul> <li>男</li> <li>女</li> <li>老</li> <li>少</li&g ...
- [AC自动机][HDU3065]
//====================== // HDU 2222 // 求目标串中出现了几个模式串 //输入 //1 //5 //she //he //say //shr //her //ya ...