4. 采样时刻选择:避开开关噪声的ADC触发策略

电流采样这件事,说难不难,说简单也不简单。很多刚入行的工程师,代码写得挺漂亮,算法也调得顺,偏偏电流波形就是毛刺多、噪声大。问题出在哪?十有八九是采样时刻没选对。

我个人习惯把采样时刻比作「拍照」。你想想看,PWM开关管在导通和关断的瞬间,电流波形上会叠加一个尖峰——这就是开关噪声。你要是刚好在那个瞬间去采样,拍到的就是一张「鬼片」,数据根本没法用。

4.1 开关噪声的来源与特征

先说说噪声从哪来的。

MOSFET或IGBT在开关时,电压和电流的变化率极高(dV/dt、dI/dt)。这些快速变化会通过寄生电容、寄生电感耦合到电流检测回路中。说白了,就是开关动作本身在「污染」你的采样信号。

我在项目中遇到过一种情况:采样电阻上的电压波形,在开关时刻会出现一个持续几百纳秒到一两微秒的尖峰。这个尖峰的幅度,有时候能达到正常信号的好几倍。你想想看,ADC要是刚好踩在这个尖峰上采样,那电流值能准吗?

关键特征:

  • 开关噪声通常出现在PWM信号的上升沿和下降沿附近
  • 持续时间:100ns ~ 2μs(取决于开关速度和电路寄生参数)
  • 幅度:可达正常信号的2~10倍
  • 频率成分:高频,通常远高于基波频率

4.2 理想的采样窗口

那什么时候采样最合适?

嗯,这里要注意:理想的采样时刻,应该选在开关噪声已经衰减完毕、电流信号已经稳定的时间段。对于三相PMSM的FOC控制,最常见的做法是在PWM周期的中间点或两端进行采样。

为什么会这样?

因为PWM的开关动作通常发生在载波的波峰和波谷。如果你把ADC触发时刻设置在PWM计数的中间值(比如三角波载波的顶点或底点),那正好避开了开关动作的瞬间。这个窗口,就是所谓的「安全采样区」。

我的经验:

我曾经在一个项目中,采样时刻只偏离了理想位置0.5μs,结果电流环的噪声就大了将近一倍。后来我把ADC触发时刻往前调了1μs,波形立马干净了。有时候,差的就是这么一点点。

4.3 单电阻采样的时刻选择

单电阻采样是成本最低的方案,但也是最容易踩坑的。它只有一个采样电阻,需要在不同的PWM状态下分别采样两相电流。

这里有个关键点:单电阻采样要求你在一个PWM周期内完成两次采样。这两次采样必须分别落在不同的开关状态区间内,而且都要避开开关噪声。

我建议的做法是:

  • 第一次采样:放在PWM周期的前半段,等第一个开关沿的噪声过去之后
  • 第二次采样:放在PWM周期的后半段,等第二个开关沿的噪声过去之后
  • 两次采样之间至少要留出足够的死区时间(通常1~2μs)

注意:

单电阻采样有一个「盲区」问题。当占空比接近0%或100%时,某些开关状态的持续时间太短,根本不够你完成采样。这时候要么做移相处理,要么切换到其他采样策略。我曾经在这个问题上吃过亏,电机低速运行时电流波形突然变差,查了半天才发现是盲区导致的。

4.4 双电阻与三电阻采样的时刻选择

双电阻和三电阻采样相对宽松一些。因为每个相电流都有独立的采样通道,你不需要在同一个周期内挤两次采样。

对于双电阻采样:

  • 通常选择在PWM周期的中间点触发ADC
  • 此时两相电流都已经稳定,且远离开关噪声
  • 第三相电流可以通过计算得到(i_a + i_b + i_c = 0)

对于三电阻采样:

  • 同样推荐在PWM周期中点触发
  • 三相电流同时采样,数据一致性最好
  • 缺点是成本高、PCB布局复杂

我个人更倾向于双电阻方案。成本适中,性能也够用。三电阻当然更好,但很多时候没必要。

4.5 ADC触发配置实战

下面给出一段基于STM32的ADC触发配置代码。这里用的是定时器的更新事件或比较事件来触发ADC。

// 配置定时器1的更新事件触发ADC
// 选择在PWM周期中点触发(三角波模式下对应计数器溢出或归零)

void ADC_Trigger_Config(void)
{
    // 使能ADC和定时器时钟
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    
    // 配置ADC触发源为定时器2的TRGO事件
    ADC1->CR2 |= ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1;  // 选择TIM2 TRGO
    ADC1->CR2 |= ADC_CR2_EXTTRIG;                      // 使能外部触发
    
    // 配置定时器2产生更新事件作为TRGO
    TIM2->CR2 |= TIM_CR2_MMS_1;  // 更新事件作为TRGO输出
    
    // 设置PWM频率和计数模式(三角波)
    TIM2->PSC = 0;               // 预分频
    TIM2->ARR = 1000;            // 自动重装值,决定PWM频率
    TIM2->CR1 |= TIM_CR1_CMS_1;  // 中心对齐模式(三角波)
    
    // 使能定时器
    TIM2->CR1 |= TIM_CR1_CEN;
}

这段代码的核心思路是:让定时器工作在中心对齐模式(三角波),然后利用定时器的更新事件(发生在计数器归零或溢出时)来触发ADC。这样ADC采样时刻就自动落在了PWM周期的中点。

小技巧:

如果你发现采样到的电流还是有噪声,可以尝试在ADC采样前插入一个小的硬件延迟(比如RC滤波),或者在软件里做多次采样取平均。但记住,延迟不能太大,否则会影响电流环的带宽。

4.6 采样时刻的软件可调设计

在实际项目中,我建议把采样时刻做成可配置的。因为不同的电机、不同的负载条件,最优采样时刻可能会有差异。

怎么做?

  • 利用定时器的比较通道,产生可移位的触发信号
  • 在软件中设置一个偏移量,动态调整采样时刻
  • 通过观察电流波形的噪声水平,在线调整偏移量

我曾经在一个项目中,电机空载时采样没问题,一带负载电流波形就出现毛刺。后来我把采样时刻往后移了0.8μs,问题就解决了。原因很简单:负载增大后,开关管的关断时间变长,噪声的持续时间也变长了。

总结一下采样时刻选择的要点:

  1. 避开开关沿:采样时刻至少距离开关动作1~2μs
  2. 优先选周期中点:三角波载波的中点是最安全的采样窗口
  3. 单电阻要小心盲区:占空比极端时需特殊处理
  4. 采样时刻可调:留出软件调整的余地,方便调试
  5. 硬件配合:适当的RC滤波可以进一步抑制残余噪声

采样时刻选对了,电流环的噪声问题就解决了一大半。剩下的就是滤波算法的活了。不过那是下一节的内容,咱们先把采样时刻这个基础打牢。


公众号:蓝海资料掘金营,微信deep3321