硬汉嵌入式论坛

 找回密码
 立即注册
查看: 438|回复: 5
收起左侧

[有问必答] 瑞萨RX单片机计数器溢出问题

[复制链接]

9

主题

14

回帖

41

积分

新手上路

积分
41
发表于 2023-11-6 16:58:37 | 显示全部楼层 |阅读模式

在试脉冲周期时,发现总是有奇怪的数值,逻辑是上升沿触发时,当前值大于上一次的值时,“(当前计数器溢出的次数 * 65536 + 计数器的值)- (上一次的计算结果)”。
发现在计数器溢出中断里,打印寄存器的值,发现溢出时寄存器的值还没有到65535,所以如果恰好在溢出瞬间计算,会导致多溢出了1次,进而导致计算结果大了65536,目前不知道如何解决,所以想要请教大家。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-11-7 08:58:28 | 显示全部楼层
可以做个简单判断。

[C] 纯文本查看 复制代码
/**
  * @brief  Conversion complete callback in non blocking mode 
  * @param  htim : hadc handle
  * @retval None
  */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    if(uhCaptureIndex == 0)
    {
      /* Get the 1st Input Capture value */
      uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
      uhCaptureIndex = 1;
    }
    else if(uhCaptureIndex == 1)
    {
      /* Get the 2nd Input Capture value */
      uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 

      /* Capture computation */
      if (uwIC2Value2 > uwIC2Value1)
      {
        uwDiffCapture = (uwIC2Value2 - uwIC2Value1); 
      }
      else if (uwIC2Value2 < uwIC2Value1)
      {
        /* 0xFFFF is max TIM1_CCRx value */
        uwDiffCapture = ((0xFFFF - uwIC2Value1) + uwIC2Value2) + 1;
      }
      else
      {
        /* If capture values are equal, we have reached the limit of frequency
           measures */
        Error_Handler();
      }
      /* Frequency computation: for this example TIMx (TIM1) is clocked by
         2*APB2Clk as APB2CLKDivider are set to RCC_APB2_DIV2 */      
      uwFrequency = 2*HAL_RCC_GetPCLK2Freq() / uwDiffCapture;
      uhCaptureIndex = 0;
    }
  }
}


回复

使用道具 举报

9

主题

14

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2023-11-7 13:45:36 | 显示全部楼层
eric2013 发表于 2023-11-7 08:58
可以做个简单判断。

[mw_shl_code=c,true]/**

这个应该只适用定时器溢出一次的情况吧,如果周期比较大,需要增加一个定时器的溢出累计值,如 溢出值为10,计数器值是100,上一次溢出值为5,计数器值是200,那么差值就是10 * 65536 + 100 -(5 * 65536 + 200)再根据频率计算吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-11-8 08:02:11 | 显示全部楼层
eoorosy 发表于 2023-11-7 13:45
这个应该只适用定时器溢出一次的情况吧,如果周期比较大,需要增加一个定时器的溢出累计值,如 溢出值为1 ...

“周期比较大”是指的频率比较高吗,这样可以考虑使用输入捕获+DMA方式。
回复

使用道具 举报

9

主题

14

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2023-11-8 09:55:29 | 显示全部楼层
eric2013 发表于 2023-11-8 08:02
“周期比较大”是指的频率比较高吗,这样可以考虑使用输入捕获+DMA方式。

周期很大,指频率比较低呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-11-8 10:20:28 | 显示全部楼层
eoorosy 发表于 2023-11-8 09:55
周期很大,指频率比较低呀

比较低更不用担心了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 03:49 , Processed in 0.259236 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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