对于定时器的单路捕获PWM的频率和脉冲,用cubemx配置:一个通道捕获上升沿,另一个通道捕获下降沿,Slave Mode 为Reset Mode .触发源为 TL1FP1 这可以很好地测量输入信号的周期和高电平时间,是使用定时器输入捕获的常用模式。(但仅限于定时器捕获单路PWM波) 在这种模式下: 1.上升沿到来时,触发中断,保存计数值到CCR1(假设通道1捕获上升沿的计数值),然后定时器的计数值清0(TIMx->CNT = 0)(这一点是关键) 2.下降沿到来时,保存计数值到CCR2(假设通道2捕获下降沿的计数值),定时器的计数值不会清0.
PWM一个周期下映射到定时器的计数值 = 上升沿的计数值.(CCRx) PWM的频率 = 定时器的频率(1M) / (捕获上升沿的计数值 -0) PWM的占空比 = (下降沿的计数值 / 上升沿的计数值) 配置(以通道1上升沿直接捕获,通道2下降沿间接捕获) 给出以上的实例代码 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ static u16 t = 0; static u16 d = 0; if(htim->Instance == TIM2) { if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { LEDDT[0]=1; t = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1; freq = 1000000 / t; duty = (float)d/t*100; } else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { LEDDT[1]=2; d = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1; } }}多路捕获PWM的频率和占空比(状态机实现)我的思路: 配置定时器的两个通道都为上升沿捕获,开启定时器对于通道的输入捕获中断。 状态图 需要注意定时器的计数值有可能会溢出,所以要记录下溢出次数(在定时器的溢出更新中断中记录) PWM频率= 定时器频率/ 两个上升沿之间的计数值 定时器频率 = 系统时钟 /预分频系数 = 1M 两个上升沿之间的计数值 = 第一次上升沿的计数值 +( 溢出次数 x 重装载值)- 第二次上升沿的计数值 PWM占空比 = 有效计数值 / 两个上升沿的计数值 有效计数值(假设以高电平为有效电平) = 下降沿的计数值 + ( 溢出次数 x 重装载值)-上升沿的计数值
|