跳到主要内容

STM32 PWM基础

PWM(脉宽调制)是嵌入式系统中常用的一种技术,用于控制模拟信号。通过调整信号的占空比,PWM可以模拟不同的电压水平,从而控制设备的亮度、速度或位置。在STM32微控制器中,PWM功能通常由定时器模块实现。本文将详细介绍STM32中的PWM基础,帮助初学者理解其工作原理和配置方法。

什么是PWM?

PWM是一种通过快速切换信号的高低电平来模拟模拟信号的技术。信号的占空比(Duty Cycle)决定了高电平的时间占总周期的比例。例如,50%的占空比意味着高电平和低电平的时间相等。

PWM的基本参数

  • 周期(Period):PWM信号的完整周期时间。
  • 占空比(Duty Cycle):高电平时间与周期的比值。
  • 频率(Frequency):PWM信号的频率,即周期的倒数。

STM32 中的PWM实现

在STM32中,PWM通常由定时器模块生成。定时器可以配置为PWM模式,并通过调整计数器的值来控制占空比。

配置步骤

  1. 初始化定时器:设置定时器的时钟源、预分频器和自动重装载寄存器(ARR)。
  2. 配置PWM模式:选择PWM模式1或模式2,并设置捕获/比较寄存器(CCR)。
  3. 启动定时器:使能定时器以开始生成PWM信号。

代码示例

以下是一个简单的STM32 PWM配置示例,使用HAL库:

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();

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);
}

void SystemClock_Config(void)
{
// 系统时钟配置代码
}
备注

在上述代码中,Pulse值设置为500,表示占空比为50%。你可以通过调整Pulse值来改变占空比。

实际应用场景

PWM在嵌入式系统中有广泛的应用,以下是一些常见的应用场景:

  1. LED调光:通过调整PWM的占空比,可以控制LED的亮度。
  2. 电机控制:PWM用于控制电机的转速和方向。
  3. 音频生成:PWM可以用于生成简单的音频信号。

案例:LED调光

假设我们有一个连接到STM32的LED,我们可以通过PWM来控制其亮度。以下是一个简单的调光示例:

c
void LED_Dimming(uint16_t brightness)
{
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = brightness; // 设置亮度
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}
提示

你可以通过循环逐渐增加或减少brightness值,实现LED的渐变效果。

总结

PWM是STM32微控制器中一个强大的功能,广泛应用于各种嵌入式系统中。通过理解PWM的基本原理和配置方法,你可以轻松实现LED调光、电机控制等功能。希望本文能帮助你掌握STM32中的PWM基础,并为你的项目提供灵感。

附加资源

练习

  1. 修改上述代码,实现LED的呼吸灯效果。
  2. 尝试使用不同的定时器和通道生成PWM信号。
  3. 探索PWM在电机控制中的应用,并尝试实现一个简单的电机调速程序。