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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-05 20:42:05       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-05 20:42:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-05 20:42:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-05 20:42:05       18 阅读

热门阅读

  1. SQL生成自然数,日历序列 浅析

    2024-06-05 20:42:05       8 阅读
  2. 前端如何去除本地版本号缓存

    2024-06-05 20:42:05       8 阅读
  3. 广东省青少年编程预选赛:挑战与机遇并存

    2024-06-05 20:42:05       9 阅读
  4. 多角度剖析事务和事件的区别

    2024-06-05 20:42:05       6 阅读
  5. 添加pip源,ubuntu

    2024-06-05 20:42:05       7 阅读