3、同步采样窗口设计:如何利用SVPWM的零矢量窗口,精准定位ADC采样触发时刻,避开开关噪声

做电机驱动的人,十有八九都被电流采样噪声折磨过。我当年调试第一版伺服驱动器时,电流波形上全是毛刺,FFT一看全是开关频率的谐波。折腾了两周,最后发现是ADC采样时刻没选对——正好踩在IGBT开关动作的噪声尖峰上。

这一章咱们就聊聊怎么利用SVPWM本身的零矢量窗口,把ADC采样时刻精准地“塞”进噪声最低的时间段。说白了,就是让采样和开关动作打时间差。

3.1 为什么零矢量窗口是采样黄金期?

先看一个基本事实:SVPWM的每个PWM周期里,总有一段或两段时间,所有上桥臂或所有下桥臂同时导通。这就是零矢量作用区间。此时母线电流通过电机绕组续流,相电流的变化率最小,di/dt引起的电压尖刺也最小。

我习惯把零矢量窗口比作“暴风雨中的风眼”。开关管动作时,母线电压剧烈跳变,采样回路里耦合进来的共模噪声最大。而零矢量期间,开关状态不变,噪声源基本消失。这时候采样,信噪比最高。

核心结论:零矢量窗口内的电流波形最平滑,ADC采样结果最接近真实值。采样触发时刻应落在零矢量区间的中间位置,避开前后沿的振铃区。

3.2 不同调制模式下的零矢量分布

零矢量的位置和宽度,取决于你用的是七段式还是五段式SVPWM。这两种方式在实际项目里都很常见,我分别说一下。

调制方式 零矢量分布 每周期采样窗口数 窗口宽度
七段式SVPWM V0(000)和V7(111)各占一段,对称分布在周期首尾和中间 2个(首尾+中间) 较宽,约(1-√3/2)×Ts
五段式SVPWM 只使用V0或V7中的一个,集中在周期一端 1个 较窄,约(1-调制比)×Ts

七段式的好处是每个周期有两个对称的采样窗口,适合双采样策略。五段式开关损耗小,但采样窗口只有一个,而且调制比高时窗口会变得很窄——高转速下尤其要注意。

我的经验:如果系统对噪声敏感,优先用七段式。虽然开关次数多了一点,但采样窗口宽裕,ADC触发时刻的容错空间大。五段式我一般只在重载低频工况下用,那时候调制比低,零矢量窗口反而宽。

3.3 采样触发时刻的计算方法

确定了用七段式还是五段式之后,下一步就是算具体的触发时刻。这里我给出一个通用方法,适用于大多数MCU的PWM模块。

假设PWM定时器采用中心对齐模式,周期值为TPR。七段式SVPWM一个周期内的开关序列为:

V0 → V1 → V2 → V7 → V2 → V1 → V0
(000) (100) (110) (111) (110) (100) (000)

零矢量V0和V7分别位于周期两端和中间。ADC采样触发时刻应设置在:

  • V0窗口采样点:定时器计数值 = Tdead + Tsettle
  • V7窗口采样点:定时器计数值 = TPR - Tdead - Tsettle

其中Tdead是死区时间,Tsettle是采样保持电容的建立时间。这两个参数需要根据实际硬件调整。

注意:千万不要把采样点设在死区时间内!死区期间上下桥臂都关断,相电压由续流二极管决定,电流波形存在不确定性。我曾经见过一个案例,工程师把采样点设在死区边缘,结果低速时电流波形出现周期性畸变,查了三天才发现是采样点踩在了死区振铃上。

3.4 双采样与单采样的选择

利用零矢量窗口,我们可以实现两种采样策略:

  • 单采样:每个PWM周期只采样一次,通常选在V0或V7窗口。优点是计算量小,适合低端MCU。缺点是只能得到一相电流信息,需要结合其他相重构。
  • 双采样:每个PWM周期采样两次,分别在V0和V7窗口。两次采样的平均值可以进一步抑制噪声,而且能同时获得两相电流,适合FOC控制。

我个人更推荐双采样,尤其是在高开关频率(>10kHz)的场合。两次采样取平均,相当于做了一个简单的低通滤波,对高频共模噪声的抑制效果很明显。

3.5 采样窗口与调制比的约束关系

这里有一个容易被忽略的问题:调制比越高,零矢量窗口越窄。当调制比接近1时,零矢量窗口几乎消失,采样点很难避开开关噪声。

我整理了一个经验数据表,供大家参考:

调制比范围 零矢量窗口宽度(相对PWM周期) 采样策略建议
0 ~ 0.6 > 20% 双采样,窗口充裕
0.6 ~ 0.85 10% ~ 20% 双采样,需精确计算触发时刻
0.85 ~ 0.95 5% ~ 10% 单采样,或改用过调制策略
> 0.95 < 5% 不建议在零矢量窗口采样,考虑电流重构

你看,调制比超过0.85之后,零矢量窗口就变得很窄了。这时候如果还硬要在窗口内采样,触发时刻稍微偏一点就会掉进噪声区。我的做法是:高调制比下切换到单采样,或者干脆用电流重构技术,从直流母线电流还原相电流。

3.6 同步采样窗口设计的完整流程

下面这张SVG图总结了整个设计流程,从调制方式选择到最终代码实现,每一步都对应着具体的参数计算。

SVPWM同步采样窗口设计流程 同步采样窗口设计流程 选择调制方式 确定零矢量位置与宽度 计算ADC触发时刻 判断窗口宽度是否充足 宽度 > 5%? 是 采用双采样策略 否 单采样或电流重构 提示:窗口宽度 < 5% 时,零矢量采样已不可靠,建议改用直流母线电流重构方案

3.7 代码实现示例

以STM32G4系列为例,配置PWM中心对齐模式,在零矢量窗口触发ADC采样。关键代码如下:

// 假设PWM频率20kHz,定时器周期TPR = 1500
// 死区时间Tdead = 50个计数周期
// 采样建立时间Tsettle = 20个计数周期

// 计算V0窗口采样点(周期开始处)
uint16_t sample_point_v0 = Tdead + Tsettle;  // 70

// 计算V7窗口采样点(周期中间)
uint16_t sample_point_v7 = TPR - Tdead - Tsettle;  // 1430

// 配置ADC触发源为TIM1的通道比较事件
TIM1->CCR1 = sample_point_v0;   // 第一次采样触发
TIM1->CCR2 = sample_point_v7;   // 第二次采样触发

// 使能ADC的定时器触发模式
ADC1->CFGR2 |= ADC_CFGR2_JEXTEN_0;  // 上升沿触发
ADC1->CFGR2 |= (2 << 10);           // 选择TIM1_TRGO作为触发源

这段代码里,我把采样点设在死区结束后的第20个计数周期。为什么是20?因为我实测过板子上运放的建立时间,大约需要1μs。20kHz的PWM周期是50μs,20个计数周期对应约0.67μs,留了余量。

调试技巧:第一次调采样窗口时,别急着跑闭环。先把PWM输出固定在一个占空比,用示波器同时抓PWM输出和ADC采样触发信号。调整触发时刻,观察采样点是否落在零矢量窗口的平坦区域。我习惯在触发信号上叠加一个短脉冲,这样在示波器上看得更清楚。

3.8 避坑指南

最后总结几个我在项目中踩过的坑:

  • 死区补偿没做:采样点计算时忘了加死区时间,结果采样点落在死区振铃区。电流波形上出现周期性尖峰,频率等于开关频率。解决办法很简单,把Tdead加进去就行。
  • 采样保持时间不够:ADC的采样保持电容需要时间充电。如果Tsettle设得太短,采样结果会偏小。我遇到过一例,电流采样值始终比实测值低5%,查了半天发现是采样保持时间不够。把Tsettle从10个计数周期加到30个,问题解决。
  • 多通道采样串扰:同时采样两相电流时,如果两个采样通道的触发时刻太近,前一相的采样保持过程会干扰后一相。我的做法是让两相采样错开几个计数周期,或者使用双ADC交替采样。

嗯,同步采样窗口设计这块,核心就是一句话:把ADC触发时刻精确地放在零矢量窗口的中间,同时留足死区和建立时间的余量。做到这一点,电流采样噪声至少能降一个数量级。