你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm定时器采集高电平数据有波动

[复制链接]
麦龙电子 提问时间:2020-3-16 20:19 /
通过STM32F103RCT6需要采集3路方波的高电平,没有使用输入捕获采集(输入捕获是特定的引脚,比较麻烦)采集的方波的周期是7MS频率145HZ,通过定时加外部中断的方式实现了采集,由于对采集电平的精度有要求,所以在串口直接打印得到的数据上看会有最小位数为10左右的跳动。但是通过软件滤波没有实现平稳的输出。我个人觉得是采集的方式有问题,导致的数据跳动,有没有高手请教一下,通过软件来修正一下,使用了窗口滑动滤波测试效果很差,延迟比较严重。
  1. 初始化部分
复制代码

串口打印输出数据

串口打印输出数据
收藏 评论4 发布时间:2020-3-16 20:19

举报

4个回答
麦龙电子 回答时间:2020-3-16 20:30:22
  1.          TIM2_Cap_Init(0XFFFF,100-1);              //1US分辨率 计数值65535 最大60ms
  2.          TIM3_Cap_Init(0XFFFF,100-1);              //1US分辨率 计数值65535 最大60ms
  3.          TIM4_Cap_Init(0XFFFF,100-1);              //1US分辨率 计数值65535 最大60ms         
  4.         delay_us(10);
  5.         EXTI_PA1_Init();                  //配置外部中断1
  6.         EXTI_PA2_Init();                  //配置外部中断2
  7.         EXTI_PA3_Init();                  //配置外部中断3        


  8. unsigned short High_Time_us_PA1=0; //PA1高电平时间
  9. unsigned short High_Time_us_PA2=0; //PA2高电平时间
  10. unsigned short High_Time_us_PA3=0; //PA3高电平时间

  11. void EXTI1_IRQHandler(void)                       //EXTI_Line1
  12. {
  13.   if(EXTI_GetITStatus(EXTI_Line1)!= RESET)      
  14.   {
  15.     if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))        //上升沿中断
  16.                 {
  17.                         TIM2->CNT=0;         //从0开始计数
  18.                         TIM_Cmd(TIM2,ENABLE);//启动定时器2
  19.                 }
  20.     else //下降沿中断
  21.     {
  22.             High_Time_us_PA1=TIM2->CNT;//将高电平时间读出来
  23.                   TIM_Cmd(TIM2,DISABLE); //关闭定时器2等待下次测量
  24.                         TIM2->CNT=0;           //计数值清零
  25.     }        
  26.                 EXTI->PR = EXTI_Line1;//清除中断标志

  27.   }
  28. }


  29. void EXTI2_IRQHandler(void)                       //EXTI_Line2
  30. {
  31.   if(EXTI_GetITStatus(EXTI_Line2)!= RESET)      
  32.   {
  33.     if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))        //上升沿中断
  34.                 {
  35.                         TIM3->CNT=0;         //从0开始计数
  36.                         TIM_Cmd(TIM3,ENABLE);//启动定时器3
  37.                 }
  38.     else //下降沿中断
  39.     {
  40.             High_Time_us_PA2=TIM3->CNT;//将高电平时间读出来
  41.                   TIM_Cmd(TIM3,DISABLE); //关闭定时器3等待下次测量
  42.                         TIM3->CNT=0;           //计数值清零
  43.     }        
  44.                 EXTI->PR = EXTI_Line2;//清除中断标志
  45.   }
  46. }


  47. void EXTI3_IRQHandler(void)                       //EXTI_Line3
  48. {
  49.   if(EXTI_GetITStatus(EXTI_Line3)!= RESET)      
  50.   {
  51.     if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3))        //上升沿中断
  52.                 {
  53.                         TIM4->CNT=0;         //从0开始计数
  54.                         TIM_Cmd(TIM4,ENABLE);//启动定时器4
  55.                 }
  56.     else //下降沿中断
  57.     {
  58.             High_Time_us_PA3=TIM4->CNT;//将高电平时间读出来
  59.                   TIM_Cmd(TIM4,DISABLE); //关闭定时器4等待下次测量
  60.                         TIM4->CNT=0;           //计数值清零
  61.     }        
  62.                 EXTI->PR = EXTI_Line3;//清除中断标志
  63.   }
  64. }
复制代码
麦龙电子 回答时间:2020-3-17 20:24:44
麦龙电子 回答时间:2020-3-18 18:15:27
mylovemcu 回答时间:2020-3-19 14:35:21
我没有实际做过  不过感觉你这个属于正常吧  1us的分辨率  波动个7-8us很正常  
再说了  输入信号的稳定性也有关系啊

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版