[STM32G4] STM32G431的PWM输出应用

[复制链接]
1165|12
 楼主| 米多0036 发表于 2025-1-18 07:05 | 显示全部楼层 |阅读模式
在 STM32G431 中,PWM(脉宽调制)技术广泛应用于各种电子控制系统,从简单的 LED 亮度调节到复杂的电机控制,PWM 控制通过调节信号的占空比来精确控制输出。本文将通过一个简单的例子,逐步带你了解如何利用 STM32G431 实现 PWM 控制应用,帮助你深入掌握 PWM 信号的配置和调试。
1. PWM 控制概述PWM 是一种通过调整信号的占空比来控制功率输出的方式。占空比(Duty Cycle)是高电平时间与周期总时间的比率。通过调节占空比,PWM 信号可以实现不同的输出效果,常见的应用包括:
  • LED 调光:通过改变占空比,调节 LED 的亮度。
  • 电机控制:通过控制电机的平均电压来调节转速或位置。
  • 音频生成:通过生成不同频率和占空比的 PWM 信号来产生音频波形。
2. 基础 PWM 输出:LED 亮度调节LED 的亮度调节是最常见的 PWM 应用之一。通过调节 PWM 信号的占空比,可以控制 LED 的平均电流,从而实现亮度的调节。
2.1 选择定时器和引脚首先,我们选择一个定时器(例如 TIM1 或 TIM8),并选择一个支持 PWM 输出的引脚(例如 PA8)。STM32G431 提供了多种可配置的 PWM 输出引脚。
2.2 配置定时器假设我们使用 TIM1 来生成 PWM 信号,代码如下:
c
复制编辑


#include "stm32g4xx_hal.h"TIM_HandleTypeDef htim1;void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_TIM1_Init(void);int main(void){    HAL_Init();    SystemClock_Config();    MX_GPIO_Init();    MX_TIM1_Init();        // 启动 PWM 输出    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);        while (1)    {        // 设置 PWM 占空比,逐步增加亮度        for (uint32_t pulse = 0; pulse < 1000; pulse += 50) {            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse);            HAL_Delay(100);  // 每100ms改变一次占空比        }    }}static void MX_TIM1_Init(void){    htim1.Instance = TIM1;    htim1.Init.Prescaler = 79;   // 设置预分频器    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;    htim1.Init.Period = 999;     // 设置自动重载值(ARR)    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    htim1.Init.RepetitionCounter = 0;    HAL_TIM_PWM_Init(&htim1);    TIM_OC_InitTypeDef sConfigOC;    sConfigOC.OCMode = TIM_OCMODE_PWM1;    sConfigOC.Pulse = 499;       // 初始占空比为 50%    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);}static void MX_GPIO_Init(void){    GPIO_InitTypeDef GPIO_InitStruct = {0};    __HAL_RCC_GPIOA_CLK_ENABLE();    GPIO_InitStruct.Pin = GPIO_PIN_8;   // 使用 PA8 引脚输出 PWM    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;    GPIO_InitStruct.Pull = GPIO_NOPULL;    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}

2.3 调节占空比通过 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse); 调整占空比(CCR),改变 LED 的亮度。在上述代码中,PWM 占空比会从 0%(灭灯)逐步增加到 100%(全亮),实现 LED 的亮度调节。

Clyde011 发表于 2025-1-20 10:30 | 显示全部楼层
哇,这个例子看起来真是很实用!可以用在很多项目里,比如用来调节LED亮度。
公羊子丹 发表于 2025-1-20 10:31 | 显示全部楼层
这个定时器的配置方法我还不是很熟悉,能不能再详细讲讲定时器的工作原理?
周半梅 发表于 2025-1-20 10:31 | 显示全部楼层
看着这篇帖子让我想起之前做电机控制的项目,PWM控制真的是太方便了。
帛灿灿 发表于 2025-1-20 10:31 | 显示全部楼层
想问一下,PWM的频率和占空比设置有什么需要注意的地方吗?
童雨竹 发表于 2025-1-20 10:31 | 显示全部楼层
这篇帖子讲解的很清楚,我也准备在我的STM32项目中试试PWM输出。
万图 发表于 2025-1-20 10:32 | 显示全部楼层
一般来说,PWM的频率该怎么选择?是越高越好吗?
Wordsworth 发表于 2025-1-20 10:33 | 显示全部楼层
这个帖子对我帮助很大,尤其是在调节LED亮度方面,能省不少麻烦。
Bblythe 发表于 2025-1-20 10:34 | 显示全部楼层
不过,对于音频生成的部分,有没有相关的应用案例分享一下?
Pulitzer 发表于 2025-1-20 10:34 | 显示全部楼层
STM32的PWM功能真的好强大,完全可以替代一些模拟电路的功能。
Uriah 发表于 2025-1-20 10:34 | 显示全部楼层
我觉得这个帖子适合新手,特别是那些想了解PWM基础的人。
Amazingxixixi 发表于 2025-1-21 17:01 | 显示全部楼层
学习一下啊,还有好多需要学习的。
SophiaOP 发表于 2025-1-22 22:44 来自手机 | 显示全部楼层
pwm参数设置是实时生效的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

1431

帖子

2

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