1. 采样同步基础:什么是采样同步?为什么电机控制中需要同步采样?

各位做电机控制的同行,咱们今天聊聊采样同步。说实话,我刚入行那会儿,觉得采样不就是定时器到了就采一下嘛,有什么好同步的?直到有一次调试一个高速伺服驱动器,电机一跑起来电流波形就跟心电图似的,怎么调都调不好。后来老工程师看了一眼说:“你小子采样没同步吧?”——从那以后,我才真正开始重视这个问题。

1.1 什么是采样同步?

采样同步,说白了就是让ADC采样的时刻和PWM载波的特定位置对齐。你想想看,电机控制里PWM开关管一直在高频通断,母线电压和相电流上全是开关噪声。如果采样点乱跳,今天采在开关管刚关断的尖峰上,明天采在电流平稳区,那控制算法看到的“反馈值”根本就不是同一个物理量。

我个人习惯把采样同步理解为“在噪声最小的窗口里抓取真实信号”。具体来说,就是让ADC的触发信号和PWM定时器的计数周期对齐,通常选在PWM载波的波峰或波谷处。为什么选这两个点?因为这时候开关管要么刚开通完毕,要么刚关断完毕,di/dt和dv/dt引起的振铃最小。

核心定义:采样同步 = ADC采样时刻与PWM载波周期(或半周期)的固定相位对齐。目的是在开关噪声最低的时窗内获取准确的电流/电压反馈值。

下面这张图能帮你快速理解采样同步在整个电机控制系统中的位置:

采样同步在电机控制系统中的位置 PWM定时器 ADC采样触发 电流/电压采样 控制算法 同步核心:ADC触发时刻 = PWM载波波峰/波谷 + 固定延时(避开开关噪声) PWM载波 采样点 采样点 采样点 开关噪声区(避开) 采样窗口(对齐) 图1:采样同步时序关系——ADC采样点固定在PWM载波波谷,避开开关动作产生的噪声尖峰 关键参数: • 载波频率:8~20 kHz(常用) • 采样窗口:载波周期中点 ± 1~2 μs • 同步精度:±50 ns(硬件触发) • 采样保持时间:≥ 500 ns

1.2 为什么电机控制中需要同步采样?

这个问题,我用三个实际场景来回答你。

场景一:电流环的“幻觉”问题

有一次我调试一个2kW的伺服驱动器,电流环带宽设到2kHz。电机空载时电流波形看着还行,一带负载,电流反馈值忽大忽小,速度也跟着抖。用示波器一看,ADC采样点正好落在IGBT关断的振铃区,每次采到的值都不一样。说白了,控制器看到的“电流”其实是噪声,不是真实电流。这就是典型的非同步采样导致的“电流反馈幻觉”。

我的经验:电流环带宽越高,对采样同步的要求越苛刻。带宽超过1kHz时,采样抖动超过±1μs就会明显影响控制性能。我曾经在2kHz带宽下试过,采样抖动±2μs,电流THD直接从3%飙到12%。

场景二:三相电流重构的“时间窗口”

现在很多低成本方案用单电阻或双电阻采样重构三相电流。这玩意儿对采样同步的要求更高。你想想看,单电阻采样需要在PWM周期的特定相序窗口内采集两路电流,窗口宽度可能只有2~3μs。如果采样触发和PWM不同步,窗口位置飘了,要么采不到有效值,要么采到的是开关管换流过程中的电流——重构出来的三相电流全是错的。

采样方式 同步要求 典型窗口宽度 常见问题
三电阻采样 低(±5μs) 10~20μs 噪声耦合
双电阻采样 中(±2μs) 3~8μs 窗口漂移
单电阻采样 高(±0.5μs) 1~3μs 重构失败

注意:单电阻采样时,如果PWM占空比接近0%或100%,有效采样窗口会变得极窄甚至消失。这时候即使同步做得再好,也采不到有效电流。需要配合移相PWM或注入补偿脉冲来解决——这个我们后面章节会详细讲。

场景三:无传感器控制的“相位误差”

做无传感器FOC的兄弟应该深有体会。反电动势观测器对电流采样的相位延迟极其敏感。如果采样时刻和PWM载波不同步,每次采到的电流相位都在变,观测器估算出来的转子位置就会带一个随机误差。我见过一个项目,采样抖动导致位置估算误差达到15°电角度,电机在低速时直接失步。

为什么会这样?因为无传感器算法依赖电流和电压的精确相位关系。采样不同步相当于给反馈信号加了一个时变的相位偏移,观测器根本没法收敛。

1.3 同步采样的两种实现方式

实际工程中,同步采样主要有两种做法。我按自己的使用频率排个序:

  1. 硬件自动触发(推荐):PWM定时器产生ADC触发信号,ADC转换完成后通过DMA自动搬运数据。整个过程不需要CPU干预,延迟固定,精度最高。
  2. 软件定时中断:在PWM中断服务函数里手动启动ADC转换。这种方式灵活,但受中断响应延迟影响,同步精度不如硬件触发。

我个人强烈建议用硬件触发方式。为什么?因为软件方式的中断延迟是不确定的——哪怕你关了全局中断,CPU执行指令的时间也会受流水线和缓存影响。我曾经在STM32F4上实测过,软件触发方式的采样抖动在±0.8μs左右,而硬件触发可以做到±50ns以内。

硬件触发 vs 软件触发:

  • 硬件触发:抖动 ±50ns,延迟固定,适合高带宽应用
  • 软件触发:抖动 ±0.5~1μs,延迟可变,适合低带宽或成本敏感方案

1.4 一个简单的配置示例

以STM32G4系列为例,配置PWM定时器触发ADC同步采样的核心代码大致是这样的:

// 配置TIM1为PWM模式,中心对齐计数
TIM1->CR1 |= TIM_CR1_CMS_1;      // 中心对齐模式2
TIM1->ARR = 3000 - 1;            // 载波频率 = 170MHz / 3000 ≈ 56.7kHz
TIM1->CCR1 = 1500;               // 50%占空比

// 配置TIM1触发ADC
TIM1->CR2 |= TIM_CR2_MMS_2;      // 更新事件作为TRGO输出
TIM1->DIER |= TIM_DIER_UIE;      // 使能更新中断(可选)

// 配置ADC为硬件触发
ADC1->CFGR1 |= ADC_CFGR1_EXTEN_0; // 上升沿触发
ADC1->CFGR1 |= 6 << 6;           // 选择TIM1_TRGO作为触发源

// 配置DMA自动搬运
DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;
DMA1_Channel1->CMAR = (uint32_t)adc_buffer;
DMA1_Channel1->CNDTR = 3;        // 三相电流
DMA1_Channel1->CCR |= DMA_CCR_EN;

这段代码的核心思路是:PWM定时器在每次载波周期到达波谷时(更新事件)自动触发ADC,ADC转换完成后DMA直接把结果搬到内存缓冲区。整个过程CPU只需要在中断里读取已经准备好的数据,不需要操心采样时机。

小技巧:配置ADC采样时间时,记得留够采样保持时间。我一般设到12~15个ADC时钟周期。采样时间太短,采样电容充不满,转换结果会偏小——尤其是高阻抗信号源时更明显。

1.5 避坑指南

最后分享几个我踩过的坑:

  • 坑一:以为同步采样就是“在PWM中断里启动ADC”。实际上中断响应有延迟,而且不同中断优先级会导致延迟抖动。老老实实用硬件触发吧。
  • 坑二:采样点选在PWM波峰还是波谷?我建议选波谷。因为波谷时所有开关管都处于关断状态(对于互补PWM),噪声最小。波峰处可能有开关管刚开通的尖峰。
  • 坑三:ADC采样时间设得太短。有些芯片的ADC采样电容只有几pF,如果信号源阻抗高,采样时间不够会导致转换结果不准确。我一般设到1μs以上。
  • 坑四:忽略了采样保持电路的前级滤波。ADC输入引脚前最好加一个RC低通滤波,截止频率设在PWM载波频率的1/10左右。既能滤除高频噪声,又不会影响电流环带宽。