求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 ) ;
}
展开》
折叠》