
本文概述
STM32的PWM输出是嵌入式面试中非常高频的考点,核心考察对定时器输出比较功能的理解。通用定时器可输出4路独立PWM,高级定时器额外支持互补输出和死区插入,常用于电机驱动和开关电源。配置步骤分为时钟开启、GPIO复用、时基配置、输出比较模式设置和使能输出五个环节。死区时间通过高级定时器BDTR寄存器的DTG字段配置,需根据定时器时钟频率和所需死区时间计算对应寄存器值。
核心要点速览
PWM频率计算公式:Fpwm = Fclk / (PSC + 1) / (ARR + 1)
占空比 = CCR值 / (ARR + 1) × 100%
通用定时器4路独立PWM,高级定时器多了互补输出和死区
死区时间只能在高级定时器设置,通过DTG[7:0]位配置
死区计算公式随分频档位变化,分三档步进
一、面试官考察点
基础理解
工程经验
二、回答思路
第一部分:PWM输出配置方法
PWM基本原理
STM32的PWM输出是通过定时器的输出比较功能实现的。定时器的计数器CNT按照设定的频率递增或递减,当CNT的值等于比较寄存器CCR的值时,输出电平翻转。计数器从0数到自动重装载值ARR,完成一个周期,所以ARR决定周期,CCR决定占空比。
PWM有两种模式:模式1是向上计数时,CNT小于CCR输出高电平,大于等于CCR输出低电平;模式2正好相反。实际使用中模式1更常用。
配置步骤(以STM32F1 TIM2_CH1为例)
第二部分:死区时间设置
死区是什么?为什么要加死区?
死区时间是在互补PWM输出中,上下两个管子都关断的那段时间。比如在H桥驱动中,上桥臂和下桥臂不能同时导通,否则电源直通短路。但由于开关器件有开通和关断延迟,如果一个管子刚关另一个就开,可能出现短暂的同时导通,也就是直通。死区就是在两个管子切换时,都给关断信号,等上一个彻底关了再开下一个。
死区时间不能太小也不能太大。太小起不到防止直通的作用;太大会降低效率,还可能增加输出纹波。一般是根据开关管的开关速度来定,几纳秒到几百纳秒都有,MOS管一般几十纳秒,IGBT可能要几百纳秒到微秒级。
STM32死区怎么配置
STM32的死区功能只有高级定时器才有,比如F1系列的TIM1和TIM8。通用定时器没有死区功能。死区时间通过BDTR寄存器的DTG[7:0]这8位来设置。
DTG的配置分三个范围:
t_DTS是定时器的数字采样时钟周期,一般等于定时器时钟周期。
死区计算举例
假设高级定时器时钟是72MHz,也就是t_DTS约等于13.89纳秒。如果需要大约500纳秒的死区:
如果需要1微秒的死区:
(72 - 64) = 8 → DTG[5:0] = 8 → DTG = 0x88(128+64+8?不对,第二档是10xxxxxx,即bit7=1,bit6=0)
实际计算的时候不需要手算,STM32CubeMX里直接填死区时间数值,它会自动算出寄存器配置。但面试的时候要能讲清原理。
三、追问环节
追问1:PWM的频率怎么选?为什么有的用20KHz有的用几KHz?
PWM频率的选择取决于应用场景。电机驱动一般用几KHz到20KHz,太低了噪音大,太高了开关损耗大;开关电源一般几十KHz到几百KHz,频率高了电感电容可以更小,但开关损耗增加;LED调光一般用几百Hz,人眼看不到闪烁就行;伺服舵机用的是50Hz的PWM,这是行业标准。
选频率的时候还要考虑定时器的分辨率。频率越高,ARR值越小,占空比的分辨率就越低。比如10KHz的PWM,72MHz定时器,ARR是7200-1,有7200级分辨率;如果是1MHz的PWM,ARR只有72-1,只有72级分辨率。所以频率和分辨率要权衡。
追问2:什么是中央对齐PWM?和边沿对齐有什么区别?
边沿对齐PWM就是计数器只向上计数或只向下计数,PWM的边沿在一个固定的位置。中央对齐PWM是计数器先向上数到ARR再向下数到0,上下两个方向都做比较,所以PWM的中间对齐,两边对称。
中央对齐的好处是在电机驱动等应用中,电流纹波更小,谐波更少,因为两个边沿的变化更平滑。缺点是同样的ARR下,PWM频率只有边沿对齐的一半,因为计数器要上去再下来。
实际项目中,对输出纹波要求高的场景用中央对齐,对频率要求高或者简单应用用边沿对齐。
追问3:怎么用PWM输出实现呼吸灯效果?
呼吸灯就是让LED的亮度渐亮渐暗,原理就是逐渐改变PWM的占空比。实现方法一般是在定时器中断里或者一个软件定时器里,周期性地修改CCR寄存器的值。从0开始慢慢加到ARR,再慢慢减回0,这样占空比就从0到100再到0,LED就从灭到亮再到灭,形成呼吸效果。
变化的步长和周期决定了呼吸的快慢。步长太小变化太慢,步长太大变化不光滑。一般用几毫秒变一次,每次变1到2个CCR数值,整个呼吸周期一两秒比较自然。
追问4:PWM输出不够用怎么办?
如果项目需要的PWM路数超过了一个定时器的4路,有几个办法。第一个办法是用定时器的DMA burst功能,一个定时器可以同时更新多个通道的CCR;第二个办法是用多个定时器,STM32一般有好几个定时器,每个都能出4路PWM;第三个办法是用定时器输出比较的级联,不过这个比较复杂。
还有一种方案是软件模拟PWM,用一个定时器加GPIO口,定时翻转电平,适合对精度要求不高、频率不高的场合,但会占用较多CPU资源。
四、失分表达
常见错误一
"占空比就是CCR除以ARR,直接除就行。"
不严谨,ARR是自动重装载值,计数器从0到ARR共ARR+1个计数,占空比应该是CCR/(ARR+1)。虽然ARR大的时候差别不大,但面试要严谨。
常见错误二
"随便哪个定时器都能设置死区。"
只有高级定时器(TIM1、TIM8等)才有死区功能,通用定时器和基本定时器没有。这是很基础但经常被忽略的点。
五、准备动作
知识准备
熟悉通用定时器和高级定时器的区别
能默写PWM配置的基本步骤
理解死区的作用和三档计算方式
了解中央对齐和边沿对齐的区别
项目准备
准备一个实际用过PWM的项目案例
能讲清PWM的参数怎么选的(频率、死区等)
说一个调试PWM时遇到的问题和解决方法
面试官你好,关于STM32 PWM配置和死区设置,以上是我的实际经验和理解
需要我讲讲具体项目中怎么调试PWM波形的吗?

扫码关注





























