STM32定时器PWM输出怎么配置与死区设置

浏览量:6
时间: 2026-08-19 09:50:39

FPGA FIR滤波器抽头系数波形

本文概述

STM32的PWM输出是嵌入式面试中非常高频的考点,核心考察对定时器输出比较功能的理解。通用定时器可输出4路独立PWM,高级定时器额外支持互补输出和死区插入,常用于电机驱动和开关电源。配置步骤分为时钟开启、GPIO复用、时基配置、输出比较模式设置和使能输出五个环节。死区时间通过高级定时器BDTR寄存器的DTG字段配置,需根据定时器时钟频率和所需死区时间计算对应寄存器值。

核心要点速览

  • PWM频率计算公式:Fpwm = Fclk / (PSC + 1) / (ARR + 1)

  • 占空比 = CCR值 / (ARR + 1) × 100%

  • 通用定时器4路独立PWM,高级定时器多了互补输出和死区

  • 死区时间只能在高级定时器设置,通过DTG[7:0]位配置

  • 死区计算公式随分频档位变化,分三档步进

面试题:STM32怎么输出PWM波形?死区时间怎么设置?你实际用过吗?

一、面试官考察点

基础理解

PWM原理掌握
是否理解定时器输出比较产生PWM的原理,知道ARR和CCR分别控制什么
参数计算能力
能否根据目标频率和占空比计算PSC、ARR、CCR的数值

工程经验

死区理解
是否理解死区的作用和在实际项目中的应用场景
实际操作经验
有没有真正做过项目,代码细节能不能讲清楚

二、回答思路

第一部分:PWM输出配置方法

PWM基本原理

STM32的PWM输出是通过定时器的输出比较功能实现的。定时器的计数器CNT按照设定的频率递增或递减,当CNT的值等于比较寄存器CCR的值时,输出电平翻转。计数器从0数到自动重装载值ARR,完成一个周期,所以ARR决定周期,CCR决定占空比。

PWM频率 = 定时器时钟 / (PSC+1) / (ARR+1)
占空比 = CCR / (ARR+1) × 100%

PWM有两种模式:模式1是向上计数时,CNT小于CCR输出高电平,大于等于CCR输出低电平;模式2正好相反。实际使用中模式1更常用。

配置步骤(以STM32F1 TIM2_CH1为例)

// 1. 开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置GPIO为复用推挽输出 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); // 3. 配置时基 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72M/(71+1)=1MHz TIM_TimeBaseStructure.TIM_Period = 999; // 1M/(999+1)=1KHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 4. 配置输出比较PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 占空比50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 5. 使能定时器 TIM_Cmd(TIM2, ENABLE);

第二部分:死区时间设置

死区是什么?为什么要加死区?

死区时间是在互补PWM输出中,上下两个管子都关断的那段时间。比如在H桥驱动中,上桥臂和下桥臂不能同时导通,否则电源直通短路。但由于开关器件有开通和关断延迟,如果一个管子刚关另一个就开,可能出现短暂的同时导通,也就是直通。死区就是在两个管子切换时,都给关断信号,等上一个彻底关了再开下一个。

死区时间不能太小也不能太大。太小起不到防止直通的作用;太大会降低效率,还可能增加输出纹波。一般是根据开关管的开关速度来定,几纳秒到几百纳秒都有,MOS管一般几十纳秒,IGBT可能要几百纳秒到微秒级。

STM32死区怎么配置

STM32的死区功能只有高级定时器才有,比如F1系列的TIM1和TIM8。通用定时器没有死区功能。死区时间通过BDTR寄存器的DTG[7:0]这8位来设置。

DTG的配置分三个范围:

范围1:DTG[7]=0
不分频,步进 = t_DTS,死区 = DTG[6:0] × t_DTS,最大127个步长
范围2:DTG[7:6]=10
2分频,步进 = 2×t_DTS,死区 = (64+DTG[5:0]) × 2×t_DTS
范围3:DTG[7:5]=110
8分频,步进 = 8×t_DTS,死区 = (32+DTG[4:0]) × 8×t_DTS

t_DTS是定时器的数字采样时钟周期,一般等于定时器时钟周期。

死区计算举例

假设高级定时器时钟是72MHz,也就是t_DTS约等于13.89纳秒。如果需要大约500纳秒的死区:

500ns / 13.89ns ≈ 36步 → 第一档足够,DTG = 36(0x24)

如果需要1微秒的死区:

1000ns / 13.89ns ≈ 72步 → 超过第一档64步,用第二档
(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波形的吗?


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
硬件工程师面试题汇总(附答案)

1. 什么是噪声?如何避免噪声对电路的影响?答:噪声是电路中随机出现的电信号,它可以干扰电路的正常运行。为了避免噪声对电路的影响,可以采取以下措施:使用抗噪声器... 详情>>

2023-11-27 10:49:17
硬件防反接电路有哪些方案?硬件工程师面试选型对比与应用场景

分类:硬件设计经验级别:中级难度:★★★☆☆题型:方案对比+选型本文概述:硬件防反接的常见方案有四种:串联二极管、PMOS防反接、NMOS防反接、桥式整流。串联... 详情>>

2026-08-14 10:30:47
FPGA多周期路径约束怎么设置

分类:FPGA设计经验级别:2-4年难度:中高级题型:约束+原理FPGA工程师分析时序报告,设置多周期路径约束优化设计本文概述FPGA多周期路径约束是时序约束中... 详情>>

2026-08-11 17:49:06
嵌入式系统复位电路在PCB上怎么布局?嵌入式面试可靠性必考题

分类:嵌入式工程师面试题经验级别:中级难度:中级题型:PCB布局/可靠性设计📖 本文概述复位电路是嵌入式系统可靠性的第一道防线,布局不当会导致系统意外复位或上... 详情>>

2026-08-08 16:42:52
面试前怎样调研目标公司的技术栈和团队情况?工程师面试准备5步法

分类:面试技巧经验级别:初级难度:基础题型:面试准备📖 本文概述面试前做好公司调研,能让你在面试中更有针对性地展示自己,也能帮你判断这家公司是否值得去。本文提... 详情>>

2026-08-05 09:57:00
开班信息