STM32F1学习笔记(四)—CubeMX定时器中断+平滑滤波

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 的值即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值