[STM32G4] STM32G431:基于PWM的LED亮度控制

[复制链接]
2823|9
 楼主| Bblythe 发表于 2024-12-9 07:43 | 显示全部楼层 |阅读模式
在现代嵌入式开发中,PWM(脉宽调制)是控制LED亮度、驱动电机和产生音频信号的常用技术之一。本篇文章将以STM32G431微控制器为例,介绍如何通过TIM1定时器生成PWM信号来调节LED亮度。STM32G431凭借其高性能和丰富外设,非常适合此类应用。
硬件需求
  • STM32G431开发板
  • LED和电阻(220欧姆)
  • USB调试器(如ST-LINK)
  • 外部电源(如5V供电模块)
软件需求
  • STM32CubeIDE
  • STM32CubeMX
实现目标
  • 初始化TIM1定时器生成PWM信号
  • 通过改变占空比控制LED亮度

代码实现以下代码展示了如何配置TIM1定时器生成PWM信号并通过简单的循环改变占空比:
  1. #include "main.h"

  2. // PWM占空比变量
  3. uint32_t duty_cycle = 0;
  4. uint8_t increment = 1;

  5. // TIM1初始化函数
  6. void TIM1_PWM_Init(void) {
  7.     TIM_HandleTypeDef htim1;
  8.     TIM_OC_InitTypeDef sConfigOC = {0};

  9.     __HAL_RCC_TIM1_CLK_ENABLE(); // 开启TIM1时钟

  10.     htim1.Instance = TIM1;
  11.     htim1.Init.Prescaler = 79; // 1MHz计数频率
  12.     htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  13.     htim1.Init.Period = 1000; // PWM周期1ms(1kHz频率)
  14.     htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  15.     htim1.Init.RepetitionCounter = 0;

  16.     HAL_TIM_PWM_Init(&htim1);

  17.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  18.     sConfigOC.Pulse = 0; // 初始占空比0%
  19.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  20.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  21.     HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
  22.     HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  23. }

  24. // LED亮度调节函数
  25. void Adjust_LED_Brightness(void) {
  26.     if (increment) {
  27.         duty_cycle++;
  28.         if (duty_cycle >= 1000) increment = 0; // 亮度到达最大,开始下降
  29.     } else {
  30.         duty_cycle--;
  31.         if (duty_cycle == 0) increment = 1; // 亮度到达最小,开始上升
  32.     }

  33.     __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty_cycle);
  34. }

  35. int main(void) {
  36.     HAL_Init();
  37.     SystemClock_Config();
  38.     TIM1_PWM_Init();

  39.     while (1) {
  40.         Adjust_LED_Brightness();
  41.         HAL_Delay(1); // 每1ms调整一次亮度
  42.     }
  43. }
代码解析
  • 时钟配置
    TIM1计数频率通过预分频器设定为1MHz,PWM频率通过周期寄存器设定为1kHz。
  • PWM信号生成
    使用TIM_OCMODE_PWM1模式,初始占空比为0%。
  • 动态调整占空比
    通过__HAL_TIM_SET_COMPARE修改TIM1的比较值实现占空比动态调节,进而控制LED亮度。


编译与运行
  • 打开STM32CubeMX,配置时钟、GPIO、TIM1外设,生成项目。
  • 在STM32CubeIDE中粘贴以上代码并编译。
  • 使用ST-LINK调试器下载代码到STM32G431。
  • 观察LED亮度随着时间缓慢变化。

小结通过本篇文章,我们详细介绍了如何使用STM32G431的TIM1生成PWM信号并控制LED亮度的实现方法。PWM是嵌入式开发中的重要技能,希望本示例能帮助你更好地理解它的应用。

公羊子丹 发表于 2024-12-9 07:43 | 显示全部楼层
这个例子真的很实用,学到了控制LED的技巧!
周半梅 发表于 2024-12-9 07:44 | 显示全部楼层
看完感觉对PWM信号有了全新的理解,感谢分享!
帛灿灿 发表于 2024-12-9 07:44 | 显示全部楼层
请问如果用TIM2代替TIM1,这部分代码需要怎么改?
童雨竹 发表于 2024-12-9 07:44 | 显示全部楼层
代码逻辑清晰,适合初学者实践,给个赞!
万图 发表于 2024-12-9 07:44 | 显示全部楼层
在硬件上有没有遇到电阻值选择的问题?
Wordsworth 发表于 2024-12-9 07:45 | 显示全部楼层
这个亮度调节的效果很平滑,我也打算试试!
Pulitzer 发表于 2024-12-9 07:45 | 显示全部楼层
STM32CubeIDE配置部分可以再详细点就更好了。
Uriah 发表于 2024-12-9 07:45 | 显示全部楼层
这个程序运行后电流会不会有波动影响其他器件?
Clyde011 发表于 2024-12-9 07:45 | 显示全部楼层
最近也在学STM32,终于找到这么清楚的PWM例子了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

193

主题

6460

帖子

1

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