OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7518|回复: 15

利用STM32定时器的输入捕获红外发射的高低电平,最开始的一部分值不对,后面的值都对了

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
发表于 2014-9-26 11:16:42 | 显示全部楼层 |阅读模式
5金钱
u16 key_value[100] = {0};  //??·?°??ü?????±??
u8 key_number = 0;         //??????????????????????
u8 key_flag = 0;          //????????????±ê???? 1??????   0????????
//u8 get_value_flag = 1;    //??·???????????±ê????·???key_value[0], key_value[0] = 1,±í??????????????·??ò±í????????????????
u8 key_receive_finish = 0;  //?ì???????ê??±ê??

void Infrared_Study_Init(void)      
{  

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_ICInitTypeDef  TIM_ICInitStructure;  
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //????PORTB?±?? 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5 ?±?????? 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 ???? 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //???????? 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_SetBits(GPIOA,GPIO_Pin_1); //??????GPIOA1

 
  TIM_TimeBaseStructure.TIM_Period = 10000; //?è?¨?????÷×?????×°?? ×??ó10ms????  
TIM_TimeBaseStructure.TIM_Prescaler =71; //?¤·????÷,10K??????????,1us??1.   
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?ò??????????

TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //?ù?????¨????????????TIMx

 TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  // ?????????? IC2??????TI5??
 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //±???????
 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //????????·???,??·??? 
 TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 ???????????¨?÷ 8???¨?±?÷?±?????????¨
 TIM_ICInit(TIM5, &TIM_ICInitStructure);//???????¨?±?÷?????????¨??

 
TIM_ITConfig( TIM5,TIM_IT_CC2|TIM_IT_Update,ENABLE);//???í?ü?????? ,???íCC2IE????????
 
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM5????
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //??????????0??
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //????????3??
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??±?????
NVIC_Init(&NVIC_InitStructure);  //?ù??NVIC_InitStruct?????¨???????????????èNVIC?????÷
 
  TIM_Cmd(TIM5,ENABLE ); //?????¨?±?÷5
}


u8  TIM5CH2_CAPTURE_STA=0; //????????×???    
u16 TIM5CH2_CAPTURE_VAL; //??????????

//?¨?±?÷5????·??????ò  
void TIM5_IRQHandler(void)
{   
u16 Dval;
    if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
key_receive_finish = 1;
}
  if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)
{  
if(RDATA)//??????????
{
if(key_flag==1)
{
Dval=TIM_GetCapture2(TIM5);//????CCR2????????CC12F±ê????
//if((Dval>300&&Dval<800) || (Dval>1400&&Dval<1800) || (Dval>4200&&Dval<4700) || (Dval>8500&&Dval<10000))
key_value[key_number++] = Dval;
}
TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);
    TIM_SetCounter(TIM5,0);   //?????¨?±?÷??

}else//??????????
{
if(key_flag==1)
  {
Dval=TIM_GetCapture2(TIM5);//????CCR2????????CC12F±ê????
//if((Dval>300&&Dval<800) || (Dval>1400&&Dval<1800) || (Dval>4200&&Dval<4700) || (Dval>8500&&Dval<10000))
key_value[key_number++] = Dval;
}
TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising);
TIM_SetCounter(TIM5,0);   //?????¨?±?÷??
key_flag = 1;
}           
}
  TIM_ClearFlag(TIM5,TIM_IT_Update|TIM_IT_CC2);    
}

这时把捕获的数据通过串口打印出来的:
24 CB 10 75 03 8C 00 C5 03 E5 00 69 04 00 00 7D 03 B6 00 B1 03 DA 00 8D 03 6B 01 20 0C 29 05 83 03 99 05 51 03 97 05 3B 03 9C 05 37 03 A4 05 52 03 2E 05 AA 02 9F 06 4D 02 5C 06 8F 02 37 02 12 02 4D 02 33 02 23 06 B0 02 3C 06 AE 02 26 06 AA 02 22 02 4F 02 25 02 29 02 4C 02 2F 02 28 06 AA 02 42 06 A9 02 27 02 29 02 46 02 32 02 28 02 4A 02 26 06 AD 02 23 06 AF 02 3A 06 B0 02 25 
蓝色字体为引导码,后面的黑色部分数据不对,最后的红外数据是对的,还有就是有时候接收到的数据的个数不对

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-26 11:41:47 | 显示全部楼层
处理方式或者计算不对吧,这个不难的,多检查一下。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 09:28:09 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
回复【2楼】TinyBoy:
---------------------------------
那应该怎么处理啊,还有我找到一个原因就是遥控器按第一下的时候波形本来就有问题,我用逻辑分析仪测了
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-29 09:51:54 | 显示全部楼层
回复【3楼】我本仁慈:
---------------------------------

遥控器是连发的吧,如果是,你第二个码就应该解出来了,解不出来,那就是你处理问题了,你都用定时器来解,也是可以的。一种方式是用外部中断和定时器做,这样处理更简单。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 09:53:53 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
代码是没有问题的,现在的问题就是遥控器的某个按键按第一次的时候前面的一些波形本身就是错误的
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 09:55:12 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
回复【4楼】TinyBoy:
---------------------------------
如果只是接受第二次的波形,那个比如空调遥控器的温度就不容易捕捉到了,因为空调遥控器的每个温度的键值不一样
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-29 09:57:37 | 显示全部楼层
回复【5楼】我本仁慈:
---------------------------------

解码就是,一旦发现不符合的位,全帧丢掉,从头开始检查,你就读出你解到的正确的码就行了,不对的,对你没用,不用管它。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 09:58:52 | 显示全部楼层
回复【7楼】TinyBoy:
---------------------------------
回复【7楼】TinyBoy:
---------------------------------
我也是这样想的,但是那样空调的温度值就不好学习到了,如果你连续按两次那温度值就不一样了,
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-29 10:01:36 | 显示全部楼层
回复【6楼】我本仁慈:
---------------------------------
如果你确定是遥控器发的码不对,而且遥控器不是连发的,这的确是个问题,如果是连发的,那问题不大。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 10:07:19 | 显示全部楼层
回复【9楼】TinyBoy:
---------------------------------
这是遥控器本身的缺陷,遥控器后面连发的的码值是不一样的
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-29 10:21:02 | 显示全部楼层
回复【10楼】我本仁慈:
---------------------------------
哦,那就是遥控器的问题了。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 10:23:08 | 显示全部楼层
回复【11楼】TinyBoy:
---------------------------------
我试了好几个遥控器了,第一次按键前面一部分数据的波形长度都是不对的,因为想做通用型的红外学习,所以就不能按照NEC的编码方式的长度来判断哪些值是对的
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-29 10:32:17 | 显示全部楼层
回复【12楼】我本仁慈:
---------------------------------

你可以自己编码,自己解码,我建议你用中断来解码,定时器不应该只做解码这一件事情,它应该还可以做更多的事情,你用中断来检测会更快,你在定时器里面只管计时就可以了。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-29 17:31:10 | 显示全部楼层
回复【13楼】TinyBoy:
---------------------------------
这是利用原子哥的提供的历程做的,使用定时器的输入捕获来做的,感觉的和中断差不多吧
回复

使用道具 举报

13

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-2-15
在线时间
0 小时
发表于 2014-9-29 18:16:18 | 显示全部楼层
捕获红外的高低电平而已吗?红外是以38KHZ的低频载波中发送的,滤波上估计不能完全去除这载波,如果是单单只是捕获高低电平的话,应该会有干扰的!
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-7-16
在线时间
0 小时
 楼主| 发表于 2014-9-30 11:08:51 | 显示全部楼层
回复【15楼】羽神落:
---------------------------------
是的,捕获高低电平的时间,我用逻辑分析仪看了,遥控器的某一个按键第一次按的时候前面的一些波形都有一些问题,直到后面有一个正确的数据之后,后面的数据都是对的了,这个可能是遥控器本身的原因造成的吧
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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