STM32 PWM 配置
介绍
脉宽调制(PWM,Pulse Width Modulation)是一种通过调节信号的占空比来控制输出功率的技术。在 STM32 微控制器中,PWM 常用于控制 LED 亮度、电机速度、音频生成等应用。STM32 的定时器模块可以轻松生成 PWM 信号,本文将详细介绍如何配置 STM32 的 PWM 功能。
PWM 的基本概念
PWM 信号由两个主要参数定义:
- 频率(Frequency):PWM 信号的周期,即信号重复的时间间隔。
- 占空比(Duty Cycle):高电平时间占整个周期的百分比。
例如,一个 50% 占空比的 PWM 信号表示高电平时间占整个周期的一半。
STM32 定时器与 PWM
STM32 的定时器模块(如 TIM2、TIM3 等)可以配置为 PWM 模式。每个定时器有多个通道,每个通道可以独立生成 PWM 信号。以下是配置 PWM 的基本步骤:
1. 启用定时器时钟
首先,需要启用定时器的时钟。例如,如果使用 TIM2,可以通过以下代码启用时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
2. 配置定时器
接下来,配置定时器的基本参数,如预分频器(Prescaler)和自动重装载寄存器(Auto-reload Register)。这些参数决定了 PWM 信号的频率。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
3. 配置 PWM 模式
然后,配置定时器的 PWM 模式。STM32 支持两种 PWM 模式:PWM 模式 1 和 PWM 模式 2。以下是配置 PWM 模式 1 的示例:
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
4. 启用定时器
最后,启用定时器以开始生成 PWM 信号:
TIM_Cmd(TIM2, ENABLE);
实际案例:控制 LED 亮度
假设我们希望通过 PWM 信号控制一个 LED 的亮度。我们可以使用 TIM2 的通道 1 生成 PWM 信号,并将其连接到 LED 的 GPIO 引脚。
代码示例
#include "stm32f10x.h"
void PWM_Init(void) {
// 启用 GPIO 和 TIM2 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置 GPIOA Pin 0 为复用推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 TIM2
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置 PWM 模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 启用 TIM2
TIM_Cmd(TIM2, ENABLE);
}
int main(void) {
PWM_Init();
while (1) {
// 主循环
}
}
结果
运行上述代码后,LED 将以 50% 的亮度闪烁。通过调整 TIM_OCInitStructure.TIM_Pulse
的值,可以改变 LED 的亮度。
总结
通过本文,我们学习了如何在 STM32 微控制器中配置 PWM 信号。PWM 是一种强大的技术,广泛应用于各种嵌入式系统中。掌握 PWM 的配置方法,可以帮助你实现更复杂的控制功能。
附加资源与练习
- 练习 1:尝试修改代码,使 LED 的亮度逐渐变化(呼吸灯效果)。
- 练习 2:使用不同的定时器和通道生成多个 PWM 信号,控制多个 LED 的亮度。
- 资源:参考 STM32 官方文档,了解更多关于定时器和 PWM 的高级配置选项。
在实际项目中,PWM 信号的质量和稳定性非常重要。确保定时器的配置参数(如预分频器和自动重装载值)能够满足应用需求。