收藏1 举报
哇,还在收回开发版啊? 58180698 发表于 2012-8-25 22:48
//TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;//上升沿捕获 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//修改为同时捕获上升沿和下降沿 PS:同时捕获两种电平的原因为是,通过图3可以看出一组有效数据的前后有一个很长的低电平。这个低电平可以作为判断几组数据的分隔符,而最后一位数据的电平宽度是由高电平决定的,无法仅通过捕获的低电平来判断。 接下来打开stm32f0xx_it.h文件 定义两个长度为100的32位数组用于存放高低电平 复制 __IO uint32_t highlevels[100],lowlevels[100]; 定义两个变量用于存放高低电平数组的索引 复制 __IO uint8_t highlevel_index = 0,lowlevel_index = 0; 然后找到用于产生捕获中断的TIM2_IRQHandler()函数 修改代码为 复制 void TIM2_IRQHandler(void) { /* Get the Input Capture value */ IC2Value = TIM_GetCapture2(TIM2); //判断捕获引脚电平 if(GPIOA->IDR & GPIO_Pin_1) { //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. lowlevels[lowlevel_index++] = IC2Value; } else { //否则为高电平 highlevels[highlevel_index++] = IC2Value; } // if (IC2Value != 0) // { // highlevels[highlevel_index++] = IC2Value; // } // else // { // } if(highlevel_index >100) { //ASK数据解码 ASK_DECODE(); highlevel_index = 0; lowlevel_index = 0; } /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); __nop(); } 编译下载并运行程序,将断点设置在if(highlevel_index >100)内。 使用一个单片机产生占比约83%的方波得到的结果如下图所示: 附上用于测试TIM2捕获的代码: TIM_PWM_Input.rar (1.11 MB, 下载次数: 93) 2012-8-26 15:09 上传 点击文件名下载附件
__IO uint32_t highlevels[100],lowlevels[100]; 定义两个变量用于存放高低电平数组的索引 复制 __IO uint8_t highlevel_index = 0,lowlevel_index = 0; 然后找到用于产生捕获中断的TIM2_IRQHandler()函数 修改代码为 复制 void TIM2_IRQHandler(void) { /* Get the Input Capture value */ IC2Value = TIM_GetCapture2(TIM2); //判断捕获引脚电平 if(GPIOA->IDR & GPIO_Pin_1) { //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. lowlevels[lowlevel_index++] = IC2Value; } else { //否则为高电平 highlevels[highlevel_index++] = IC2Value; } // if (IC2Value != 0) // { // highlevels[highlevel_index++] = IC2Value; // } // else // { // } if(highlevel_index >100) { //ASK数据解码 ASK_DECODE(); highlevel_index = 0; lowlevel_index = 0; } /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); __nop(); } 编译下载并运行程序,将断点设置在if(highlevel_index >100)内。 使用一个单片机产生占比约83%的方波得到的结果如下图所示: 附上用于测试TIM2捕获的代码: TIM_PWM_Input.rar (1.11 MB, 下载次数: 93) 2012-8-26 15:09 上传 点击文件名下载附件
__IO uint8_t highlevel_index = 0,lowlevel_index = 0; 然后找到用于产生捕获中断的TIM2_IRQHandler()函数 修改代码为 复制 void TIM2_IRQHandler(void) { /* Get the Input Capture value */ IC2Value = TIM_GetCapture2(TIM2); //判断捕获引脚电平 if(GPIOA->IDR & GPIO_Pin_1) { //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. lowlevels[lowlevel_index++] = IC2Value; } else { //否则为高电平 highlevels[highlevel_index++] = IC2Value; } // if (IC2Value != 0) // { // highlevels[highlevel_index++] = IC2Value; // } // else // { // } if(highlevel_index >100) { //ASK数据解码 ASK_DECODE(); highlevel_index = 0; lowlevel_index = 0; } /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); __nop(); } 编译下载并运行程序,将断点设置在if(highlevel_index >100)内。 使用一个单片机产生占比约83%的方波得到的结果如下图所示: 附上用于测试TIM2捕获的代码: TIM_PWM_Input.rar (1.11 MB, 下载次数: 93) 2012-8-26 15:09 上传 点击文件名下载附件
void TIM2_IRQHandler(void) { /* Get the Input Capture value */ IC2Value = TIM_GetCapture2(TIM2); //判断捕获引脚电平 if(GPIOA->IDR & GPIO_Pin_1) { //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. lowlevels[lowlevel_index++] = IC2Value; } else { //否则为高电平 highlevels[highlevel_index++] = IC2Value; } // if (IC2Value != 0) // { // highlevels[highlevel_index++] = IC2Value; // } // else // { // } if(highlevel_index >100) { //ASK数据解码 ASK_DECODE(); highlevel_index = 0; lowlevel_index = 0; } /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); __nop(); } 编译下载并运行程序,将断点设置在if(highlevel_index >100)内。 使用一个单片机产生占比约83%的方波得到的结果如下图所示: 附上用于测试TIM2捕获的代码: TIM_PWM_Input.rar (1.11 MB, 下载次数: 93) 2012-8-26 15:09 上传 点击文件名下载附件
这么酷的帖子我要是不督促你,你若忘记发了,那岂不是论坛的一大损失哦!:lol 21小跑堂 发表于 2012-8-26 01:14
#define min_val 10000 定义一个32位变量用于临时存放高电平。 复制 __IO uint32_t high_t=0; 在捕获中断中将捕获到的高电平存放在临时变量中。 然后在捕获到低电平的判断中判断high_t+ IC2Value(当前低电平的宽度)是否大于最小数据宽度min_val。 如果满足条件,则将存放在high_t中的上一个高电平和当前低电平IC2Value添加到数组。否则清除已经捕获的数据,让数组索引从零开始。 复制 //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. if(high_t + IC2Value >min_val) { lowlevels[lowlevel_index++] = IC2Value; highlevels[highlevel_index++] = high_t; } else { highlevel_index = 0; lowlevel_index = 0; } 这样就完成了对无效数据的过滤,减小处理器的负荷。
__IO uint32_t high_t=0; 在捕获中断中将捕获到的高电平存放在临时变量中。 然后在捕获到低电平的判断中判断high_t+ IC2Value(当前低电平的宽度)是否大于最小数据宽度min_val。 如果满足条件,则将存放在high_t中的上一个高电平和当前低电平IC2Value添加到数组。否则清除已经捕获的数据,让数组索引从零开始。 复制 //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. if(high_t + IC2Value >min_val) { lowlevels[lowlevel_index++] = IC2Value; highlevels[highlevel_index++] = high_t; } else { highlevel_index = 0; lowlevel_index = 0; } 这样就完成了对无效数据的过滤,减小处理器的负荷。
//如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平. if(high_t + IC2Value >min_val) { lowlevels[lowlevel_index++] = IC2Value; highlevels[highlevel_index++] = high_t; } else { highlevel_index = 0; lowlevel_index = 0; } 这样就完成了对无效数据的过滤,减小处理器的负荷。
void ASK_DECODE(void) { uint16_t i,j; slave_id=0; for(i=1;i<lowlevel_index-25;i++)//循环查找数据间隔 { if(lowlevels[i-1]/lowlevels[i]>10 && lowlevels[i-1+25]/lowlevels[i+25]>10 ) { for(j=i+1;j<i+25;j++) { slave_id<<=1; if(highlevels[j]>10000)//数值大于10000视为1,否则为0 { highlevels[j]=1; //无用,仅在分析数据时做为参考 slave_id |=1; } else highlevels[j]=0;//无用,仅在分析数据时做为参考 } break; } } } 这时解码后的ID如图 与发送ID一至,证明解码成功,此时已经完成ASK的解码。
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
发帖类勋章
等级类勋章
9
219
2
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号