在 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 的亮度调节。
|