4. STM32CubeMX配置(下):定时器TIM2配置为PWM输出(CH1-CH4)、PWM频率与占空比计算、GPIO引脚分配与核对

好,咱们接着上一讲继续。ADC那边配置完了,现在轮到PWM了。这一章我带你把TIM2的四个通道全配成PWM输出,顺便把频率和占空比怎么算彻底讲明白。最后别忘了核对引脚,这一步出问题,板子可是会冒烟的。

4.1 TIM2的PWM模式配置

在CubeMX里,找到左侧的Timers → TIM2。我习惯先把Clock Source选为Internal Clock,这样TIM2的时钟就来自APB1总线。然后往下翻,看到Channel1到Channel4,全部选成PWM Generation CHx。

小提示: 如果你只需要两路PWM,也可以只配CH1和CH2。但咱们这课程要做四路联合调试,所以全开。我在项目里经常留两路备用,方便后期扩展。

配置完通道模式后,重点来了——Parameter Settings选项卡。这里需要填三个关键参数:Prescaler(预分频器)、Counter Period(自动重装载值)、以及Pulse(脉冲宽度)。

参数 说明 我的建议值
Prescaler (PSC) 分频系数,决定计数时钟频率 71
Counter Mode 计数方向,选Up(向上计数) Up
Counter Period (ARR) 自动重装载值,决定PWM周期 999
Auto-reload preload 使能预装载,防止更新瞬间波形异常 Enable
CH1~CH4 Pulse 初始占空比对应的计数值 250 / 500 / 750 / 999
注意: 我曾经遇到过一个问题——忘了使能Auto-reload preload。结果在运行时修改占空比,波形会突然跳变一下,导致电机抖动。所以这个选项一定要勾上。

4.2 PWM频率与占空比计算

说白了,PWM的频率和占空比就是两个公式的事。但很多人栽在时钟树上,所以我先给你理清时钟路径。

TIM2挂在APB1上。如果APB1的时钟是72MHz(一般STM32F1系列默认是这样),那么TIM2的输入时钟就是72MHz。经过预分频器PSC后,计数器的时钟频率变成:

CK_CNT = 72MHz / (PSC + 1) = 72MHz / (71 + 1) = 1MHz

也就是说,计数器每1微秒加1。然后ARR决定了计数周期:

PWM频率 = CK_CNT / (ARR + 1) = 1MHz / (999 + 1) = 1kHz

所以,咱们配出来的PWM频率就是1kHz,周期1毫秒。占空比呢?由Pulse值决定:

占空比 = Pulse / (ARR + 1) × 100%

CH1: 250 / 1000 = 25%
CH2: 500 / 1000 = 50%
CH3: 750 / 1000 = 75%
CH4: 999 / 1000 = 99.9%
核心公式:
  • PWM频率 = 定时器时钟 / (PSC + 1) / (ARR + 1)
  • 占空比 = Pulse / (ARR + 1) × 100%
记住这两个公式,以后调任何PWM都不怕。

你想想看,如果我想让频率变成10kHz,怎么办?把ARR改成99就行。但要注意,ARR变小后,占空比的精度也会降低。这就是为什么高频PWM的调节精度不如低频的。我在做电机控制时,一般选10kHz~20kHz,既能避开人耳噪声,又能保证足够的占空比分辨率。

4.3 GPIO引脚分配与核对

配置完TIM2后,CubeMX会自动把PWM输出映射到对应的GPIO引脚上。但自动分配不一定是你想要的,所以必须手动核对。

切换到Pinout View,找到TIM2的四个通道对应的引脚:

通道 默认引脚(STM32F103C8T6) 复用功能
TIM2_CH1 PA0 AF2 (TIM2)
TIM2_CH2 PA1 AF2 (TIM2)
TIM2_CH3 PA2 AF2 (TIM2)
TIM2_CH4 PA3 AF2 (TIM2)

在Pinout View里,这些引脚应该显示为TIM2_CH1之类的绿色标签。如果显示的是GPIO_Input或别的,说明引脚冲突了。我遇到过最坑的一次,是PA0同时被ADC和TIM2占用,结果两个功能都跑不起来。

避坑指南: 我曾经在某个项目里,因为偷懒没核对引脚,直接把PA0~PA3全配成PWM输出。结果PA2被板上的按键占用了,一按按键,PWM波形就乱跳。所以,一定要对照原理图核对每个引脚的功能,确保没有冲突。

核对无误后,在GPIO Settings里检查一下每个引脚的配置:

  • Output level: 建议选Low,防止上电瞬间输出高电平
  • Mode: 选Alternate Function Push-Pull
  • Pull-up/Pull-down: 一般选No pull,除非你外部电路有特殊要求
  • Maximum output speed: 选High,PWM信号需要快速翻转

嗯,到这里,TIM2的PWM配置就完成了。你可以点一下Generate Code,看看CubeMX生成的初始化代码。下一章咱们会深入代码层面,看看HAL库是怎么初始化这些寄存器的。

4.4 本章知识结构图

下面这张图帮你梳理了TIM2 PWM配置的完整流程,从时钟到引脚,每一步都串起来了。

TIM2 PWM配置流程 TIM2 PWM配置流程 APB1时钟 = 72MHz PSC = 71 → CK_CNT = 1MHz ARR = 999 → 频率 = 1kHz Pulse = 250/500/750/999 PA0~PA3 → TIM2_CH1~CH4 核对引脚冲突,确保复用功能正确,上电默认输出低电平

这张图从左到右展示了配置的五个关键步骤。每一步的参数都会影响最终波形。我建议你对照自己的CubeMX配置,一步步检查,确保没有遗漏。