summon

summon

0个粉丝

7

问答

0

专栏

2

资料

summon  发布于  2013-12-01 23:38:10
采纳率 0%
7个问答
2895

求STM32红外解码的指导

 
想做红外遥控器控制的板子,不知有没有可供参考的工程。
我来回答
回答1个
时间排序
认可量排序

perseverance

0个粉丝

8

问答

0

专栏

13

资料

perseverance 2013-12-01 23:40:01
认可0

原理图:


(原文件名:红外接收―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打印出来,然后分析遥控器的编码:

(原文件名:编码分析.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 ) ;
    }
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

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

详细说明

易百纳技术社区