这个有两种方式,第一种是最简单的,按照以下方法配置就可以了

这个表示使用了通道2作为PWM的输入通道,同时在这里有一个默认配置

可以根据自己需要调整这两个通道的触发中断的条件,并且 默认设置了CH2是间接得到PWM,CH1是直接得到PWM,这样可以让这两个通道得到同一个PWM的数据,然后可以更改他们的触发条件,可以是检测到上升沿也可以是检测到下降沿触发,后全部完成后可以进入keil
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
启动中断,然后在定时器的输入捕获中断函数写以下代码
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //定时器3对应的输入捕获函数
{
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
Fall_count = TIM3->CCR1;
}
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
Rising_count = TIM3->CCR2;
// TIM3->CNT = 0;
}
UNUSED(htim);
}
运行后得到以下效果,我的通道二是上升沿开始计数,通道一是下降沿开始计数,它的原理很奇怪,默认刚开始是上升沿,然后再检测到上升沿就把CNT丢到CCR2同时会把CNT归零也就形成了周期,检测到下降沿的时候会把CNT的值丢进去CCR1也就形成了占空比,下面一种方法能更好帮你理解,先看成品效果图

方法二


重复上面操作,打开PWM输入捕获中断,写好输入捕获中断函数,然后发现CCR1和CCR2的值一直在变化,这个时候尝试加入CNT = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //定时器3对应的输入捕获函数
{
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
Fall_count = TIM3->CCR1;
}
if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
Rising_count = TIM3->CCR2;
TIM3->CNT = 0;
}
UNUSED(htim);
}
我们会有以下答案,与之前的值差了一点,这个可能是程序运行时间,但是我们丢进去在 ch1里面产生CNT = 0;

CNT = 0发生在CH1时我们发现CCR1和CCR2交换了值,这更验证了我们的猜想,CNT = 0发生在上升沿,并且默认刚开始是上升沿,然后第二次识别到上升沿才触发中断形成周期。
当然Fall_count = HAL_TIM_ReadCapturedValue (&htim3,TIM_CHANNEL_1);和我的直接读取寄存器的效果是一样的
这种方法并不准确,主要在于这个CNT = 0;存放位置,感谢各位大佬帮忙指正
459

被折叠的 条评论
为什么被折叠?



