ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

死区补偿原理与实现:从电机异响到波形优化

死区补偿原理与实现:从电机异响到波形优化

1. 死区补偿到底在补什么:从一次电机异响说起

前阵子帮一个做运动控制的朋友调一台小功率永磁同步电机的驱动板,样机跑低速的时候电机发出“嗡嗡”的闷响,用手摸外壳能明显感觉到抖动,示波器抓相电流波形,过零点附近有一段明显的“平台”——电流在该上升的时候赖着不动,该下降的时候又拖着不走。朋友一开始怀疑是电流采样有问题,换了霍尔、改了滤波参数,折腾两天没解决。我看了波形就跟他说:别查采样了,这是死区惹的祸,先把死区补偿加上再说。

这个场景在电力电子和电机控制圈子里太常见了。死区补偿这个词,做变频器、伺服驱动、逆变电源、UPS的人几乎天天挂在嘴边,但真要让人用一句话说清楚“什么是死区补偿”,很多人会卡壳——知道要加,知道不加会波形畸变,但背后的因果链条说不利索。这篇就从这个最朴素的问题出发,把死区、死区效应、补偿原理、实现方法和踩坑经验一次讲透。

先把结论摆前面:死区是为了防止逆变桥上下管直通短路而人为插入的一段“全关断”时间,而死区补偿就是为了消除这段全关断时间给输出电压、电流带来的畸变,通过软件或硬件手段把丢失的电压“补”回来。它解决的是“安全”与“精度”之间的矛盾——死区保安全,补偿保精度,两者缺一不可。

适合谁看?如果你是刚接触电机控制、逆变器开发的工程师,或者是在做课程设计、毕业设计的学生,又或者你只是好奇“为什么逆变器输出波形过零点会畸变”,这篇都能给你一条从现象到本质、从原理到代码的完整路径。我不打算堆公式吓人,而是按“现象—原因—方案—实操—排坑”的顺序,把这件事讲成一个人能听懂的故事。

2. 死区是怎么来的:一个“防短路”的无奈之举

2.1 逆变桥的基本结构决定了死区必须存在

要理解死区,得先看逆变桥长什么样。以最常见的三相全桥逆变电路为例,每一相由上下两个开关管(IGBT或MOSFET)串联组成,上管接正母线,下管接负母线,中间点引出作为该相输出。理想情况下,上管开通时下管必须关断,下管开通时上管必须关断,两者交替导通,输出就在正负母线之间切换。

但现实中的开关管不是理想器件。任何功率开关都有开通延迟和关断延迟,而且关断时间通常比开通时间长——IGBT的关断拖尾尤其明显。如果上管关断信号和下管开通信号同时发出,由于上管还没完全关断、下管已经开始导通,正负母线之间就会瞬间形成一条低阻抗通路,这就是直通短路(也叫桥臂直通)。直通的后果很严重:瞬间电流可达数百甚至上千安培,轻则烧保险、触发过流保护,重则直接炸管。

所以工程上的标准做法是:在上下管的驱动信号之间插入一段“两者都关断”的空白时间,等上管彻底关断之后再让下管开通,反之亦然。这段时间就是死区时间(dead time),典型值从几百纳秒到几微秒不等,具体取决于器件类型、母线电压和驱动电路设计。MOSFET因为开关速度快,死区可以做到几百纳秒;IGBT尤其是大功率模块,死区往往要一到两微秒甚至更长。

提示:死区时间不是拍脑袋定的,它必须大于“最慢关断的那个管子”的关断时间,再留一定裕量。定小了有直通风险,定大了畸变严重,这个取舍后面会细说。

2.2 死区带来的副作用:输出电压“缺了一块”

死区保证了安全,但代价是输出精度受损。关键在于:死区期间上下管都关断,输出端处于“悬空”状态,此时输出电位由负载电流的方向决定,而不是由开关信号决定。

具体来说,假设某相电流从桥臂流向负载(定义为正方向)。在上管本该导通、下管关断的区间,如果插入死区,死区期间两个管子都关,电流无处可去,只能通过下管的反并联续流二极管续流,于是输出点被钳位到负母线附近。也就是说,本该输出正母线电压的时段,实际输出的是负母线电压——电压“丢”了一块。反过来,当电流为负时,死区期间电流通过上管的反并联二极管续流,输出被钳位到正母线,本该输出负电压的时段却输出了正电压。

这个现象累积起来,就形成了死区效应:输出电压的基波幅值下降,波形在电流过零点附近出现明显的“平顶”或“台阶”,同时引入5次、7次等低次谐波。反映到电流上,就是过零点附近的电流波形畸变、转矩脉动增大、低速时电机抖动和噪声加剧。我开头遇到的那台电机“嗡嗡”响,根子就在这里。

用一个生活化的类比:死区就像十字路口的“全红时间”——为了防止两个方向的车同时冲进路口相撞,红灯会多亮那么一两秒。安全是安全了,但通行效率下降了,车流在路口会“顿”一下。死区补偿就相当于给这段全红时间做一个“预判补偿”,让车流尽量平滑通过。

2.3 死区效应到底有多严重:算一笔账

很多人觉得死区才几百纳秒,能有多大影响?算一笔账就清楚了。假设开关频率10kHz,一个开关周期100微秒,死区时间2微秒,那么死区占整个周期的2%。如果母线电压300V,平均下来每个周期损失的等效电压大约是 300V × 2% = 6V 量级(实际还要看电流方向和占空比,但量级如此)。对于输出几十伏、上百伏的场合,6V的偏差已经相当可观了。

更麻烦的是,这个误差不是固定值,而是随电流方向翻转的。电流正半周丢正电压,负半周丢负电压,等效于在输出上叠加了一个与电流方向相反的方波误差电压。这个方波误差的基波分量与电流反相,相当于给系统串了一个“负电阻”,会削弱控制环的阻尼,严重时引起振荡。同时它的谐波分量直接污染输出波形。所以死区补偿不是“锦上添花”,在要求低谐波、低脉动、宽调速范围的场合,它是“必须项”。

3. 死区补偿的核心思路:把丢掉的电压补回来

3.1 补偿的本质是“电压误差前馈”

理解了死区效应的成因,补偿思路其实很直接:既然死区导致实际输出电压与指令电压之间存在一个偏差,那就想办法在指令上预先叠加一个反向的修正量,把这个偏差抵消掉。这就是电压误差前馈补偿的基本思想。

具体来说,死区引起的误差电压方向取决于该相电流的方向。电流为正时,实际输出比指令少了一个“正电压块”;电流为负时,实际输出比指令多了一个“负电压块”(等价于少了一个正电压块)。所以补偿的做法是:检测电流方向,当电流为正时,给该相指令电压叠加一个正的补偿量;电流为负时,叠加一个负的补偿量。补偿量的幅值理论上等于 母线电压 × 死区时间 / 开关周期,再考虑器件导通压降等因素做修正。

这个思路的妙处在于它不需要复杂的模型,只需要知道电流方向和几个基本参数,计算量极小,非常适合在微控制器里实时运行。绝大多数工程实践中的死区补偿,本质上都是这个框架的变体。

3.2 平均电压补偿与脉宽补偿:两条技术路线

落到实现层面,死区补偿主要有两条技术路线,理解它们的区别对选型很重要。

平均电压补偿是在一个开关周期内,根据电流方向计算出一个平均误差电压,直接叠加到电压指令上。它的优点是实现简单、计算量小,对电流方向的判断只需要符号信息。缺点是它假设死区误差在一个周期内是恒定的,对动态过程和高频分量的补偿不够精细,而且在电流过零点附近,电流方向判断容易出错,补偿会“抖”。

脉宽补偿则是直接修改PWM的脉宽——在原本的导通时间上加上或减去死区时间对应的脉宽量。比如电流为正时,把上管的导通脉宽加宽一个死区时间,把下管的脉宽相应减窄。这种方法的补偿更“物理”,与实际的开关过程对应得更紧密,动态响应更好。但它对PWM发生器的灵活性要求更高,需要能独立调整上下管的脉宽,实现复杂度略大。

实际工程中,很多方案是两者的混合:在电流方向明确时用脉宽补偿保证精度,在过零点附近切换到平均补偿或做平滑过渡。选哪条路线,取决于你的硬件平台(PWM外设是否灵活)、控制周期(计算余量)和精度要求。

3.3 为什么不能简单“加一个固定值”

新手最容易犯的错误,是想着“死区误差不是固定的吗,那我直接给所有相都加一个固定补偿量不就行了”。这个想法在电流方向恒定的场合勉强能用,但一旦电流方向翻转就彻底失效——因为误差电压的符号是跟着电流方向变的,固定补偿在电流负半周会“补反”,反而把误差放大一倍。

所以死区补偿的第一个关键点就是:补偿量必须与电流方向挂钩。这也是为什么补偿效果高度依赖于电流方向检测的准确性。电流采样噪声大、过零点判断不准,补偿就会在过零点附近来回“抽搐”,反而引入新的畸变。这个坑后面会专门讲怎么填。

4. 实操落地:从参数计算到代码实现

4.1 补偿量的参数计算过程

动手写代码之前,先把补偿量算清楚。理论补偿电压的表达式是:

V_comp = Vdc × (Td / Ts)

其中 Vdc 是母线电压,Td 是死区时间,Ts 是开关周期。举个具体例子:母线电压 310V,死区时间 1.5微秒,开关频率 10kHz(周期100微秒),那么 V_comp = 310 × (1.5/100) = 4.65V。也就是说,每个周期需要补偿大约4.65V的等效电压。

但实际补偿量往往要比这个理论值略大一些,因为除了死区,还有开关管的导通压降和开关延迟也在贡献误差。工程上常用的修正公式会加上器件压降项:

**V_comp = Vdc × (Td / Ts) + Vce_sat × (1 - ...) **

这里不必死抠公式的每一项,实操中更常用的做法是:先按理论值设定,然后通过实验微调一个系数(比如0.8到1.2之间),观察电流波形过零点的畸变是否最小。这个系数就是补偿增益,不同功率等级、不同器件的板子取值不同,必须实测标定。

注意:补偿量是叠加在电压指令上的,要确保叠加后不超出调制范围(比如SVPWM的线性区),否则会引起过调制。在接近满调制的工况下,补偿量要做限幅处理。

4.2 电流方向的判断:补偿的“眼睛”

补偿量算得再准,方向判断错了全白搭。电流方向的获取有几种常见方式,各有取舍。

最直接的是用电流传感器采样,判断采样值的正负。但采样有噪声,过零点附近符号会频繁翻转,直接取符号会导致补偿量抖动。常见的处理是加一个滞环:电流大于正阈值判为正,小于负阈值判为负,在阈值之间保持上一次的方向不变。滞环宽度一般取额定电流的2%到5%,太窄抗不住噪声,太宽过零点补偿滞后。

另一种方式是利用电流环的输出或者电流观测器估计方向,适合没有直接电流采样的场合,但精度依赖模型准确性。还有一种“笨办法”是在过零点附近直接关闭补偿,等电流明确离开零点再恢复——简单粗暴但有效,代价是过零点附近仍有一小段畸变。

我个人的经验是:滞环加符号判断是性价比最高的方案,实现简单、鲁棒性好。滞环宽度需要根据实际电流噪声水平标定,噪声大的板子滞环要放宽一些。

4.3 一段可参考的补偿代码框架

下面给一个基于平均电压补偿思路的伪代码框架,语言用C,贴近实际嵌入式实现的风格。这段代码假设你已经拿到了三相电流和母线电压,并且有SVPWM的电压指令输入接口。

/* 死区补偿参数 */ #define VDC_NOMINAL 310.0f /* 额定母线电压 V */ #define DEAD_TIME 1.5e-6f /* 死区时间 s */ #define TS 1.0e-4f /* 开关周期 s (10kHz) */ #define COMP_GAIN 1.0f /* 补偿增益,实测标定 */ #define HYST_CURRENT 0.3f /* 电流滞环 A */ /* 电流方向状态,1=正,-1=负 */ static int8_t dir_a = 1, dir_b = 1, dir_c = 1; /* 根据电流和滞环更新方向 */ static int8_t update_dir(float i, int8_t last_dir) { if (i > HYST_CURRENT) return 1; if (i < -HYST_CURRENT) return -1; return last_dir; /* 滞环内保持上次方向 */ } /* 死区补偿主函数 */ void deadtime_compensate(float ia, float ib, float ic, float vdc, float *va_cmd, float *vb_cmd, float *vc_cmd) { float v_comp; /* 更新三相电流方向 */ dir_a = update_dir(ia, dir_a); dir_b = update_dir(ib, dir_b); dir_c = update_dir(ic, dir_c); /* 计算单相补偿电压幅值 */ v_comp = vdc * (DEAD_TIME / TS) * COMP_GAIN; /* 按电流方向叠加补偿:电流为正补正,为负补负 */ *va_cmd += (float)dir_a * v_comp; *vb_cmd += (float)dir_b * v_comp; *vc_cmd += (float)dir_c * v_comp; /* 限幅,防止过调制 */ /* ... 此处根据调制方式做限幅处理 ... */ }

这段代码的核心就三件事:算补偿幅值、判电流方向、按方向叠加。看起来简单,但真正跑起来效果好不好,全在参数标定和方向判断的细节上。补偿增益 COMP_GAIN 一定要实测调,不要迷信理论值;滞环宽度 HYST_CURRENT 要根据你的电流采样噪声来定,噪声大就放宽。

4.4 补偿效果的验证方法

加完补偿怎么知道有没有效果?最直观的是看电流波形。用示波器抓相电流,重点看过零点附近:补偿前过零点有明显的“平台”或“台阶”,补偿后应该变得平滑,接近正弦。如果补偿后过零点反而出现“尖刺”或“抖动”,说明方向判断或补偿量有问题。

更量化的方法是做FFT分析,看5次、7次谐波的含量。死区效应主要贡献低次谐波,补偿到位后这些谐波应该明显下降。我一般会记录补偿前后的谐波对比,作为调参的依据。另外,低速轻载工况是死区效应最明显的场景,验证时一定要在这个工况下看,高速重载时死区占比小,不容易看出问题。

5. 踩坑实录:死区补偿最常见的几个问题

5.1 过零点抖动:补偿“补过头”了

这是最典型的坑。补偿加上去之后,电流过零点附近出现高频抖动,电机声音反而更刺耳。原因通常是电流方向在过零点附近频繁翻转,补偿量跟着来回跳。解决办法前面提过:加滞环、过零点附近做补偿量平滑过渡、或者干脆在过零点附近短暂关闭补偿。我试过最稳的做法是滞环加线性过渡——在滞环区间内,补偿量按电流大小线性缩放,而不是硬切换符号,这样过渡更平滑。

5.2 补偿量偏大导致波形“过冲”

有些人为了追求过零点“绝对平滑”,把补偿增益调得很大,结果电流波形在过零点出现“过冲”,反而引入了新的畸变。死区补偿是“补缺”,不是“加料”,补偿量超过实际误差就会过冲。判断方法是:从小增益往大调,找到过零点畸变最小的点就停,不要贪大。理论值附近通常就是最优点,偏差不会太大。

5.3 不同工况下补偿效果不一致

有的板子在轻载时补偿效果很好,重载时反而变差。这往往是因为重载时电流大,器件压降和续流过程的影响更复杂,单纯的平均电压补偿不够精细。这时候可以考虑引入在线自适应:根据电流幅值对补偿增益做微调,或者切换到脉宽补偿模式。当然,如果精度要求没那么高,接受一定的不一致也是工程上的合理取舍。

5.4 死区时间本身设错了

还有一种情况是补偿怎么调都不对,最后发现是死区时间参数本身设错了——要么驱动电路的实际死区和软件配置不一致,要么器件更换后没更新死区。死区时间是补偿计算的基础,这个数错了,后面全错。建议用示波器实测驱动信号的死区宽度,和软件配置核对一遍,这是排查补偿问题的第一步。

常见问题典型现象排查方向处理建议
过零点抖动电流过零处高频毛刺电流方向判断是否频繁翻转加滞环、线性过渡
波形过冲过零点出现尖峰补偿增益是否过大减小增益至畸变最小
轻重载不一致轻载好重载差器件压降、续流影响自适应增益或脉宽补偿
补偿无效加了补偿没变化死区参数是否配置正确实测死区宽度核对配置
过调制高调制比时波形削顶补偿后是否超出线性区补偿量限幅

5.5 一个容易被忽略的细节:三相补偿的对称性

三相死区补偿要保证三相对称,否则会引入零序分量。实操中要注意:三相的补偿增益和滞环参数应该一致,不要因为某一相电流采样特别准就单独给它调参数。另外,如果用的是SVPWM,补偿量叠加后要重新做扇区判断和矢量合成,不能简单地在三相指令上各加各的,否则可能破坏原有的矢量关系。这个细节在快速原型阶段容易被忽略,等到批量时才发现一致性问题。

6. 死区补偿的边界:什么时候该补,什么时候不必纠结

死区补偿虽好,但不是所有场合都值得大动干戈。判断标准其实很简单:看死区误差相对于你的精度要求占多大比重。如果开关频率低、死区时间短、母线电压不高,死区误差可能只有零点几伏,而你的系统对波形要求也不苛刻,那加一个简单的固定补偿甚至不补偿都能接受。反过来,低速直驱、精密伺服、低谐波逆变电源这类场合,死区效应是主要误差源之一,补偿就必须做扎实。

还有一个现实考量是计算资源和开发周期。平均电压补偿的计算量很小,几乎不占什么资源,适合快速上线;脉宽补偿和自适应方案效果更好但开发和调试成本更高。我的建议是先用平均电压补偿加滞环把基本效果做出来,验证有效后再根据需求决定要不要升级。不要一上来就追求完美方案,先把“有没有”解决,再解决“好不好”。

另外要提醒的是,死区补偿和电流环带宽、采样延迟是相互影响的。补偿改善了波形,但如果你电流环本身带宽不够、采样延迟大,补偿的效果会被掩盖。调补偿之前,先确认电流采样和环路的基本性能是正常的,否则容易把环路的问题误判成补偿没调好,白费功夫。

最后分享一个我自己的习惯:每次调死区补偿,我都会把补偿前后的电流波形和FFT截图存下来,标注当时的母线电压、开关频率、死区时间、负载工况和补偿参数。这些记录在换器件、改板子的时候特别有用——你能快速判断新板子的补偿参数该从哪个值起步,而不是每次从零开始试。这个习惯看起来笨,但省下来的时间远比记录花的时间多。

RELATED READING

延伸阅读

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