STM32F407 是 STMicroelectronics 推出的高性能 Cortex-M4 内核微控制器,具有丰富的外设和强大的计算能力,适用于各种工业控制、通信、音频处理等应用场景。PWM(脉宽调制)是该款 MCU 的一个常见应用,广泛应用于电机控制、LED调光、音频信号生成等场景。本篇文章将重点介绍如何在 STM32F407 上实现 PWM 输出,并通过具体代码展示如何利用该功能控制 LED 的亮度变化。
STM32F407 的主要特性:- 168MHz 高速 ARM Cortex-M4 内核
- 多达 1MB 的 Flash 和 192KB 的 SRAM
- 丰富的外设资源:ADC、DAC、UART、PWM、SPI 等
- 支持 DSP 和 FPU
1. 硬件准备- STM32F407 开发板
- 一个 LED
- 电源和调试工具
2. 软件开发工具- STM32CubeMX(外设初始化配置)
- Keil MDK(编写和编译代码)
3. PWM 原理简介PWM 是通过改变信号的占空比(高电平时间与周期的比值)来调节输出效果的技术。其应用广泛,例如在 LED 调光中,可以通过调节占空比来控制 LED 的亮度。在电机控制中,通过 PWM 可以调节电机的转速。
4. PWM 在 STM32F407 上的实现STM32F407 具有多个定时器支持 PWM 输出。在本项目中,我们使用定时器 TIM3 来生成 PWM 信号并输出到 GPIO 引脚控制 LED 的亮度。
步骤:- 配置定时器 TIM3 产生 PWM 信号。
- 配置 GPIO 引脚为 PWM 输出模式。
- 编写代码控制 PWM 占空比,从而实现 LED 亮度调节。
5. 实现代码#include "stm32f4xx.h" // 包含STM32F407的外设库
// 系统时钟初始化函数
void SystemClock_Config(void) {
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); // 启用外部高速时钟
while (!RCC_WaitForHSEStartUp()); // 等待时钟稳定
FLASH_SetLatency(FLASH_Latency_5); // 设置闪存访问等待周期
RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_9); // 配置PLL倍频
RCC_PLLCmd(ENABLE); // 使能PLL
while (!RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); // 等待PLL稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 选择PLL作为系统时钟
while (RCC_GetSYSCLKSource() != 0x08); // 确认PLL作为系统时钟
}
// GPIO初始化函数,用于PWM输出引脚
void GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOB时钟,PB6引脚作为PWM输出
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 连接PB6到TIM3的AF模式
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM3);
}
// TIM3定时器初始化函数,配置为PWM模式
void TIM3_PWM_Init(uint32_t frequency, uint32_t dutyCycle) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 定时器基本设置
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // PWM周期
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / (frequency * 1000)) - 1; // 设定频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 配置PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = dutyCycle; // 设置初始占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
// 使能TIM3
TIM_Cmd(TIM3, ENABLE);
}
// 主函数
int main(void) {
SystemClock_Config(); // 初始化系统时钟
GPIO_Init(); // 初始化GPIO
TIM3_PWM_Init(1000, 500); // 初始化PWM,频率为1kHz,占空比为50%
while (1) {
// 主循环,可在此调整占空比以实现不同效果
}
}
代码解析- 系统时钟配置:使用 HSE 作为时钟源,通过 PLL 倍频配置系统时钟为 168MHz。
- GPIO 初始化:将 GPIOB 的第 6 引脚配置为 TIM3 的 PWM 输出引脚,并设定为 AF 模式。
- PWM 配置:TIM3 定时器被配置为 PWM 模式,PWM 信号的频率设置为 1kHz,占空比初始为 50%。可以通过调整占空比动态控制 LED 的亮度。
- 主循环:此处留空,但可以根据项目需求通过修改定时器的占空比来控制 PWM 输出。
6. 应用场景- LED 调光:通过调整 PWM 信号的占空比,可以轻松实现 LED 的亮度调节,适用于智能照明系统。
- 电机控制:PWM 常用于控制直流电机的转速,改变占空比可以实现电机的精确控制。
- 音频信号生成:PWM 可以用来生成不同频率的音频信号,应用于简单的音频设备或报警器。
7. 项目总结通过 STM32F407 的 TIM3 定时器和 GPIO 外设的联合使用,可以轻松实现 PWM 信号的输出控制。本文展示了通过 PWM 技术调节 LED 亮度的一个简单例子,而这一技术在嵌入式系统中的应用范围广泛,包括电机控制、信号生成等。STM32F407 由于其强大的计算能力和丰富的外设资源,能够胜任各种复杂的嵌入式应用场景。
|