板子刚焊好的时候我干过一件蠢事程序下载完示波器一接六路输出看着都正常我就直接把功率电送上去了。结果母线电压一加采样电阻先冒了烟。后来排查了半天才发现其中一对互补信号在切换瞬间有大约 200ns 的时间是同时导通的——这就是没有做补充验证的代价。六路互补 PWM 这个东西看着每个引脚都有波形但波形“有”和波形“正确”是两回事。这篇文章就是我当时补做的那次系统验证实验的记录希望能让准备做电机驱动、三相逆变或者全桥拓扑的朋友少走一次弯路。1. 六路互补PWM到底在验证什么先把验收标准定下来1.1 三相全桥与互补信号的对应关系六路互补 PWM拆开看就是 3 组互补对每组由一个主输出通道和一个互补输出通道组成。典型用途是三相全桥也就是三个半桥每一相的上管和下管由一对互补信号驱动。比如我实验里标的 U 相上桥、U 相下桥、V 相上桥、V 相下桥、W 相上桥、W 相下桥频率按电机驱动常用的 20kHz 来设。这里要特别强调“互补”不能简单理解成“反相”。互补输出在理想情况下当然是反相的但同一个半桥的上下两个功率管绝不允许出现瞬间同时导通。也就是说从主通道关断到互补通道开通之间硬件必须插入一段两边都关断的空白时间这个时间就是死区。真正要验证的首先是这段空白稳稳存在其次才是频率、占空比、相位这些常规参数。1.2 死区时间为什么不是“随便给一个就行”死区存在的根本原因是功率管关断是需要时间的。栅极电荷泄放、米勒平台、器件本身的关断延迟加起来通常有几百纳秒。如果主通道下降沿一到互补通道立刻上升此时上管可能还挂在导通状态电源就直接通过上下管短路了。也就是所谓的直通一次就可能烧掉功率管或者采样电阻。死区的取值有个矛盾太小关断没完成就切换烧管太大波形失真、谐波增大、控制效率下降。所以验证实验里死区时间必须量出来和配置值对比确认误差在一个时钟节拍以内。这比单纯看“有没有波形”重要得多。1.3 实验验收清单动手之前我把要验证的项目列成了一张表后面所有操作都围绕它展开检查项判定标准频率一致性六路信号频率一致等于设定值 20kHz占空比主通道与互补通道占空比互补和接近 100%死区时间下降沿到互补上升沿之间有时间间隔数值接近配置值相位关系三相之间互差目标角度我按 120° 验证输出极性高低有效与后级门驱动器输入要求一致安全状态刹车/使能触发后六路立即进入配置好的安全逻辑有了这张表测的时候才不会漏项出了问题也知道该往哪个方向查。2. 实验平台与示波器接线测不准的工具比没有更糟2.1 主控选型和负载侧的处理我用的是一块带高级定时器的普通 32 位 MCU 评估板主频 84MHz定时器时钟也走 84MHz。选它的理由很简单高级定时器原生支持 3 组互补通道配合硬件死区发生器和刹车输入才能把六路互补 PWM 这件事完整验证清楚。如果靠 GPIO 中断翻转去模拟六路死区时间会被中断抖动和 CPU 占用率搞得不稳定那验证出来的结果没有任何参考价值。关键点这个阶段不要接功率电路。我只把 PWM 引脚直接引到示波器测量目标是 MCU 引脚上的逻辑电平波形。如果 MCU 引脚驱动能力不足以直接驱动后级中间加一级缓冲逻辑门也行但必须记住——你验证的是逻辑侧不是最终功率管栅极侧的波形。栅极侧的东西我在第 5 节单独说。2.2 示波器通道设置的几个硬要求验证六路信号示波器至少要有两个通道最好四个。我的接法是第一批把 CH1、CH2、CH3 分别接 U、V、W 相主输出第二批测互补通道中间穿插单对信号的细节测量。几个经验全部用 DC 耦合。AC 耦合会滤掉直流分量低占空比下波形判断会出错。探头必须先补偿。探头内部的微调电容没校准方波边沿会畸变死区测量结果可能差出几百纳秒。接地线越短越好。用长鳄鱼夹地线在数字电路附近容易拾取噪声边沿抖起来触发点也跟着飘。触发源选主通道的下降沿。测死区就是看“主通道下降沿”到“互补通道上升沿”的间隔触发基准必须固定。2.3 自动测量和手动测量要搭配用频率、周期、占空比可以交给示波器自动测量但死区时间我建议用手动光标。原因很实际死区边缘经常带着振铃自动测量的“下降沿到上升沿”判据可能选中振铃里的某个毛刺沿测出来的值忽大忽小。手动光标把两条竖线放在肉眼判断的真正的边沿上反而更可靠。顺便提一句如果手头只有逻辑分析仪也能做这个实验但采样率要足够高。想分辨 1µs 级别的死区采样率至少要到 100MS/s 以上低于这个数会把死区直接采样没了。3. 核心配置逻辑互补输出、死区时间与安全状态的关系3.1 互补输出本质上是定时器硬件的动作大多数 MCU 的实现方式是高级定时器在内部复制主通道的 PWM 信号反向后再插入死区最后从主通道和互补通道引脚输出。它不是靠软件翻转 IO。这个设计的意义在于死区的精度由硬件时钟保证不占用 CPU也不受中断响应延迟影响。所以验证实验里如果发现死区不稳先怀疑配置不要怀疑硬件。配置的顺序大致是这样先设定定时器时钟和自动重装载值确定频率再通过比较寄存器设定占空比接着配置互补通道的极性和死区时间最后打开主输出使能。我把它整理成了一段伪代码具体寄存器名以你所用芯片的手册为准// 伪代码配置三组互补PWM输出死区约1us // 1. 定时器时钟 84MHz // 2. 边沿对齐下ARR 84MHz / 20kHz - 1 4199 // 3. 占空比比较值 50% 处 (ARR 1) / 2 // 4. 选择死区时钟节拍 CK_INT约11.9ns/拍 // 死区写入值 1us / 11.9ns ≈ 84 拍 // 5. 使能主通道、互补通道输出 // 6. 设置输出极性使能主输出开关3.2 死区时间的计算一个具体例子死区时间的寄存器字段在多数芯片里不是线性值而是分段编码。不同段对应不同的步距倍率这点最容易出错。以我这次的配置为例定时器时钟 84MHz死区节拍默认等于 CK_INT一个节拍约 11.9ns。目标死区 1µs需要 84 拍。这个数值要落在 DTG 字段倍率为 1 的线性段里配置完成后实际死区约 1.01µs偏差来自示波器采样间隔和触发抖动属于正常范围。动手前务必查你所用芯片的数据手册把 DTG 分段表找出来。看到目标值后先判断它落在哪一段再用该段的步距计算写入值。直接按线性关系瞎填一个数是死区配置翻车最常见的原因。3.3 输出使能、极性和刹车输入的坑位三个看起来不起眼、实际能坑死人的位主输出使能位。很多芯片里这是定时器的一个总开关。计数在跑寄存器也配好了但总开关没打开引脚上就是无效电平。我见过不少人在这卡了半天。输出极性位。主通道和互补通道的极性是分开配的可以各自翻转。接门驱动器的时候必须搞清楚驱动器输入是高有效还是低有效极性配反了等效于把上下桥驱动信号交换后果很严重。刹车输入。这是硬件急停通道触发后六路输出会被强制打到配置好的安全状态。验证阶段如果刹车引脚悬空或者接法不受控环境噪声就可能偶发触发让人误以为 PMW 配置有问题。3.4 边沿对齐还是中心对齐六路互补 PWM 的对齐模式取决于最终应用。电机 FOC 常用中心对齐计数器先增后减PWM 波形关于周期中点对称谐波特性好但死区会出现在每个周期的两个边沿上测量时要多看一眼。我做实验时先按边沿对齐跑预期简单通过后再切到中心对齐复核一遍。边沿对齐下 ARR 设 4199 得到 20kHz中心对齐下计数器要走一个来回ARR 大致折半。4. 实测过程从单对通道到六路全验证的完整记录4.1 第一步单对通道的互补与死区测量先只开第一对通道占空比 50%。CH1 接主输出CH2 接互补输出。示波器上看到的波形是这样的周期 50µs频率 20kHz每路正脉宽约 25µs。把边沿放大主通道下降沿之后互补通道并没有立刻上升中间有一段约 1µs 的空白两路都是低电平。用手动光标量这个间隔得到 1.01µs和配置基本一致。这一步同时确认了输出极性和逻辑电平均值。我在记录本上写下的结论是硬件死区插入工作正常单对通道满足验收标准。4.2 第二步三对通道的同步性和相位关系全部六路开启后先只看三路主输出。CH1、CH2、CH3 接 U、V、W 相三者频率都锁定在 20kHz相位关系符合三相 120° 布局。我用示波器“下降沿延迟”功能以 U 相下降沿为参考测 V、W 相下降沿相对它的延迟理论上应该是 16.67µs 的整数倍。实测 V 相约 16.7µsW 相约 33.4µs成立。然后再把 CH2 接到某一相的互补输出上逐个确认三对通道的互补关系。这一步验证的是六路不仅各自成对互补而且三对之间共享同一个时间基准不存在一路快一路慢的问题。4.3 第三步占空比扫描与死区行为把占空比从 5% 扫到 95%在每个点确认三件事死区时间是否稳定、互补关系是否始终成立、占空比是否随设定线性变化。整体结果是稳定的但扫到两个极端时要警惕视觉陷阱。占空比接近 0% 时主通道几乎恒低互补通道几乎恒高死区发生在主通道上升沿和互补通道下降沿之间看到的是一段极窄的脉冲。占空比接近 100% 时则反过来。还有一个必须接受的物理事实死区让上下管实际导通时间天然不对称主通道占空比和互补通道占空比加起来略小于 100%差的就是死区占比。后续做控制算法时这个偏差需要做死区补偿实验阶段先把现象认清。4.4 第四步刹车输入与安全状态验证给刹车输入一个高电平脉冲六路输出应在几个时钟周期内全部进入配置好的安全状态我的配置是全部输出无效电平。撤销刹车后按手册要求重新使能主输出恢复 PWM。这一步验证的是系统的故障响应不是可选项。真实电机运行中遇到堵转、过流、过温全靠这条链路把功率管在毫秒级拉回安全状态软件轮询根本来不及。5. 验证过程中踩过的坑每一条都是真金白银换来的5.1 假死区两个探头的共地问题第一次测死区我用了两把探头各自夹在不同的地线上。结果死区读数忽大忽小最小 0.8µs最大 1.7µs完全没法判断。后来意识到问题出在共地两个探头的地线回路不同引入的共模噪声不一样边沿振铃让触发点乱飘。解决方法是把两把探头的地线夹都夹在同一颗电容的负极焊盘上尽量缩小地环路面积有条件的话用探头自带的接地弹簧针直接搭在芯片地引脚附近。这么改完死区读数稳定在 1.00~1.02µs。一句话测高频边沿探头的地线质量直接决定测量可信度。5.2 DTG 分段编码的倍率陷阱最初我按线性思维算出来 84 拍直接写进 DTG 寄存器结果实测死区是预期值的两倍。翻数据手册才发现DTG 字段在大数值区间会切换到更高的倍率段同一段内步距变大。我写的那个 84落在了一个每拍 23.8ns 的段里实际死区自然翻倍。这个问题在验证时特别隐蔽因为波形形态完全正常只是死区数值不对。解决办法只有一条动手前读懂分段表让写入值落在目标段内。我最终改回到倍率为 1 的线性段写入 84 拍实测 1.01µs 过关。5.3 调试器断点导致波形僵死验证过程中我用调试器打过一次断点想看看寄存器状态。结果定时器停在某一状态输出停留在半高导通的电平上。这在真实系统里是致命场景如果功率级接在下面断点一停可能恰好把上下桥给定死在导通状态烧管只是时间问题。应对措施有两条一是实验阶段尽量别在功率电路带电时打断点二是启用芯片自带的调试停止安全选项让定时器在调试器暂停时自动把输出切到无效电平。做完这次验证后我写了个规矩所有涉及功率级的调试验证一律先确认这个安全选项已经打开。5.4 刹车输入被噪声干扰的“幽灵关断”有一段时间程序运行得好好的偶尔出现输出全部关断的现象。我先怀疑是代码逻辑问题后来用示波器长时采集才发现是刹车引脚因为悬空被板子上的开关噪声偶发拉高触发了。处理办法是把刹车输入配置成内部上拉并打开输入滤波如果验证时压根不测刹车功能也可以先禁用刹车源确认基础 PWM 无误后再逐步引入。5.5 门驱动器传播延迟会让 MCU 侧死区失效这是最容易被忽略的一层。MCU 引脚上量出死区 1µs看起来完全符合验收标准但接上门驱动器之后上下管的实际栅极波形之间的死区可能变了。因为门驱动器的高低边传播延迟往往不一致常见情况是低边快、高边慢两者之差直接叠加到死区上。所以完整的验证应该做两级第一级在 MCU 引脚量逻辑波形确认模块配置正确第二级在门驱动器输出端量栅极波形确认实际加到功率管上的死区仍然大于器件最坏关断时间。如果二级测量不达标需要回头加大 DTG 配置值或者调整门极电阻来平衡开关速度。我后来所有板子都保留了这个两级验证流程直通问题再没出现过。6. 实验结论与下一步验证通过并不代表可以上电六路全部验证完把结果整理成表结论如下检查项实测结果判定频率 20kHz周期 50.01µs通过占空比 50%主/互补输出稳定通过死区 1µs实测 1.01µs通过三相互差 120°V 相 16.7µsW 相 33.4µs通过刹车安全状态全部拉低可恢复通过实验本身到这里就结束了但这个结论只代表 MCU 侧和逻辑侧没问题。真到了给功率级上电那一步前面还有母线电容预充电、驱动电源斜升、过流保护联调、阻性负载测试等一系列流程。我的建议是这六路 PWM 的验证程序不要删固化成本项目的自检程序。以后每次改板、每次更新代码先跑一遍这个验证确认波形、死区、刹车逻辑都正常再碰功率电路。就我个人的体会来说做电机驱动最值钱的经验未必是算法反而是这些“确认安全”的笨功夫。那次烧掉采样电阻之后我把所有验证流程都做成了清单逼自己每一步都留存波形截图。后面几次调试虽然也出过问题但没有一次是因为互补 PWM 的直通引起的。这大概就是做实验和碰运气之间最大的区别。