红外发射管有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红外遥控协议理解与实现的更多相关文章

  1. 基于STM32的红外遥控重点解析

    本文有两个内容:一.红外遥控协议的的讲解:二.解码程序解析(参考正点原子的代码) 红外的介绍.优点.缺点就不给大家说了,进入正题 一.红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Pr ...

  2. 红外遥控NEC协议使用总结

    最近做了一个调试红外遥控三色灯的实习,花了一个多月的时间研究基于NEC协议的红外遥控,下面是这次实习技术方面的总结. 一.NEC协议特征: 8位地址和8位命令长度 每次传输两遍地址(用户码)和命令(按 ...

  3. 46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)

    内核版本          :  Linux 3.10.14 rc红外接收类型:  GPIO 类型的NEC红外编码 本章内容 1) rc体系结构分析 2) 分析红外platform_driver平台驱 ...

  4. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  5. 基于Arduino的红外遥控

    1.红外接收头介绍  一.什么是红外接收头?  红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管 ...

  6. 基于Arduino、STM32进行红外遥控信号接收

    catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...

  7. 46.Linux-创建rc红外遥控平台设备,实现重复功能(2)

    上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1) 在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platf ...

  8. 玩转X-CTR100 l STM32F4 l 红外遥控接收

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      X-CTR100控制器具有红外接收头,例程 ...

  9. STM32之红外遥控信号自学习实现

    一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...

随机推荐

  1. WPF实现毛玻璃效果

    1和2需要Microsoft.WindowsAPICodePack.Shell.dll 和引用using System.Windows.Interop,并只能在有DwmApi.dll 版本的Windo ...

  2. Slack 开源替代品 Rocket.Chat(聊天,文件上传等等)

    Rocket.Chat 是特性最丰富的 Slack 开源替代品之一. 主要功能:群组聊天,直接通信,私聊群,桌面通知,媒体嵌入,链接预览,文件上传,语音/视频 聊天,截图等等. Rocket.Chat ...

  3. ftp报错 200 port command successful. consider using pasv 425 failed to establish connection

    最近在公司做的项目是需要在客户端录制视频,然后通过ftp传到服务器端.客户端是windows,服务器端linux.今天用新的电脑配置好项目之后,测试数据传输时出现了“200 port command ...

  4. 把Storyboard减轻的方法

    把Storyboard减轻的方法 by 伍雪颖 UIViewController *secondStoryboard = [[UIStoryboard storyboardWithName:@&quo ...

  5. [置顶] SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错

    这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...

  6. minicom与USB转串口

    实验器材:mini6410 连接方式:ARM板通过USB转串口线连接到pc机 下面是具体的设置了. 默认情况下,UBUNTU安装了USB转串口驱动(pl2303). 1.# lsmod | grep ...

  7. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作

    详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...

  8. Starting httpd:Could not reliably determine the server's fully qualified domain name

    #service httpd start #Starting httpd: httpd: Could not reliably determine the server's fully qualifi ...

  9. SQL Server 2008 忘记sa密码的解决办法

    由于某些原因,sa和windows验证都不能登录 sql server,可以用独占模式,修改sa密码先在服务管理器停止Sql Server服务,然后打开命令行,进入 SQL Server安装目录,进入 ...

  10. 解决 Visual Studio 2012 有时不能调试的问题

    有时候发现 Visual Studio 2012 不能调试,有时候又能调试.感觉很烦,今天找到了一个解决办法,我也不知道为什么这样能解决. 问题: 解决:1. 找到 Properties ,双击 2. ...