GD32F303定时器捕获频率出现问题

[复制链接]
1156|7
xiaohuyu 发表于 2025-12-2 15:57 | 显示全部楼层 |阅读模式
捕获PWM频率时,采用从触发,每次进入捕获中断时将定时器复位,同时打开更新中断,当定时器更新时将频率值设置为最大值,遇到的问题是,在捕获中断中捕获到的值不正常,怀疑没有自动复位于是在捕获中断中手动将CNT的值复位,现在遇到的问题是误触发更新中断,无法正常捕获频率,但在捕获中断中断点等待一会,再运行程序,捕获到的值就正常了。

 楼主| xiaohuyu 发表于 2025-12-2 16:00 | 显示全部楼层

GD32F303定时器捕获频率出现问题

  /************************IO口配置******************************/  
  rcu_periph_clock_enable(RCU_TIMER2);
  nvic_irq_enable(TIMER2_IRQn,1,0);
  BSP_IntVectSet(BSP_INT_ID_TIM3, BSP_TIM_Capture_IRQHandler);
  gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
  
  /************************定时器配置****************************/
  FANCAPTURETIM.prescaler=19;
  FANCAPTURETIM.alignedmode=TIMER_COUNTER_EDGE;
  FANCAPTURETIM.counterdirection=TIMER_COUNTER_CENTER_UP;
  FANCAPTURETIM.period=63999;
  FANCAPTURETIM.clockdivision=TIMER_CKDIV_DIV1;
  timer_init(TIMER2,&FANCAPTURETIM);
  
  timer_auto_reload_shadow_enable(TIMER2);//使能自动装载影子寄存器
  timer_internal_clock_config(TIMER2);    //配置为内部时钟模式

  sConfigIC.icpolarity = TIMER_IC_POLARITY_RISING;
  sConfigIC.icselection = TIMER_IC_SELECTION_DIRECTTI;
  sConfigIC.icprescaler = TIMER_IC_PSC_DIV1;
  sConfigIC.icfilter = 0;
  timer_input_capture_config( TIMER2 , TIMER_CH_1 , &sConfigIC);
  
  timer_input_trigger_source_select(TIMER2,TIMER_SMCFG_TRGSEL_CI1FE1);
  timer_slave_mode_select(TIMER2,TIMER_SLAVE_MODE_RESTART);
  timer_master_slave_mode_config(TIMER2,TIMER_MASTER_SLAVE_MODE_ENABLE);
  
  timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
  timer_interrupt_enable(TIMER2,TIMER_INT_UP);
  
  timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH1);
  timer_interrupt_enable(TIMER2,TIMER_INT_CH1);
  timer_enable(TIMER2);

////////////////***********中断函数如下****************////////////////////////

if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH1))
  {
    timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH1);
    timer_counter_value_config(TIMER2,0);
    g_motor_speed_val = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_1)+1;

  }
  if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP))
  {
    timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
    g_motor_speed_val = 0xffff;
  }

elephant00 发表于 2025-12-2 17:21 | 显示全部楼层
可能由于定时器未正确复位或从触发模式配置不当。
flycamelaaa 发表于 2025-12-2 18:22 | 显示全部楼层
移除手动复位 CNT 的操作,从触发模式已经会自动复位 CNT,无需在中断中再次复位。
jcky001 发表于 2025-12-2 18:22 | 显示全部楼层
更新中断应仅用于超时处理,避免与捕获中断冲突。
onlycook 发表于 2025-12-2 19:23 | 显示全部楼层
增加输入滤波抑制噪声
powerantone 发表于 2025-12-2 19:24 | 显示全部楼层
从触发模式自动复位 CNT无需手动干预。
probedog 发表于 2025-12-2 20:24 | 显示全部楼层
不要在中断中重复操作硬件寄存器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0