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

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

[复制链接]
玉骄龙 提问时间:2021-12-6 20:03 / 未解决
//==============================================================================
//                      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);                         //使能定时器计数
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
收藏 评论4 发布时间:2021-12-6 20:03

举报

4个回答
xmshao 回答时间:2021-12-7 10:26:07
你是在通过定时器捕获时间来测算时间 或频率吧,捕获值是发生捕获事件时计数器的值,被放入捕获寄存器CCR,所以CCR的值没有递增的说法,它只会依据捕获事件发生的不同时刻而改变。
玉骄龙 回答时间:2021-12-14 18:29:17
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的方波。麻烦大佬帮我再仔细看看。感谢!

玉骄龙 回答时间:2021-12-14 20:20:12

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

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

捕获,尤其是连续捕获,很容易跨越一个周期的。但是只要时间差在一个周期内,很容易的。计数器的值设置为上限,直接减就可以了。 跨多周期就麻烦一点,每次计数上限都要中断额外计数,相当于整数部分。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版