相关配置
原理图
Cubemx配置
keil代码
中断代码
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr1a=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
ccr1b=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);
__HAL_TIM_SetCounter(&htim2,0);
ccr_duty1=((float)ccr1b/ccr1a)*100;
frq1=80000000/80/ccr1a;
HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);
}
}
if(htim->Instance==TIM3)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr2a=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);
ccr2b=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SetCounter(&htim3,0);
ccr_duty2=(float)ccr2b/ccr2a*100;
frq2=80000000/80/ccr2a;
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);
}
}
}
需要注意的是在这段代码中计算占空比时,由于ccra和ccrb都是uint类型,ccrb比ccra小,ccrb/ccra根据c语言计算规则会计算为0,所以我们要在前面加一个(float)强制类型转换
主函数
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,10);
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,10);
//输入捕获NE555
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
开启PWM,开启捕获中断。
这里也有一点需要注意,在CubeMX中配置PWM的时候,最好设置一下占空比,或者在初始化阶段设置占空比,不然如果占空比为0的话检测不到上升沿或者下降沿,也就检测不出频率来。
我的板子不知道为什么PB4选择TIM3可以通过杜邦线可以测量其他引脚的PWM频率和占空比,但它本身通过J9跳线帽连接的引脚却测不出俩