STM32 PWM 应用
介绍
PWM(Pulse Width Modulation,脉宽调制)是一种通过调节信号的占空比来控制输出功率的技术。在 STM32 微控制器中,PWM 常用于控制 LED 亮度、电机速度、音频信号生成等场景。STM32 的定时器模块可以轻松生成 PWM 信号,本文将逐步讲解如何配置和使用 STM32 的 PWM 功能。
PWM 的基本概念
PWM 信号是一种周期性信号,其周期(Period)和占空比(Duty Cycle)是其主要参数:
- 周期(Period):PWM 信号的完整周期时间。
- 占空比(Duty Cycle):高电平时间与整个周期的比值,通常用百分比表示。
例如,一个 50% 占空比的 PWM 信号表示高电平时间占整个周期的一半。
STM32 定时器与 PWM
STM32 的定时器模块可以配置为 PWM 模式,生成 PWM 信号。常用的定时器模式包括:
- PWM 模式 1:计数器小于比较值时输出高电平,大于比较值时输出低电平。
- PWM 模式 2:计数器小于比较值时输出低电平,大于比较值时输出高电平。
配置步骤
以下是配置 STM32 定时器生成 PWM 信号的基本步骤:
- 启用定时器时钟:通过 RCC 寄存器启用定时器的时钟。
- 配置定时器:设置定时器的预分频器(Prescaler)和自动重装载寄存器(ARR)以确定 PWM 信号的周期。
- 配置 PWM 通道:设置比较寄存器(CCR)以确定占空比。
- 启用 PWM 输出:启动定时器并启用 PWM 输出。
代码示例
以下是一个使用 STM32 HAL 库配置 PWM 的示例代码:
c
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim3;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
// 启动 PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
while (1) {
// 主循环
}
}
static void MX_TIM3_Init(void) {
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 84 - 1; // 预分频器
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 1000 - 1; // 自动重装载寄存器
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&htim3);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 占空比 50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
备注
在上述代码中,我们使用了 TIM3 定时器的通道 1 来生成 PWM 信号。通过设置 Pulse
参数,可以调整 PWM 信号的占空比。
实际应用案例
案例 1:控制 LED 亮度
通过调节 PWM 信号的占空比,可以控制 LED 的亮度。占空比越高,LED 越亮;占空比越低,LED 越暗。
c
void set_led_brightness(uint16_t brightness) {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, brightness);
}
案例 2:控制电机速度
PWM 信号可以用于控制直流电机的速度。通过调节占空比,可以改变电机的转速。
c
void set_motor_speed(uint16_t speed) {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, speed);
}
总结
PWM 是 STM32 微控制器中非常重要的功能,广泛应用于各种控制场景。通过本文的学习,你应该已经掌握了如何配置和使用 STM32 的 PWM 功能,并了解了其在实际应用中的使用方法。
附加资源与练习
- 练习 1:尝试修改代码,使 LED 的亮度逐渐变化(呼吸灯效果)。
- 练习 2:使用 PWM 信号控制一个舵机,尝试让舵机在不同角度之间切换。
提示
如果你对 STM32 的定时器和 PWM 功能有更深入的需求,可以参考 STM32 的参考手册和 HAL 库文档,获取更多详细信息。