这里我们已PB4为例:
![](https://img-blog.csdnimg.cn/img_convert/bea37e2be95e6feffdbd3268c5b50280.png)
![](https://img-blog.csdnimg.cn/img_convert/a2e5c4e4b021c018e5666c3a451aece1.png)
![](https://img-blog.csdnimg.cn/img_convert/82dd9ba2541836d22b9ee7a0bf756488.png)
![](https://img-blog.csdnimg.cn/img_convert/83cd6a8b24232170f2c239788ef16fd6.png)
![](https://img-blog.csdnimg.cn/img_convert/6075ad8ddcd4b52f1ba01718e167c059.png)
开启定时器
![](https://img-blog.csdnimg.cn/img_convert/b75f11a1488727331f03827c47237aad.png)
代码部分:
double fpinlv_jieshou;
uint zhankongbi_jieshou;
uint fpinlv;
float zhankongbi;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //输入捕获回调函数
{
if(htim->Instance == TIM3) // tim3中断
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) //通道检测
{
fpinlv_jieshou = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //获取通道一的直接测量值,用于计算频率
zhankongbi_jieshou = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//获取通道二的直间接量值,用于计算占空比
__HAL_TIM_SetCounter(htim,0); //清零计数值
fpinlv = (80000000/80)/fpinlv_jieshou; 计算频率
zhankongbi = (zhankongbi_jieshou/fpinlv_jieshou)*100; 计算占空比,因为占空比就等于上升沿的计数值比上整个周期的值再乘以100
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1); //开启通道一
HAL_TIM_IC_Start(htim,TIM_CHANNEL_2); //开启通道二
}
}
}
主函数初始化两个通道:
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
最终fpinlv变量存放的值即为我们的频率
zhankongbi变量存放的值即为我们的占空比