[STM32F4] STM32F407定时器PWM控制LED亮度:从入门到实现

[复制链接]
 楼主| 周半梅 发表于 2024-11-20 07:34 | 显示全部楼层 |阅读模式
PWM(脉宽调制)是一种通过改变信号的占空比来调节输出功率的技术,广泛用于LED亮度调节、马达控制等场景。STM32F407作为一款强大的微控制器,内置多种定时器,能轻松实现PWM功能。本文将以控制LED亮度为例,介绍如何配置定时器的PWM模式,并结合代码进行实现。
一、开发环境准备
  • 硬件

    • STM32F407开发板
    • 一颗普通LED(或RGB LED,选用普通LED以简化)
    • 220Ω电阻
    • 面包板和杜邦线
  • 软件

    • STM32CubeMX
    • STM32CubeIDE
二、PWM简介PWM信号由频率和占空比决定:
  • 频率:PWM信号重复的周期。
  • 占空比:高电平持续时间与周期的比例。
通过改变占空比,可以调节LED的亮度。例如,占空比50%时,LED亮度约为最大的一半。
三、开发步骤1. 硬件连接将LED的正极接到开发板的定时器输出引脚(如PA6,对应TIM3的通道1),负极通过220Ω电阻接GND。
2. 使用STM32CubeMX生成代码
  • 创建新工程,选择STM32F407芯片型号。
  • 在引脚配置界面,启用TIM3_CH1(PA6)。
  • 设置时钟树,将HCLK配置为84MHz(常用值)。
  • 在“Configuration”界面,配置TIM3为PWM模式:
    • 频率:1kHz
    • 占空比初始值:50%
  • 生成代码,选择STM32CubeIDE作为工具链。
3. 编写代码以下是核心代码:
  1. #include "main.h"

  2. TIM_HandleTypeDef htim3;

  3. // 初始化定时器PWM
  4. void MX_TIM3_Init(void) {
  5.     TIM_OC_InitTypeDef sConfigOC = {0};
  6.     htim3.Instance = TIM3;
  7.     htim3.Init.Prescaler = 84 - 1;  // 时钟预分频,得到1MHz
  8.     htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  9.     htim3.Init.Period = 1000 - 1;  // 周期,得到1kHz的PWM
  10.     htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  11.     htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  12.     if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) {
  13.         Error_Handler();
  14.     }
  15.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  16.     sConfigOC.Pulse = 500;  // 初始占空比50%
  17.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  18.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  19.     if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {
  20.         Error_Handler();
  21.     }
  22.     HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);  // 启动PWM
  23. }

  24. // 主程序
  25. int main(void) {
  26.     HAL_Init();
  27.     SystemClock_Config();
  28.     MX_GPIO_Init();
  29.     MX_TIM3_Init();

  30.     while (1) {
  31.         for (int duty = 0; duty <= 1000; duty += 10) {
  32.             __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty);  // 更新占空比
  33.             HAL_Delay(10);
  34.         }
  35.         for (int duty = 1000; duty >= 0; duty -= 10) {
  36.             __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty);
  37.             HAL_Delay(10);
  38.         }
  39.     }
  40. }

  41. void SystemClock_Config(void) {
  42.     // 时钟配置代码由CubeMX自动生成,此处略。
  43. }

  44. void MX_GPIO_Init(void) {
  45.     // GPIO初始化代码由CubeMX自动生成,此处略。
  46. }
四、运行与测试
  • 将代码烧录到STM32F407开发板中。
  • 启动程序后,LED会以1kHz频率逐渐变亮变暗,呈现呼吸灯效果。
五、代码解析
  • 定时器初始化
    设置TIM3为PWM模式,84MHz主时钟通过预分频器降到1MHz,周期1000对应的频率即为1kHz。
  • 占空比调节
    通过__HAL_TIM_SET_COMPARE函数改变通道1的比较值,实现占空比动态调整。
  • PWM呼吸效果
    使用两个循环分别递增和递减占空比,实现LED亮度的平滑过渡。

六、总结本文详细讲解了如何使用STM32F407的定时器实现PWM控制,代码清晰易懂,具有较高的参考价值。通过本次学习,你不仅能掌握PWM的基本原理,还能将其应用于更复杂的嵌入式项目中。

公羊子丹 发表于 2024-11-20 07:34 来自手机 | 显示全部楼层
终于搞懂PWM了,感谢这篇文章,呼吸灯看着真有成就感!
帛灿灿 发表于 2024-11-20 07:35 来自手机 | 显示全部楼层
STM32的定时器功能确实强大,这篇教程手把手教会我了。
童雨竹 发表于 2024-11-20 07:35 来自手机 | 显示全部楼层
原来占空比调节这么简单,之前一直以为很复杂!
万图 发表于 2024-11-20 07:35 来自手机 | 显示全部楼层
这个代码能直接用到我的风扇调速项目里,超实用!
Wordsworth 发表于 2024-11-20 07:36 来自手机 | 显示全部楼层
不知道能不能再讲讲多通道PWM的同步控制?
Pulitzer 发表于 2024-11-20 07:36 来自手机 | 显示全部楼层
CubeMX的引脚配置一直让我头疼,这次终于搞明白了。
Bblythe 发表于 2024-11-20 07:36 来自手机 | 显示全部楼层
TIM3能输出更高频率的PWM吗?我打算用在伺服电机控制上。
Uriah 发表于 2024-11-20 07:36 来自手机 | 显示全部楼层
看到LED呼吸灯实现,我打算试试用RGB灯做彩虹效果!
Clyde011 发表于 2024-11-20 07:37 来自手机 | 显示全部楼层
文章写得太棒了,尤其是代码部分,直接帮我解决了问题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

149

主题

5752

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部