本贴记录STM32输入捕获pwm频率和占空比
STM32TUBEMX配置
1.PA6脚配置
2.按照下图配置参数
3.把上升沿触发改成Both Edges(上升沿和下降沿都触发)
4.打开全局中断![](https://img-blog.csdnimg.cn/direct/d8d15f5adc1f4668b0b7003336d83fbd.png)
代码编写
1.开始输入捕获
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
2.在中断回调函数里面处理主要逻辑
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
// 当捕获输入触发时,此回调将被调用
if(htim==&htim3) {
// 如果触发的是定时器3的输入捕获事件,就进行进一步处理。
static uint32_t up1=0,up2=0,fall=0,situation=0;
// up1, up2和fall记录上升沿和下降沿的时间,situation记录当前的状态机阶段。
switch(situation) {
// 根据当前状态机阶段进行不同的处理。
case 0: {
// 在该阶段,代码期待看到PWM波形的上升沿。
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==1) {
// 如果GPIOA的6号针脚位高电平,代表捕获到了上升沿
situation=1;
// 进入下一阶段(期待下降沿)。
up1=__HAL_TIM_GetCounter(&htim3);
// 记录上升沿的时间(定时器计数器的值)。
}
break;
}
case 1: {
// 在该阶段,代码期待看到PWM波形的下降沿。
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==0) {
// 如果GPIOA的6号针脚为低电平,代表捕获到了下降沿。
situation=2;
// 进入下一阶段(期待上升沿)。
fall=__HAL_TIM_GetCounter(&htim3);
// 记录下降沿的时间(定时器计数器的值)。
} else {
situation=0;
// 如果没有看到下降沿并且引脚位高电平,则重置状态机并重新期待上升沿。
}
break;
}
case 2: {
// 在该阶段,代码期待看到PWM波形的下一个上升沿。
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==1) {
// 如果GPIOA的6号针脚位高电平,代表捕获到了上升沿
situation=0;
// 重置状态机并重新期待下一个上升沿。
up2=__HAL_TIM_GetCounter(&htim3);
// 记录下一个上升沿的时间(定时器计数器的值)。
__HAL_TIM_SetCounter(&htim3,0);
// 重置定时器计数器以开始新的PWM周期。
pwm_duty=(fall-up1)*100/(up2-up1);
// 计算并更新PWM占空比。
pwm_pinlv=1000000/(up2-up1);
// 计算并更新PWM频率(假设定时器的计数频率为1MHz)。
} else {
situation=0;
// 如果没有看到上升沿并且引脚位低电平,则重置状态机并重新期待上升沿。
}
break;
}
}
}
}