4、ADC采样与调理:相电流采样电路、ADC配置(注入组/规则组)、过采样技术、采样窗口对齐

各位同学,咱们今天聊点硬核的——ADC采样。说实话,做电机控制这么多年,我见过太多“算法写得飞起,一上电电机就抖成筛子”的案例。问题出在哪儿?十有八九是ADC采样没搞好。你想想看,电流环的输入信号都歪了,后面的PI控制器再牛也白搭。

这一章,咱们就把ADC采样这件事彻底掰扯清楚。从硬件电路到软件配置,从过采样到窗口对齐,一个坑都不放过。

4.1 相电流采样电路:从霍尔到运放

先说说采样电路。我早期做项目时,图省事直接用了采样电阻+差分运放的标准电路。结果呢?电机低速运行时电流波形毛刺特别多,查了半天发现是共模干扰没处理好。

典型的相电流采样电路长这样:

// 硬件电路示意(非代码,仅描述)
// 采样电阻:通常10mΩ~50mΩ,功率要够
// 差分运放:如INA240、AD8418,增益50~100倍
// 低通滤波:RC截止频率约1MHz,滤除PWM开关噪声
// 钳位电路:防止过压损坏ADC输入引脚

这里有几个关键点:

  • 采样电阻的选型:阻值太小,信噪比差;阻值太大,发热严重。我个人习惯用20mΩ,兼顾精度和功耗。
  • 运放的共模抑制比:至少80dB以上。我在项目中遇到过,某款便宜运放CMRR只有60dB,结果母线电压一波动,采样值就跟着飘。
  • PCB布局:采样电阻要靠近MOSFET的源极,走线要短而粗。差分信号要平行走线,避免形成环路。
注意:采样电路的地线处理非常关键。千万不要让大电流回路和信号回路共用一段地线,否则你会看到“神奇”的噪声波形。

4.2 ADC配置:规则组 vs 注入组

STM32的ADC有两种工作模式:规则组和注入组。很多初学者搞不清区别,我简单解释一下。

规则组:就是常规的扫描转换。你配置好通道序列,ADC就按顺序一个个转。适合周期性的采样任务,比如三个相电流轮流采样。

注入组:相当于“插队”模式。当规则组正在转换时,注入组可以打断它,优先完成自己的转换。适合需要精确定时的采样,比如在PWM的特定时刻触发。

我做电机控制时,通常这样分配:

功能 使用组 说明
相电流采样 注入组 需要精确对齐PWM中心,不能被其他任务打断
母线电压、温度 规则组 对时序要求不高,慢慢扫就行

配置代码示例(基于STM32 HAL库):

// 注入组配置
hadc1.InjectedConfig.InjectedNbrOfConversion = 3;  // 三个注入通道
hadc1.InjectedConfig.InjectedSamplingTime = ADC_SAMPLETIME_3CYCLES;

// 规则组配置
hadc1.Init.NbrOfConversion = 2;  // 两个规则通道
hadc1.Init.ScanConvMode = ENABLE;
经验之谈:如果你用注入组采样相电流,记得把注入组的触发源设置为定时器的TRGO事件。这样每次PWM周期开始,ADC就自动开始采样,不需要CPU干预。

4.3 过采样技术:用时间换精度

过采样,说白了就是多采几次然后平均。为什么需要它?因为电机控制中的电流信号往往很小(毫伏级),而ADC的量化噪声又不可避免。

我举个例子:12位ADC,理论分辨率是3.3V/4096≈0.8mV。但实际有效位数可能只有10位,因为噪声会吃掉低两位。怎么办?过采样!

过采样的原理很简单:

  • 每增加4倍采样率,有效位数增加1位
  • 比如你想从12位提升到14位,需要过采样16倍
  • 采样完成后,右移2位得到最终结果

代码实现:

// 过采样示例:16倍过采样,得到14位有效数据
uint16_t oversample_current(uint16_t *buf, uint8_t len)
{
    uint32_t sum = 0;
    for(uint8_t i = 0; i < len; i++)
    {
        sum += buf[i];
    }
    return (uint16_t)(sum >> 2);  // 右移2位,相当于除以4
}

注意:过采样不是万能的。它只能降低白噪声,对周期性干扰(比如PWM开关噪声)效果有限。我曾经在一个项目中,过采样到32倍还是抖得厉害,最后发现是采样时刻没选对。

4.4 采样窗口对齐:PWM与ADC的“约会”

这是整个ADC采样中最容易出问题的地方。你想想看,PWM在开关管导通和关断的瞬间,电流波形会有很大的尖峰。如果你刚好在那个时刻采样,得到的数据就是错的。

正确的做法是:在PWM载波的中心时刻采样。为什么?因为此时开关管处于稳定导通状态,电流纹波最小,采样值最接近真实值。

具体实现:

  1. 配置定时器的TRGO事件,在PWM中心点触发
  2. ADC注入组使用这个TRGO作为触发源
  3. 设置合适的采样保持时间,确保信号稳定

我曾经踩过一个坑:采样窗口太窄,只有1个ADC时钟周期。结果每次采样都刚好落在开关噪声上,电流波形像锯齿一样。后来把采样时间加到3个周期,问题就解决了。

采样窗口对齐的时序图(文字描述):

PWM载波:  /‾‾‾‾‾\____/‾‾‾‾‾\____/‾‾‾‾‾\____
采样触发:       ↓           ↓           ↓
采样窗口:   [====]       [====]       [====]
重要:如果你使用三电阻采样,三个相电流的采样窗口必须严格对齐。否则计算出的电流矢量会有相位误差,导致转矩波动。我见过有人因为采样窗口没对齐,电机在低速运行时嗡嗡响。

4.5 实战中的避坑指南

最后,分享几个我这些年总结的经验:

  • 采样电阻的温漂:铜的温漂是3900ppm/°C,工作温度从25°C升到85°C,电阻值变化23%。所以一定要用低温漂的锰铜或康铜电阻。
  • ADC参考电压:不要直接用3.3V供电作为参考。用专门的参考电压芯片(比如REF3033),精度能提高一个数量级。
  • 软件滤波:硬件滤波做完了,软件还要补一刀。我习惯在电流环里加一个一阶低通滤波,截止频率设为电流环带宽的5倍。
  • 校准:每次上电后做一次ADC偏移校准。因为运放的零漂会随温度变化,不校准的话,低速时会有明显的电流偏置。

嗯,ADC采样这部分内容就讲到这里。下一章咱们聊聊电流环的软件实现,到时候你会看到,采样做得好,后面的控制算法写起来有多顺畅。