1、选择时钟源
2、配置定时器
3、业务代码
int main()
{
HAL_TIM_Base_Start_IT(&htim1); //定时器1使能
HAL_TIM_Base_Start_IT(&htim2); //定时器2使能
...
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim1.Instance)
{
...//定时器1中断业务
}
else if(htim-> Instance == htim2.Instance)
{
...//定时器2中断业务
}
...
}
4、平滑滤波代码
/* 定时器2配置为0.1s触发一次中断 */
/**
* @brief 定时器中断的回调函数
* @param htim 触发中断的定时器
* @retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
if (htim->Instance == htim2.Instance)
{
pwm_sum += pwm_value * 10; // pwm_sum累加
pwm_sum -= pwm_avg; // pwm_sum减去上次的平均值
pwm_avg = pwm_sum * 1.0 / 5; // 更新pwm的平均值
pwm_value_final = pwm_avg; // pwm_value_final的值即为当前pwm的频率
pwm_value = 0; // 将pwm_value清空,重新计数
}
}
/**
* @brief 外部中断的回调函数
* @param GPIO_Pin 触发中断的引脚
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == PWM_Pin)
{ // 判断触发引脚是否是定义的引脚
pwm_value++;
}
}
在任意时刻需要使用
pwm
的频率时,只需要使用
pwm_value_final
的值即可