3. PWM与采样时序:PWM更新时刻、ADC采样触发点、载波周期与采样窗口的关系

做弱磁控制,说白了就是在跟时间赛跑。你算得再准,如果采样点没踩对,PWM更新晚了半拍,那整个电流环就是白忙活。我刚开始调弱磁的时候,就吃过这个亏——电机转速一上去,电流波形就开始抖,查了三天才发现是采样时序没对齐。

这一节,咱们就把PWM更新时刻、ADC采样触发点、载波周期和采样窗口这几个东西彻底捋清楚。你想想看,一个载波周期里,什么时候采样最干净?什么时候更新占空比最及时?这些搞明白了,弱磁控制才算真正入了门。

3.1 载波周期与PWM更新时刻

先说说载波周期。咱们用的SVPWM,本质上是一个三角波跟调制波比较。三角波的频率就是开关频率,比如10kHz,那一个周期就是100μs。在这个周期里,PWM的占空比什么时候更新?

常见的做法有两种:

  • 载波峰值更新:在三角波的顶点(峰值)处更新占空比。这时候载波从上升沿切换到下降沿,更新时刻比较稳定。
  • 载波谷值更新:在三角波的底点(谷值)处更新。有些MCU支持双更新模式,峰值和谷值都更新,等效开关频率翻倍。

我个人习惯用载波谷值更新。为什么?因为ADC采样通常也放在谷值,这样采样完马上就能更新占空比,延迟最小。我在一个48V/500W的电机项目里试过峰值更新,结果电流环带宽死活上不去,换成谷值更新后,带宽直接提升了30%。

小技巧: 如果你的MCU支持双更新模式(比如TI的C2000系列),可以在峰值和谷值都触发ADC采样和PWM更新。这样等效采样率翻倍,对弱磁区的高速电流控制特别有利。但要注意,CPU的算力得跟得上。

3.2 ADC采样触发点:选对位置很重要

ADC采样触发点,说白了就是什么时候去读电流值。这个时间点选错了,采到的电流可能根本不是你想控制的那个值。

咱们先看一个典型的PWM周期时序图:

PWM周期与采样时序关系图 载波(三角波) 0 T/4 T/2 3T/4 T ADC采样点 ADC采样点 PWM更新 PWM更新 采样窗口 采样窗口 采样窗口避开开关噪声,在载波谷值处触发ADC,同时更新PWM占空比

看到这张图了吗?ADC采样点选在载波的谷值处。为什么?因为这时候上下桥臂的开关状态刚好切换完毕,母线电压和相电流上的开关噪声最小。你想想看,如果在开关动作的瞬间去采样,那噪声能把你淹了。

我曾经在一个项目里犯过这个错——采样点离开关沿太近,结果电流波形上全是毛刺,电流环根本稳不住。后来把采样点往谷值中心移了5μs,问题就解决了。

3.3 采样窗口:别让噪声钻了空子

采样窗口,就是ADC实际采集信号的那段时间。窗口开得太宽,容易采到开关噪声;开得太窄,采样电容又充不满,精度下降。

一般来说,采样窗口要满足两个条件:

  1. 避开开关瞬态:IGBT或MOSFET的开通关断瞬间,会有很大的dv/dt和di/dt,这些噪声会耦合到电流采样回路。采样窗口至少要离开关沿10~20μs。
  2. 保证采样精度:ADC的采样电容需要时间充电。比如12位ADC,采样时间通常需要几百ns到几μs。窗口太短,转换结果会偏小。
经验值: 对于10kHz的开关频率(周期100μs),我一般把采样窗口设在谷值前后各5μs,总共10μs的窗口。这样既避开了开关噪声,又给了ADC足够的采样时间。如果开关频率更高(比如20kHz),窗口要相应缩短。

3.4 时序对齐的三种典型方案

实际工程中,时序对齐的方式取决于MCU的硬件资源。我整理了三套常见方案,你可以根据手头的芯片选:

方案 触发方式 PWM更新点 适用场景 延迟
单更新-谷值采样 载波谷值触发ADC 谷值更新 通用弱磁控制,10~20kHz 0.5~1个载波周期
双更新-峰值谷值采样 峰值和谷值都触发ADC 峰值和谷值都更新 高速弱磁,需要高带宽 0.25~0.5个载波周期
单更新-偏移采样 载波谷值偏移一定时间后触发 谷值更新 存在强干扰的工业环境 0.5~1.5个载波周期

方案一:单更新-谷值采样。这是最常用的方式。ADC在谷值触发,采样完成后立即进入中断,计算新的占空比,然后在同一个谷值更新PWM。延迟大约半个载波周期。

方案二:双更新-峰值谷值采样。如果你的MCU支持,这是弱磁控制的首选。我在一个8000rpm的高速主轴电机项目里用过,电流环带宽做到了2kHz,弱磁区控制非常平稳。代价是CPU负载翻倍,中断频率从10kHz变成20kHz。

方案三:单更新-偏移采样。有些场合,开关噪声特别大,谷值处也不干净。这时候可以把采样点往后偏移10~20μs,等噪声衰减了再采。代价是延迟增加,但换来的是干净的采样值。

注意: 偏移采样会引入额外的相位延迟。在弱磁区,电流环的相位裕度本来就紧张,延迟增加可能导致系统不稳定。如果你必须用偏移采样,建议适当降低电流环带宽,或者加入相位补偿。

3.5 代码示例:基于STM32的时序配置

说了这么多理论,咱们看一段实际代码。以STM32G4为例,配置TIM1产生中心对齐PWM,并在更新事件时触发ADC:

// TIM1配置:中心对齐模式,10kHz
TIM1->PSC = 170 - 1;      // 170MHz / 170 = 1MHz
TIM1->ARR = 100 - 1;      // 1MHz / 100 = 10kHz
TIM1->CR1 |= TIM_CR1_CMS_1;  // 中心对齐模式2

// 使能更新事件触发ADC
TIM1->DIER |= TIM_DIER_UIE;

// ADC配置:由TIM1触发,采样时间设为10个ADC时钟周期
ADC1->CFGR2 |= ADC_CFGR2_JOVSE;  // 注入组转换
ADC1->JSQR = (1 << 20) | (1 << 15);  // 1次转换,通道1

// 采样时间配置:10个ADC时钟周期
ADC1->SMPR1 |= (10 << 3);  // 通道1采样时间

// 启动TIM1
TIM1->CR1 |= TIM_CR1_CEN;

这段代码的关键点:

  • TIM1工作在中心对齐模式,ARR=100,所以载波周期是100μs(10kHz)。
  • 更新事件(UEV)在载波谷值触发,同时启动ADC注入组转换。
  • ADC采样时间设为10个时钟周期,大约100ns,足够12位精度。

嗯,这里要注意:STM32的更新事件默认在计数器溢出时触发。对于中心对齐模式,溢出发生在谷值。如果你用的是其他MCU,一定要确认更新事件的发生位置。

3.6 避坑指南:我踩过的三个坑

最后,分享几个我实际项目中踩过的坑,希望能帮你少走弯路:

  • 坑一:采样点离开关沿太近。 有一次我把ADC触发点设在PWM边沿后2μs,结果电流采样值跳得厉害。后来用示波器一看,开关噪声持续了将近5μs。把采样点往后挪了8μs,波形就干净了。
  • 坑二:双更新模式下中断处理超时。 双更新意味着中断频率翻倍。我在一个项目里用了20kHz双更新,结果中断处理时间超过了25μs,导致下一个中断被错过。解决办法是优化代码,把计算量大的部分放到主循环里,中断里只做必要的数据搬运。
  • 坑三:采样窗口太窄导致精度下降。 有个客户反馈电流控制精度不够,我一看代码,采样时间只设了3个ADC时钟周期。对于12位ADC,这远远不够。改成12个周期后,精度从10位提升到了11.5位。

时序这东西,看着简单,但差几个微秒,效果天差地别。我建议你在调试时,先用示波器抓一下PWM输出和ADC采样触发信号,确认时序对齐了再开始调参数。这一步省不了。