| //============================================================================== // 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 等器件的更多信息,请点击链接或 点击此处 联系在线客服!
你是在通过定时器捕获时间来测算时间 或频率吧,捕获值是发生捕获事件时计数器的值,被放入捕获寄存器CCR,所以CCR的值没有递增的说法,它只会依据捕获事件发生的不同时刻而改变。
你是在通过定时器捕获时间来测算时间 或频率吧,捕获值是发生捕获事件时计数器的值,被放入捕获寄存器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的方波。麻烦大佬帮我再仔细看看。感谢!
谢谢大家的关注!问题解决了。原因是:定时器关闭了自动重载(不知道能不能开启自动重载,在发生捕获后,计数器会不会又从重载值开始计数),所以定时器就无限循环计数下去。当发生捕获时,仅当计数器的值保存在CCR1中。所以要计算频率就得读取两次捕获,计算差值,才是信号的周期值。另外,当捕获频率较低的信号时,一定要计算好定时器的预分频值。这样可以防止在一个计数周期内没有捕获,而在下一个周期才发生了捕获。当然捕获的值就没有规律可言了。谢谢大家关注!
[md]谢谢大家的关注!问题解决了。原因是:定时器关闭了自动重载(不知道能不能开启自动重载,在发生捕获后 ...
捕获,尤其是连续捕获,很容易跨越一个周期的。但是只要时间差在一个周期内,很容易的。计数器的值设置为上限,直接减就可以了。 跨多周期就麻烦一点,每次计数上限都要中断额外计数,相当于整数部分。