ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

六路互补PWM验证实验:死区配置与故障封锁实战指南

六路互补PWM验证实验:死区配置与故障封锁实战指南

把示波器六根探头全搭上,屏幕里同时铺开六路方块波的那一瞬间,才算真正把“六路互补 PWM”这件事做踏实了。这个实验看上去只是验证波形,实际上是在给电机驱动、逆变器这类大功率控制链路做“安全检查”。六路互补 PWM 是三相无刷电机、全桥/半桥逆变电路里最常见的控制信号形态,三对互补输出分别驱动三个半桥的上、下管,任何一路波形不对、死区不够、相位错位,轻则电机抖震,重则直接炸管。所以这个实验的核心价值就是:在接上功率级之前,先把信号层的正确性全部确认清楚。

这篇内容适合刚接触电机驱动开发的单片机工程师、做电源逆变的学生,以及任何需要自己配置高级定时器互补输出的开发者。我会把实验怎么拆、参数怎么算、波形怎么测、坑在哪里全部过一遍,以 HC32F460 和 STM32 高级定时器为主线,其他芯片可以按同样的逻辑映射。

1. 实验目标与整体设计思路

1.1 六路互补PWM到底是什么

先把这个概念掰开。所谓六路互补 PWM,本质上是三组“一对二”的信号:第一路和第二路互补,第三路和第四路互补,第五路和第六路互补。每一对信号控制一个半桥,也就是两个开关管串联后跨接在电源正负极之间,上管和下管绝对不允许同时导通,否则电源直接短路,电流瞬间烧毁功率管。

互补的意思是逻辑上相反:上管给高电平导通时,下管必须给低电平关断;反之亦然。但问题来了,开关管不是理想器件,打开和关闭都需要时间,如果上管刚关到一半、下管就开始开,中间仍然会有一段重叠导通时间。解决这个问题的标准做法是插入死区时间:在一对信号切换的瞬间,先让两个管子都保持关断一小段时间,等一个管子彻底关闭了再打开另一个,这个“两边都不导通”的空档就是死区。

用生活里的例子来类比,这就像是接力赛交接棒:A 选手不能等 B 选手完全停下才接棒,但也不能两人同时握着棒跑,必须有个错峰的交接窗口。PWM 死区就是那个让两边都松手、再由另一边接棒的窗口。

1.2 验证实验怎么拆解:三个必须验收的点

很多人拿到使能了互补输出的代码,一看示波器上六条线都在跳,就觉得验证完了,其实这是最大的误区。六路互补 PWM 的验证必须拆成三个层面,每一个都是独立的验收项:

第一层是静态互补正确性。每一对信号任意时刻只能有一路处于有效导通电平,两路之间的死区时间要稳定可测。这一层是安全底线,验证不到位,后面全是隐患。

第二层是动态调节能力。占空比能不能在线修改、频率能不能改、修改之后波形是否平滑过渡而不出现异常毛刺,三相之间的相位关系是否还保持正确。这层决定 PWM 不只是一个能亮的波形,而是真正可用的控制信号。

第三层是故障保护链路。当外部故障信号触发时,六路输出能否在硬件层面快速封锁到安全电平,封锁后能否在解除故障后恢复正常。这层最容易被忽略,但恰恰是电机驱动系统由“能跑”走向“可靠”的关键分水岭。

整个实验按这三层展开,先验证静态,再验证动态,最后验证保护。每一层都需要对应的测量手段和判定标准,不能靠肉眼扫一眼大概就完事。

1.3 为什么必须用高级定时器,普通PWM行不行

这是新人最容易问的问题。普通定时器也能输出 PWM,但通常只有单路输出能力,而且没有硬件级的互补和死区生成电路。要实现六路互补,如果用普通定时器硬凑,用户程序需要在更新中断里翻转电平、软件延时插死区,这种做法存在两个致命问题:一是软件延时受中断优先级影响,死区时间忽长忽短;二是极端工况下中断响应不及时,两路信号可能同时输出有效电平,功率管直接直通烧毁。

高级定时器或者专用 PWM 单元则完全不同。以 HC32F460 的定时器 PWM 功能、STM32 的 TIM1/TIM8 为例,互补输出和死区插入全部由硬件完成,一旦配置好寄存器,即使程序卡死在某个中断里,波形依然按照硬件的逻辑运转,不会产生破坏性输出。这就相当于给安全逻辑配了一个独立的硬件看门狗,不依赖软件可靠性。

所以六路互补 PWM 实验必须建立在支持“互补输出 + 死区生成 + 刹车/故障封锁”的硬件外设上。选对硬件,实验从一开始就站在了正确的道路上。

2. 实验环境与工具准备

2.1 硬件清单:主控、示波器、负载

实验的第一步是把东西备齐,清单如下:

  • 主控板:HC32F460 开发板或 STM32F103/G491 等带高级定时器的板子均可,本次实验以 HC32F460 为主叙述
  • 逻辑分析仪:至少 8 通道,采样率 100MHz 以上,用于抓取六路波形和死区测量
  • 示波器:建议 100MHz 以上带宽,用于观察波形细节和信号质量
  • 简易负载:LED 加限流电阻,或者一组 RC 低通滤波器,用于观察占空比变化
  • 按键模块:用于模拟外部故障触发信号
  • 杜邦线若干、面包板一块

这里有一个实际经验:逻辑分析仪和示波器不是替代关系,而是配合关系。逻辑分析仪长于逻辑时序分析,采六路信号一次抓齐,特别适合验证互补关系和死区宽度;示波器长于波形质量分析,能看到上升沿斜率、过冲、信号完整性问题。验证六路互补 PWM 时,先用逻辑分析仪确认逻辑关系正确,再用示波器抽查个别通道的信号质量,这是最高效的组合。

2.2 接线与初始状态确认

接线看起来简单,但有几个细节需要注意。HC32F460 的互补 PWM 输出通常分布在固定的引脚上,例如某个定时器通道 A/C/E 输出高边信号,对应通道 B/D/F 输出低边信号,具体引脚要对照芯片数据手册的复用功能表,不能想当然接。

接完线之后,在上电前做一个非常关键的确认动作:把控制板从功率板上彻底断开。验证阶段只观测 MCU 引脚输出的信号,绝不连接任何功率级电路。这一步能保证即使配置出错、出现了最恶劣的瞬时直通波形,也不会烧掉任何功率器件。实验做完、波形全部验证正确之后,才允许接功率级跑真实负载。

3. 关键参数设计与配置详解

3.1 PWM频率怎么选:频率、纹波与噪声的平衡

PWM 频率是整个配置的第一个参数,它直接决定电流纹波大小、开关损耗和系统噪声。以电机驱动为例,频率太低,电流纹波大,电机会产生可听见的啸叫;频率太高,功率管开关损耗增大,发热剧增,对栅极驱动电路的要求也更高。

工程上,电机控制常用 16kHz 或 20kHz,前者刚好超过人耳听觉上限,后者是当前变频家电的主流光源之一。为什么不是越高越好?我举一个实际的例子:假设母线电压 24V,电机相电感 100uH,占空比 0.5,PWM 频率从 20kHz 提高到 40kHz,电流纹波峰值会从大约 3A 降到 1.5A,但 MOS 管的开关损耗却几乎翻倍。对散热条件有限的小板子,这个代价并不划算。

如果你做的是音频应用,频率选择还要考虑与采样率的关系;如果做逆变器,频率通常结合滤波电感和并网要求综合设计。总的来说,频率选择的核心公式是电感电流纹波公式:

ΔI = Vdc × D × (1-D) / (fsw × L)

这个公式里,Vdc 是母线电压,D 是占空比,fsw 是开关频率,L 是负载等效电感。它可以帮你估算某个频率下电流纹波是否在可接受范围内。实验阶段我用的是 20kHz,兼顾了听感、纹波和开关损耗三方面的平衡。

3.2 死区时间计算:公式、实测与取舍

死区时间是六路互补 PWM 里最重要的参数,它的设计原则可以概括为一句话:在保证不直通的前提下,越小越好。

死区太小,上下管会直通,这是烧功率管的第一大原因;死区太大,波形畸变增加,电机电流谐波加大,控制性能变差。确定死区时间要综合考虑三个时间参量:功率管的关断延时(t_off)、开通延时(t_on)以及栅极驱动器的传播延迟。

具体的估算公式是:

t_dead = t_off_max + t_driver_prop_max - t_on_min + t_margin

这个公式很好理解:最慢的关断时刻到最早的导通时刻之间,必须留出安全裕量。按典型功率管数据,假设开关管关断延时 100ns,栅极驱动传播延时 150ns,开通延时 50ns,安全裕量 200ns,那么:

t_dead = 100 + 150 - 50 + 200 = 400ns

实际工程中,400ns 的量级偏紧,通常我会取 500ns 到 1us 之间。如果负载功率较大、开关管结电容大,死区还要适当加大。这里给出的建议是:先按估算设置一个偏大的值(比如 1us),确保系统安全运行后,再逐步减小,同时用示波器观察上下管驱动波形,确认没有出现直通风险后,再用更精确的时序控制算法补偿死区带来的电压畸变。

3.3 互补输出极性、模式1模式2的坑

PWM 模式1和模式2的区别是配置时最容易踩坑的地方。这个区别本质上是输出有效电平与计数器比较值之间的逻辑关系差异。

以 STM32 高级定时器为例,在边沿对齐向上计数模式下,PWM 模式1是:计数器值小于比较值时输出有效电平,大于等于比较值时输出无效电平;PWM 模式2则正好反过来。而在中心对齐模式下,两者还有一个与计数方向相关的细节。看起来只是一个逻辑反转,但一旦配错,后果极为隐蔽:波形从逻辑分析仪上看依然是六路方波,占空比也是对的,可是每一路的有效电平与预期完全相反。

更阴险的是,互补输出方向错了之后,如果你用示波器单看某一路,波形依然“正常”,只有把上下管两路信号叠加起来对比时,才会发现要么高边有效时间变长了、要么死区被挤到了错误的边沿。我最开始做电机驱动时就在这个问题上吃过亏:软件调试一切正常,一接电机就砰地一声,后来定位发现是 PWM 模式选错,导致半桥上管和下管的有效逻辑被颠倒了。

所以配置时务必先确认输出极性和 PWM 模式,然后回到“静态互补正确性”的验证步骤,把每一对信号都量一遍再考虑下一步。

3.4 故障保护配置与输出封锁逻辑

故障保护这一块,很多人觉得是“附加功能”,实际上它应该是整个配置的一部分。六路互补 PWM 实验如果不验证故障保护,等于只验证了“正常情况”,而没有验证“异常情况”,作为安全关键链路的把关是缺位的。

HC32F460 和 STM32 的高级定时器都有刹车/故障输入功能。配置方式通常是把某个引脚复用为刹车输入,并选择触发极性,当故障信号到来时,定时器的输出全部被硬件强制拉到安全电平,同时置位一个标志位。即使此时 CPU 忙于其他中断任务,输出封锁也照常执行。

实验时我用一个按键模拟故障信号:按下按键,六路 PWM 输出立即全部锁定为低电平;松开按键,需要软件主动清除故障标志并重新使能输出之后,PWM 波形才恢复。这个“必须软件确认才能恢复”的行为非常重要,它防止了故障源还未消除时系统自动重启导致的反复打火。

3.5 HC32F460 初始化代码示例

下面给出一份基于 HC32F460 SDK 风格的初始化配置框架。实际工程中寄存器名和结构体会随库版本略有差异,但配置逻辑是通用的。STM32 用户可以把它映射到 TIM1/TIM8 的对应代码:

/* 定时器时钟与引脚配置省略,此处仅展示PWM核心配置逻辑 */ static void Timer_PWM_Init(void) { stc_pwm_init_t stcPwmInit; stc_pwm_chn_init_t stcPwmChnInit; stc_irq_regi_conf_t stcIrqRegiConf; /* 1. 基本PWM初始化 */ MEM_ZERO_STRUCT(stcPwmInit); stcPwmInit.enClkSource = PWM_CLK_SRC_PCLK; /* 时钟源选择 */ stcPwmInit.enClkDiv = PWM_CLK_DIV_4; /* 分频系数 */ stcPwmInit.u16Period = 3749; /* 20kHz@150MHz, 周期值 */ PWM_Init(&stcPwmInit); /* 2. 死区配置:这里填入按上节计算得到的死区计数 */ PWM_SetDeadTime(DEAD_TIME_NS / (1000000000.0 / PWM_CLK_MHZ)); /* 3. 通道配置:以CH1高边+低边互补为例 */ MEM_ZERO_STRUCT(stcPwmChnInit); stcPwmChnInit.enOutput = PWM_CHN_OUTPUT_HR; /* 高边输出 */ stcPwmChnInit.enPolarity = PWM_CHN_POLARITY_HIGH; /* 输出极性 */ stcPwmChnInit.enMode = PWM_CHN_MODE_COMPLEMENT; stcPwmChnInit.u16Compare = 1875; /* 50%占空比 */ PWM_ChnInit(PWM_CH1, &stcPwmChnInit); stcPwmChnInit.enOutput = PWM_CHN_OUTPUT_LR; /* 低边输出 */ PWM_ChnInit(PWM_CH1_L, &stcPwmChnInit); /* 4. 故障保护配置简示 */ PWM_SetBrakePolarity(EVENT_BRAKE_HIGH); /* 刹车输入高有效 */ PWM_BrakeEnable(TRUE); /* 5. 使能输出 */ PWM_OutputEnable(PWM_CH1, TRUE); PWM_OutputEnable(PWM_CH1_L, TRUE); }

这份代码的框架核心在于三步:设置 PWM 周期和分频决定频率,设置死区寄存器,设置通道互补模式。故障保护部分的命名可能随芯片而异,但概念一致,需要触发源配置为对应的事件信号。

4. 验证步骤与实测记录

4.1 第一步:验证互补对波形是否严格对位

把逻辑分析仪的六个通道全部接好,分别命名为 PWM1H、PWM1L、PWM2H、PWM2L、PWM3H、PWM3L,对应三相半桥的六路输出。配置好通道极性后,给 MCU 上电启动 PWM,先抓一轮静态波形。

第一件事,把所有通道都展开,观察是否每对信号中的两路高电平区间完全不重叠。我用一个非常实用的小技巧:在逻辑分析仪软件里把 PWM1H 和 PWM1L 叠加显示,放大到边沿处,如果能看到两路信号之间存在一段同时为低的间隙,互补关系就是正确的;如果看到瞬间同时为高,那就有直通风险,立刻断电排查。

从实测数据来看,20kHz 频率下,整个 PWM 周期是 50us,一对互补信号的高电平时间按 50% 占空比就是 25us,死区时间我配置为 2us,实际测出来高、低边信号之间保持约 1.9us 的同低间隙,符合预期。

这一步的判定标准很简单:三对信号,每一对都要通过“无重叠单边导通”的检查。3 对全部通过,才算静态验证过关。

4.2 第二步:验证占空比动态调节

静态波形正确只是第一步,接下来要在线改占空比,验证 PWM 是不是真的“可控制”。我在程序里做一个按键加减占空比的逻辑,每次按下按键,把三对信号的比较值同时增加或减少 50 个计数,大约对应 1.3% 的占空比变化。

占空比调节这一步有一个隐藏考点是“同步更新”。如果三对信号分别在不同时刻更新比较值,那么在一个 PWM 周期内,三相半桥的导通时间会不均衡,电机中性点电压发生波动,产生脉动转矩。高级定时器的解决方案是影子寄存器机制:程序写比较值时,写入的是影子寄存器,只有更新事件到来时才会一次性装载到实际工作寄存器。所以代码里要用更新事件触发或手动触发装载,确保三路同时生效。

实测中我将三路占空比从 10% 一直调到 90%,每步都在示波器上确认了三路波形同时加宽、同时收窄,没有任何一路出现滞后或跳变。这个动态验证至关重要,它直接决定后续能不能用这个 PWM 去做正经的电机控制。

4.3 第三步:验证故障保护能否封死六路

前两个验证过关后,接着做故障保护验证。这个步骤要在系统运行状态下行,确认逻辑分析仪正抓取波形,然后按下接入刹车引脚的按键。

正常来说,几百纳秒之内,六个通道的输出全部变为低电平,PWM 波形从屏幕里直接消失。我在 HC32F460 上实测,从按键按下到六路全部封锁,逻辑分析仪测量到的时间大约 400ns 左右,这包含了按键到引脚的电平跳变时间、器件同步电路和硬件保护逻辑的响应时间。对比软件中断封锁动辄几十微秒的延时,硬件保护的响应速度快了至少两个数量级。

解除故障后,还要验证一个关键行为:波形不会自动恢复。如果代码设计正确,定时器会保持封锁状态,直到软件检测到故障标志并主动清除。这一点我在实测中特意确认了,松开按键之后六路依然封锁,只有按另一个恢复键清除故障标志,PWM 才重新开始输出。这个行为在真实设备上极其重要,它保证了维修人员在排除故障之前,系统不会自己反复重启,造成二次伤害。

4.4 实测数据表与波形判读方法

把实验过程中的实测数据整理成一张表,方便读者对照自己的验证结果:

验证项配置/预期值实测结果判定
PWM 频率20kHz20.01kHz通过
占空比50%49.9%通过
死区时间2us1.9us通过
互补对导通重叠无重叠无重叠通过
动态调节范围10%~90%10%~90% 连续可调通过
故障封锁响应硬件级快速封锁约400ns 内全通道关闭通过
故障恢复需软件清除标志手动恢复正常通过

波形判读再说一个实用技巧:在示波器上用数学功能把同一对信号相加。理想互补 PWM 的上下管信号相加应该得到一个恒定值——因为任意时刻只有一路为高。如果叠加后的波形出现了凹陷或者毛刺,说明有一段时间两路都为低,这在死区阶段是正常的;如果出现了高电平叠加的鼓包,那就不正常了,说明两路同时导通了,这是严重的直通风险,需要立刻停机检查。

5. 常见问题与避坑实录

5.1 死区设太小,上下管直通

这是新手做得最多、也最危险的操作。为了追求更小的波形畸变,把死区时间一路往下调,调到功率管的关断延时以下,结果某次上电直接冒烟。

避坑的策略分两步:第一步,参考数据手册算一个偏保守的死区初值;第二步,在实验室环境下逐级递减,每次修改后用示波器盯着叠加波形确认没有重叠,再往下走。千万不要直接从很小值开始跑,一旦直通,管子就没了。

另外记住,死区时间不是线性越小越好,它在电机驱动中会引入输出误差,但这个问题可以通过死区补偿算法解决,而不是靠盲目减小死区时间来解决。工程上先保证安全,再考虑性能。

5.2 通道极性配置反了的危害

通道极性配反了,现象非常具有迷惑性。从单独一路看,波形正常方波;从一对互补信号看,也还是互补的;但实际接入功率级后,上管和下管的有效导通逻辑整个颠倒,原本应该在导通区间的上管变成关断,原本该关断的下管变成导通,电机根本没法正常转。

排查这种问题,最有效的手段是台账法:在代码里明确注释每一路输出对应的引脚、半桥位置和预期有效电平,然后用逻辑分析仪逐路核对,别只靠眼睛看。我每次调这种问题,都会在纸上画一个表格,列清楚通道名、期望极性和实际观测极性,一眼就能找出哪一路是反的。

5.3 一上电就触发保护,输出被锁死

这类问题的现象是:代码编译烧录都没问题,但 PWM 一使能输出,立即进入封锁状态,怎么调都不出来波形。

排查优先级最高的是刹车引脚的电平状态。故障保护配置成高有效时,如果空闲状态下引脚被上拉到了高电平,一上电就会被误触发保护。我在实验板上遇到过好几次,原因是刹车引脚没有配置内部下拉,浮空电平被干扰噪声拉到触发阈值以上。

解决方法是:在配置刹车引脚时明确设置为输入模式并打开内部下拉电阻,确保默认低电平;实在不行就加一个外部下拉电阻到地。同时配置一个状态指示灯,保护标志置位时点亮,这样排查时一眼就能定位是保护触发了还是波形源根本没输出。

5.4 用逻辑分析仪测死区,数值偏大或偏小

逻辑分析仪采样率不够时,死区测量的误差会大到让你怀疑人生。比如一个真实死区 500ns 的信号,用 50MHz 采样率的逻辑分析仪去量,上升沿到采样点之间的余量就有 20ns 级别的误差,看起来死区时大时小。

对于死区这种微秒级以下的时间参数,建议采样率至少 100MHz,有条件直接上示波器。同时在测死区时,要把触发点设置在信号边沿附近,用示波器的高分辨率模式测量间隙宽度。如果手头只有逻辑分析仪,还有一个折中技巧:把死区临时配置大一些(比如 5us),先确认死区插入逻辑方向是否正确,再改回小值并改用示波器做精确测量。

5.5 更新占空比瞬间波形跳变

如果使用 DMA 更新占空比或者直接在中断里写比较值,偶尔会在更新瞬间看到波形毛刺,原因是软件写入时机和定时器计数周期没有对齐,导致比较值在一个完整周期中间被装载了一次,输出出现异常的窄脉冲。

解决方法是利用定时器的更新事件或预装载机制。比较值寄存器在普通模式下是即时生效的,只有开启预装载功能后,写入值才会等周期边界更新事件来临时才生效。配置 PWM 时务必打开预装载功能,这样占空比更新真正做到了“同步、平滑”的过渡。

这套问题排查记录里,前两条是安全底线问题,后三条是功能和可靠性问题。每一条我都实际踩过或者帮别人排查过,写下来就是希望各位不要在同样的位置再摔一次。

6. 从验证到实战的扩展思考

六路互补 PWM 验证完成后,下一步通常是接入真正的功率级和电机。我在项目推进中的经验是,从开环验证到闭环控制之间还有两个重要的过渡验证:第一个是接入功率级后,用电流探头确认实际相电流纹波与理论估算一致;第二个是加入霍尔传感器或者编码器反馈后,验证 PWM 更新时机与换相逻辑的同步性,避免在错误时刻翻转输出方向导致转矩突变。

这些扩展方向的核心逻辑都一样:先验证信号正确性,再验证功率级行为,最后验证闭环逻辑,步步为营。六路互补 PWM 的实验虽然只是整个电机控制链路的一个节点,但它是所有后续控制算法和安全策略的基础。波形验证不过关,后面的调试只会浪费更多时间。

我个人在实际项目里的习惯是,把这份验证记录整理成标准的检查清单,每次改动 PWM 相关代码后都要完整跑一遍静态互补、动态调节、故障封锁这三个验收项,全部通过才允许合入。这个习惯帮我挡掉了很多只在特定工况下才会暴露的隐性故障。做电机驱动,慢一点、稳一点,永远比快一点、险一点更划算。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进