[STM32G4] 探索 STM32G431 的 PWM 控制:从配置到应用

[复制链接]
 楼主| Clyde011 发表于 2024-11-30 08:19 | 显示全部楼层 |阅读模式
随着嵌入式系统的快速发展,ST 的 STM32 系列微控制器因其高性能和丰富的外设功能被广泛应用于工业、消费电子等领域。本文将以 STM32G431 为例,深入探讨其 PWM(脉宽调制)功能的配置与应用,包括硬件配置、固件代码以及实际应用场景分析。
PWM 简介PWM 是一种通过调节信号占空比来控制设备的技术,常用于电机控制、LED 调光和音频信号生成。STM32G431 的定时器模块为 PWM 提供了强大的硬件支持,使开发者可以高效生成稳定的 PWM 信号。
硬件配置
  • 开发板和工具
    使用 NUCLEO-G431RB 开发板,并借助 STM32CubeIDE 进行开发。
  • 连接电路

    • 将一个 LED 连接到 GPIO 引脚(如 PA8)。
    • 通过 PWM 信号控制该 LED 的亮度变化。
  • 时钟设置
    使用 STM32CubeMX 配置时钟源,确保定时器和 PWM 功能有足够的时钟频率支持。

软件配置与实现以下代码展示了如何配置 STM32G431 的 TIM1 来生成 PWM 信号。
  1. #include "stm32g4xx_hal.h"

  2. // 定义定时器句柄
  3. TIM_HandleTypeDef htim1;

  4. // PWM 配置函数
  5. void PWM_Init(void) {
  6.     __HAL_RCC_TIM1_CLK_ENABLE(); // 启用 TIM1 时钟
  7.     __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟

  8.     // 配置 GPIO PA8 为 TIM1_CH1
  9.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  10.     GPIO_InitStruct.Pin = GPIO_PIN_8;
  11.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  12.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  13.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  14.     GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
  15.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  16.     // 配置 TIM1 基本参数
  17.     TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  18.     TIM_OC_InitTypeDef sConfigOC = {0};

  19.     htim1.Instance = TIM1;
  20.     htim1.Init.Prescaler = 80 - 1; // 分频系数
  21.     htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  22.     htim1.Init.Period = 1000 - 1; // 自动重载值
  23.     htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  24.     htim1.Init.RepetitionCounter = 0;
  25.     HAL_TIM_PWM_Init(&htim1);

  26.     // 配置 PWM 模式
  27.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  28.     sConfigOC.Pulse = 500; // 初始占空比 50%
  29.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  30.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  31.     HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);

  32.     // 启动 PWM
  33.     HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  34. }

  35. // 主函数
  36. int main(void) {
  37.     HAL_Init();
  38.     PWM_Init();

  39.     while (1) {
  40.         for (uint16_t duty = 0; duty <= 1000; duty += 10) {
  41.             __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty); // 调整占空比
  42.             HAL_Delay(50); // 50ms 延时
  43.         }
  44.         for (uint16_t duty = 1000; duty >= 10; duty -= 10) {
  45.             __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
  46.             HAL_Delay(50);
  47.         }
  48.     }
  49. }
代码解析
  • 时钟配置
    启用了 TIM1 和 GPIOA 的时钟,并通过 HAL 库设置了时钟分频和计数器模式。
  • PWM 信号生成
    TIM1 的通道 1(PA8)被配置为 PWM 模式,起始占空比为 50%。
  • 占空比动态调整
    主循环中通过 __HAL_TIM_SET_COMPARE 修改占空比,从而实现 LED 的渐亮和渐暗效果。

实际应用场景
  • 电机速度控制
    通过改变 PWM 信号占空比控制电机的转速,适用于风扇、泵等设备。
  • LED 调光
    在智能家居中,使用 PWM 控制 LED 的亮度,实现节能和环境氛围调节。
  • 音频信号生成
    利用高频 PWM 信号合成不同音调,用于蜂鸣器等音频设备。

小结STM32G431 作为一款性能强大的 MCU,在 PWM 控制方面表现出色。通过合理的硬件配置和软件设计,开发者可以轻松实现多种 PWM 应用,为嵌入式系统开发提供无限可能。

公羊子丹 发表于 2024-11-30 08:19 | 显示全部楼层
原来用 STM32 控制 LED 调光这么简单,下次我也试试!
周半梅 发表于 2024-11-30 08:19 | 显示全部楼层
这篇文章帮我理清了 PWM 的配置逻辑,感谢分享!
帛灿灿 发表于 2024-11-30 08:19 | 显示全部楼层
如果要控制多个 LED,是不是可以用其他通道?
童雨竹 发表于 2024-11-30 08:20 | 显示全部楼层
用 STM32CubeMX 配置 TIM1 的时候需要注意什么?
万图 发表于 2024-11-30 08:20 | 显示全部楼层
有没有考虑过用 DMA 实现占空比的自动调整?
Wordsworth 发表于 2024-11-30 08:20 | 显示全部楼层
STM32G431 的 TIM1 支持并联吗?适合多电机同步控制吗?
Pulitzer 发表于 2024-11-30 08:20 | 显示全部楼层
这个例子真是太实用了,我用它改进了自己的风扇控制项目。
Bblythe 发表于 2024-11-30 08:21 | 显示全部楼层
PWM 还能用来生成音频,涨知识了!
Uriah 发表于 2024-11-30 08:21 | 显示全部楼层
用 HAL 库配置确实方便,但直接操作寄存器会不会更高效?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

5518

帖子

0

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

139

主题

5518

帖子

0

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