久芯网

STM32G030C8T6 TIM16 CH1输入捕获值怎么是递增的?

avatar 玉骄龙 提问时间: 2023-08-15 17:43:34 / 未解决
//==============================================================================
//                      TIMER16用于频率检测
//==============================================================================
void STM32G0_TIM16_INPUT_Init(void)
{
LL_TIM_InitTypeDef                    TIM_InitStruct      = {0};
LL_TIM_IC_InitTypeDef                 TIM_IC_InitStruct   = {0};

LL_APB2_GRP1_EnableClock              (LL_APB2_GRP1_PERIPH_TIM16);
//TIM16基本配置-------------
TIM_InitStruct.Prescaler              = 6400 - 1;//分频后的时钟为:64000000/6400=10KHZ=0.1mS
TIM_InitStruct.CounterMode            = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload             = 0xFFFF;
TIM_InitStruct.ClockDivision          = LL_TIM_CLOCKDIVISION_DIV1;
TIM_InitStruct.RepetitionCounter      = 0;
LL_TIM_Init                           (TIM16,     &TIM_InitStruct);
//TIM16输入配置------------
LL_TIM_SetRemap                       (TIM16,     LL_TIM_TIM16_TI1_RMP_GPIO);//输入选择=GPIO(TIM16_CH1)

TIM_IC_InitStruct.ICActiveInput       = LL_TIM_ACTIVEINPUT_DIRECTTI;//输入
TIM_IC_InitStruct.ICFilter            = LL_TIM_IC_FILTER_FDIV1;//滤波
TIM_IC_InitStruct.ICPolarity          = LL_TIM_IC_POLARITY_FALLING;//下降沿
TIM_IC_InitStruct.ICPrescaler         = LL_TIM_ICPSC_DIV1;//分频
LL_TIM_IC_Init                        (TIM16,     LL_TIM_CHANNEL_CH1, &TIM_IC_InitStruct);

LL_TIM_CC_EnableChannel               (TIM16,     LL_TIM_CHANNEL_CH1);    //使能TIM16_CH1
LL_TIM_EnableCounter                  (TIM16);                         //使能定时器计数
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

如需获得 STM32G030C8T6 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

4个回答
  • avatar xmshao
    回答时间: 2023-08-15 18:09:01

    你是在通过定时器捕获时间来测算时间 或频率吧,捕获值是发生捕获事件时计数器的值,被放入捕获寄存器CCR,所以CCR的值没有递增的说法,它只会依据捕获事件发生的不同时刻而改变。

  • avatar 玉骄龙
    回答时间: 2023-08-15 18:33:22
    xmshao 发表于 2021-12-7 10:26
    你是在通过定时器捕获时间来测算时间 或频率吧,捕获值是发生捕获事件时计数器的值,被放入捕获寄存器CCR, ...

    谢谢大佬关注!您说的原理是正确的。但我的问题现在仍没找到原因。初始化程序是用STM32 CUBE MX生存的。 // TIMER16_CH1捕获中断 void TIM16_IRQHandler(void) { #define FLOW_BUFF_SIZE 64//可以修改! //--------------------------- su8 FLOW_BUFF_counter = 0; su16 FLOW_Buff[FLOW_BUFF_SIZE] = {0}; u32 sum = 0; u8 j = 0; if(LL_TIM_IsActiveFlag_CC1OVR(TIM16) == 0) { return; } LL_TIM_ClearFlag_CC1OVR(TIM16); if(FLOW_BUFF_counter < FLOW_BUFF_SIZE) { FLOW_BUFF_counter++; } else { FLOW_BUFF_counter = 0; } FLOW_Buff[FLOW_BUFF_counter] = LL_TIM_IC_GetCaptureCH1(TIM16); } FLOW_Buff数组中的数是不规则的。输入是20KHZ的方波。麻烦大佬帮我再仔细看看。感谢!

  • avatar 玉骄龙
    回答时间: 2023-08-15 18:55:09

    谢谢大家的关注!问题解决了。原因是:定时器关闭了自动重载(不知道能不能开启自动重载,在发生捕获后,计数器会不会又从重载值开始计数),所以定时器就无限循环计数下去。当发生捕获时,仅当计数器的值保存在CCR1中。所以要计算频率就得读取两次捕获,计算差值,才是信号的周期值。另外,当捕获频率较低的信号时,一定要计算好定时器的预分频值。这样可以防止在一个计数周期内没有捕获,而在下一个周期才发生了捕获。当然捕获的值就没有规律可言了。谢谢大家关注!

  • avatar butterflyspring
    回答时间: 2023-08-15 19:13:28
    玉骄龙 发表于 2021-12-14 20:20
    [md]谢谢大家的关注!问题解决了。原因是:定时器关闭了自动重载(不知道能不能开启自动重载,在发生捕获后 ...

    捕获,尤其是连续捕获,很容易跨越一个周期的。但是只要时间差在一个周期内,很容易的。计数器的值设置为上限,直接减就可以了。 跨多周期就麻烦一点,每次计数上限都要中断额外计数,相当于整数部分。

会员中心 微信客服
客服
回到顶部