采样同步基础:为什么电流采样需要同步?无感启动中的采样挑战
做无感FOC(磁场定向控制)这些年,我踩过最大的坑,就是电流采样。
你可能觉得,采样嘛,ADC一开,数据就来了,有什么难的?
嗯,刚开始我也是这么想的。直到有一次,我调试一台200W的伺服电机,空载运行好好的,一带负载就“嗡嗡”响,电流波形像锯齿一样。折腾了两周,最后发现——采样点和PWM(脉宽调制)开关时刻没对齐。
说白了,就是采样没同步。
电流采样为什么需要同步?
先看一个基本事实:电机绕组是感性负载。
感性负载的特性是什么?电流不能突变。PWM开关管一开一关,母线电压直接加在绕组上,电流会按指数规律上升或下降。这个过程中,电流波形里充满了开关噪声和尖峰。
如果你随便找个时间点去采样,很可能采到的是开关管刚关断时的振铃尖峰,或者是续流二极管导通时的电流毛刺。这些值根本不是真实的相电流。
我习惯把采样窗口放在PWM周期的中间点。为什么?
- 开关管开通和关断的瞬态过程已经结束
- 电流波形相对平稳,没有高频振荡
- 采样值最能代表该PWM周期的平均电流
核心原则:采样时刻必须避开PWM开关瞬态,选择电流波形最平稳的窗口。
你想想看,如果采样值不准,电流环算出来的电压矢量就是错的。错上加错,电机能不抖吗?
无感启动中的采样挑战
有位置传感器的时候,采样同步已经够麻烦了。到了无感启动,难度直接翻倍。
为什么?
有传感器时,转子位置是已知的。你可以根据位置信息,精确安排采样时刻。但无感启动时,转子位置是估算的,甚至一开始是未知的。
我遇到过最典型的情况:电机在零速启动阶段,反电动势几乎为零。这时候只能用高频注入法或者开环强拖来建立转子磁场。但问题来了——
- 高频注入信号会叠加在电流采样信号上,形成干扰
- 开环强拖时,电流幅值很大,但PWM占空比很小,采样窗口被严重压缩
- 转子位置估算误差会导致采样点偏移,进一步恶化估算精度
这是一个恶性循环:采样不准 → 位置估算不准 → 采样更不准。
注意:无感启动阶段,电流采样精度直接决定了启动成功率。采样偏差超过5%,电机就可能启动失败或者反转。
采样同步的核心要素
要解决这个问题,得先理清楚几个关键要素。我画了一张图,帮你快速建立整体认知:
从这张图你能看到,采样同步不是孤立的技术点。它和时序、噪声、位置估算三者紧密绑定。任何一个环节出问题,整个系统都会受影响。
无感启动特有的采样难题
咱们具体拆开看看,无感启动到底难在哪。
| 启动阶段 | 采样挑战 | 典型后果 |
|---|---|---|
| 零速/低速(0~5%额定转速) | 反电动势极弱,信噪比低;高频注入信号与采样信号混叠 | 位置估算发散,电机无法建立转矩 |
| 开环强拖(5%~20%额定转速) | PWM占空比小,采样窗口窄;电流幅值大,ADC可能饱和 | 电流波形畸变,过流保护误触发 |
| 闭环切换(20%额定转速附近) | 估算位置与实际位置存在相位差,采样点偏移 | 切换瞬间电流冲击,电机抖动甚至失步 |
这张表是我在实际项目中总结的。每个阶段都有它的“坑”。
我记得有一次做风机项目,零速启动时高频注入信号频率选得太高,和采样频率产生了差拍干扰。结果电流波形上出现了一个低频包络,位置估算跟着来回摆动。电机在原地“哆嗦”了三四秒才转起来。
后来怎么解决的?把高频注入频率降到采样频率的1/8,同时在ADC前端加了一个二阶低通滤波器。问题就消失了。
经验之谈:高频注入频率一般选在采样频率的1/6~1/10之间。太低影响动态响应,太高容易和采样产生混叠。这个范围是我试过多个项目后觉得最稳妥的。
采样同步的底层逻辑
说了这么多,其实核心就一句话:采样时刻必须和PWM开关事件、转子位置三者对齐。
怎么对齐?我习惯用PWM定时器的比较匹配事件来触发ADC。具体做法:
- 配置PWM定时器为中央对齐模式
- 在定时器计数到0或周期值时,触发ADC采样
- ADC采样完成后,通过DMA自动传输到内存
- CPU在PWM周期中断里读取最新的采样值
这样做的好处是:采样时刻完全由硬件决定,不受软件执行时间抖动的影响。
给你看一段我常用的配置代码(基于STM32G4系列):
// PWM定时器配置为中央对齐模式
TIM1->CR1 |= TIM_CR1_CMS_1; // 中央对齐模式2
TIM1->CR1 |= TIM_CR1_ARPE; // 自动重载预装载
// 设置PWM频率为20kHz,周期为50us
TIM1->ARR = 3600 - 1; // 假设定时器时钟为72MHz
TIM1->PSC = 0;
// 配置ADC触发源为TIM1的TRGO事件
// 在定时器计数到0时触发ADC
TIM1->CR2 |= TIM_CR2_MMS_2; // 选择更新事件作为TRGO
// ADC配置
ADC1->CFGR |= ADC_CFGR_EXTEN_0; // 上升沿触发
ADC1->CFGR |= 6 << 6; // 选择TIM1_TRGO作为触发源
这段代码的核心思路是:让PWM定时器自己决定什么时候采样,而不是靠CPU的定时器中断。硬件触发的好处是延迟确定,不会因为中断优先级或者代码执行时间变化而抖动。
避坑提醒:我曾经在某个项目里用软件定时器触发ADC,结果发现每次采样的时间点都在漂。后来用示波器一量,抖动达到了±2μs。对于20kHz的PWM来说,2μs的抖动已经足够让采样点滑到开关噪声区域了。从那以后,我再也不敢用软件触发来做电流采样。
小结
这一章咱们聊了采样同步的基础。核心就三件事:
- 采样必须避开PWM开关瞬态,选在电流最平稳的时刻
- 无感启动的三个阶段各有各的采样难题,需要针对性处理
- 硬件触发采样是保证同步精度的最佳实践