前言:蓝桥杯嵌入式扩展板中,PWM1与PWM2分别为TIM3_CH1和TIM3_CH2,双通道的PWMI模式冲突,而两者又均有测量占空比的需求,故需使用单通道进行极性转换来同时测量占空比。
一、CubeMX配置:
由于是单通道的PWMI,故与输入捕获配置相同,不要忘记打开NVIC中断控制。
二、代码部分:
初始化开启定时器输入捕获:
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
处理中断函数:
int ccr[2]={0}; //ccr[0]为高电平计数值,ccr[1]为一个周期的计数值
float fre=0;
float duty=0;
uint8_t flag=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
if(htim->Instance == htim3.Instance){
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){ //TIM3 通道1
if(flag == 0){
__HAL_TIM_SetCounter(htim,0); //清0计数器
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); //设置成下降沿触发
flag = 1;
}
else if (flag == 1){
ccr[0] = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //读取CCR寄存器数值,此时为高电平计数值
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); //设置成上升沿触发
flag = 2;
}
else if (flag == 2){
ccr[1] = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //读取CCR寄存器数值,此时为一个周期的计数值
fre = (float)1000000 / (float)(ccr[1]+1); //计算频率
duty = (float)(ccr[0]+1) / (float)(ccr[1]+1); //计算占空比
flag = 0;
}
}
}
}
注意:务必不要在中断函数里做一些耗时操作(如串口打印,控制LCD等),耗时任务会导致紧接着来的中断信号无法进入新的中断服务,最终呈现出结果跳变!