求STM32红外解码的指导

 2 E币 
成为会员,免费下载资料
文件大小:514.86 KB 上传者:perseverance 时间:2013-12-01 23:39:58 下载量:5

原理图:
[attach]1452[/attach]

(原文件名:红外接收―stm32原理图.PNG)
根据红外遥控38K载波芯片的一般编码规则可知,一帧数据的开始是从一个Header开始的。间隔是9+4.5=13.5ms
发送0是一个0.56+0.565=1.125ms  ,
发送1是一个0.56+1.685=2.245ms  

利用TIM3的输入捕获功能,捕获下降沿。即可对遥控器发送的红外脉冲解码。
已经知道了红外脉冲的宽度了,接下来配置TIM的分频器,使其能捕获这三种脉冲。
内核时钟是72M。每一个毫秒是72M/1000 = 72000,
把TIM3的除数因子配置为29 , 那么TIM3的分辨率就是 1 / (72000 / (29+1))  =  1/ 2400 ms
TIM3的重加载寄存器配置为65535 , 那么可捕获的最大脉冲就是65535/2400 = 27.3 ms
经过如上的配置,我们的TIM3就可以满足我们的红外脉冲捕获的要求了。
原理图中使用的TIM3的引脚是重映射引脚。
        tim_base.TIM_ClockDivision = TIM_CKD_DIV1 ;
        tim_base.TIM_CounterMode = TIM_CounterMode_Up ;
        tim_base.TIM_Period = 65535 ;
        tim_base.TIM_Prescaler = 29 ;
        TIM_TimeBaseInit(TIM3, &tim_base ) ;

        tim_icinit.TIM_Channel = TIM_Channel_2 ;
        tim_icinit.TIM_ICFilter =0 ;
        tim_icinit.TIM_ICMode = TIM_ICMode_ICAP ;
        tim_icinit.TIM_ICPolarity = TIM_ICPolarity_Falling ;
        tim_icinit.TIM_ICPrescaler= 0 ;
        tim_icinit.TIM_ICSelection = TIM_ICSelection_DirectTI;
           TIM_ICInit( TIM3,  &tim_icinit );
        TIM_Cmd( TIM3, ENABLE );
        TIM_ITConfig( TIM3,  TIM_IT_CC2 , ENABLE );
         
           TIM3的Channel_2通道管脚重映射以后就是PC7了。


中断中的关键代码:
void TIM3_IRQHandler(void)
{
        extern vu16 ccd [80] ;
        static int id = 0 ;
        
        static vu16  cur = 0 ;
        static vu16  last  = 0 ;

        u16 step ;
        int   fh;
        
        if(TIM_GetITStatus( TIM3,  TIM_IT_CC2 ))
        {
                TIM_ClearITPendingBit(TIM3,  TIM_IT_CC2);

                //ccd[id ++ ] = TIM_GetCapture2(TIM3) ;
         
                cur = TIM_GetCapture2(TIM3) ;

        #if 1
                if(cur > last )
                {
                    step = cur - last ;
                }
                else
                {
                    step = 65535 - last + cur ;
                }
                   //step 为两次捕获的计数值的差,为了避免浮点数运算,此处,把浮点数放大十倍,转换成整数计算。
                fh = step *10 / (2400) ;

        // 同步开始头,13.5ms
        
                if( (fh > 130) && (fh <140) )
                {
                    id = 0 ;
                }
        // 1.125ms
        else if( (fh > 9 ) && (fh <13 ))
        {
            ccd[id ++ ] = 0 ;
        }
       // 2.245ms
        else if( (fh > 20 ) && (fh <24 ))
        {
            ccd[id ++ ] = 1 ;
        }
        
        #endif
        
                if(id >60)
                {
                        id = 0 ;

                        //TIM_Cmd(TIM3, DISABLE );
           // cur =
                        //TIM_ITConfig( TIM3,  TIM_IT_CC2 , DISABLE) ;
                }
               
        }

        last = cur ;
        
}


把捕获的二进制数据通过USART打印出来,然后分析遥控器的编码:
[attach]1453[/attach]
(原文件名:编码分析.PNG)

上面只是没有贴出最前面的16位,因为前面16位也是一样的。
经过上面的分析就可以解码了:
    k1 = 0 ;
    for(i= 0 ;i< 8 ; i++ )
    {
        //dprintf("%d  " , ccd[26+i]);
        k1 |= ccd[26+i]<     }
  //  dprintf("\r\n") ;
    k2 = 0 ;
    for(i= 0 ;i< 8 ; i++ )
    {
       // dprintf("%d  " , ccd[34+i]);
        k2 |= ccd[34+i]<     }
  //  dprintf("\r\n") ;
//校验一下,因为k1和k2为补码关系,所以相加为255.
    if(k1 + k2 == 255)
    {
        dprintf("get key intput %d   \r\n" , k1 ) ;
    }
展开
折叠
683
评论
共 0 个
内容存在敏感词
    易百纳技术社区暂无数据
相关资料
关于作者
易百纳技术社区
perseverance
贡献资料 13
易百纳技术社区 我上传的资料
登录查看
我赚取的积分
登录查看
我赚取的收益
登录查看
上传资料 赚取积分兑换E币
易百纳技术社区
删除原因
广告/SPAM
恶意灌水
违规内容
文不对题
重复发帖
置顶时间设置
结束时间
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-资料模块

审核失败

失败原因
备注
易百纳技术社区