纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 26422|回复: 12

基于STM32的红外解码原理及程序实现

[复制链接]
发表于 2013-1-19 09:56:09 | 显示全部楼层 |阅读模式
常见编码原则:

   一:脉宽调制方式
      脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1"; 对应波形如下图
     
     上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射   

      下面这幅图是遥控发出的信号,可以看到平时是高电平,有信号时为低电平。低电平经过38kh载波
      
     经过红外一体接收头接受处理后,将载波去掉,就变成了如下所示波形
     

     一个完整的编码包括引导码,识别码(系统码1,系统码2)用来区别不同的电器设备,用户码(数据码,反码)针对具体的功能

      

     遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,发射波形图
      
     如果键按下超过108ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成
     

    该方式红外编码总结如下:
    共有四种码值:引导码,0, 1, 连发码。这四种编码的脉宽分别为13.5ms,1.125ms, 2.25ms 和11.25ms 。这四种脉宽
的最小公约数是0.125.也就是说计时器的最小周期为0.125ms就可以准确的将这集中脉宽计算出来。同时为了简化我们不去区分
低电平周期和高电平周期,而已脉宽作为区分标准。这样我们只要在每个下降沿读取计数值,减去上一个下降沿的计数值,就可以得到脉宽。如果不考虑连发码的话我们只要识别引导码,0,1 这三种编码即可。

下表是相关的流程图





下面是红外接收部分代码

static void IR_isr(void)
{
    static uint32_t s_i = 0;   // 静态局部变量
    /* 红外遥控下降沿 */
    if(TIM_GetITStatus(TIM8, TIM_IT_CC1) == SET)
    {
        TIM_ITConfig(TIM8,TIM_IT_Update,DISABLE); //关闭溢出中断
        switch (g_IR_State)
        {
            case IR_STATE_NO: // 第一个下降沿,初始化数据,准备捕获数据
                TIM_SetCounter(TIM8,0);
                s_i = 0;
                g_IR_State = IR_STATE_READ;
                break;
            case IR_STATE_READ:// 保存捕获数值               
                if (s_i<IR_CODE_LEN)
                {
                    g_IR_Code[s_i++]=TIM_GetCounter(TIM8);
                    TIM_SetCounter(TIM8,0);
                    
                }else{
                    g_IR_State = IR_STATE_END;
                    s_i = 0;
                }
                break;
            case IR_STATE_END:// 捕获结束
                // nothing
                break;
            default:
                break;
        }        

        TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);   //清除中断标志
        TIM_ClearITPendingBit(TIM8,TIM_IT_Update);
        TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);   //开溢出中断            

    }
    else if(TIM_GetITStatus(TIM8,TIM_IT_Update)== SET)// TIM溢出,说明脉宽超出设定,码值无效
    {
        if (g_IR_State == IR_STATE_READ)      // 读红外码时溢出说明红外码无效,清除数据,返回无数据状态
        {
            g_IR_State = IR_STATE_NO;
            s_i = 0;
        }else if (g_IR_State == IR_STATE_END) // 如果红外读取结束,则说明数据有效
        {
            g_IR_State = IR_STATE_OK;
        }
        TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清楚溢出标志
        TIM_ITConfig(TIM8,TIM_IT_Update,DISABLE);  //关闭溢出中断
    }

}
理论上可以识别所有脉宽调制方式的红外编码,目前程序中只对 NEC格式和康佳彩电遥控编码做了处理,如下图机顶盒为NEC格式,电视机用的是康佳格式
程序源码下载: ow_IR_Decode.rar (630.69 KB, 下载次数: 133, 售价: 2 )
回复

使用道具 举报

发表于 2013-1-19 13:03:32 | 显示全部楼层
很不错哦,收藏了
回复 支持 反对

使用道具 举报

发表于 2013-1-19 13:59:08 | 显示全部楼层
很不错哦,收藏了
回复 支持 反对

使用道具 举报

发表于 2013-2-21 12:50:32 | 显示全部楼层
  要钱的啊???!!!
回复 支持 反对

使用道具 举报

发表于 2013-3-4 17:24:19 | 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!
回复 支持 反对

使用道具 举报

发表于 2013-3-18 16:55:14 | 显示全部楼层
先留个印记吧,我先照51的移植一下,然后在用这个来实现,谢谢分享
回复 支持 反对

使用道具 举报

发表于 2013-12-20 21:51:59 | 显示全部楼层
好资料,谢谢分享
回复 支持 反对

使用道具 举报

发表于 2015-1-18 16:05:41 | 显示全部楼层
好资料!谢谢分享!!
回复 支持 反对

使用道具 举报

发表于 2015-9-25 14:13:12 | 显示全部楼层
支持下
回复 支持 反对

使用道具 举报

发表于 2017-2-4 11:20:36 | 显示全部楼层
不错,收藏
回复 支持 反对

使用道具 举报

发表于 2017-7-8 14:53:57 | 显示全部楼层

不错,支持
回复 支持 反对

使用道具 举报

发表于 2017-7-10 08:41:02 | 显示全部楼层


为了币再顶
回复 支持 反对

使用道具 举报

发表于 2018-7-6 18:28:52 | 显示全部楼层
果断MARK,前十有我必火!积分不够回复来凑!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-12 05:48 , Processed in 0.076693 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表