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;
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载波的中心时刻采样。为什么?因为此时开关管处于稳定导通状态,电流纹波最小,采样值最接近真实值。
具体实现:
- 配置定时器的TRGO事件,在PWM中心点触发
- ADC注入组使用这个TRGO作为触发源
- 设置合适的采样保持时间,确保信号稳定
我曾经踩过一个坑:采样窗口太窄,只有1个ADC时钟周期。结果每次采样都刚好落在开关噪声上,电流波形像锯齿一样。后来把采样时间加到3个周期,问题就解决了。
采样窗口对齐的时序图(文字描述):
PWM载波: /‾‾‾‾‾\____/‾‾‾‾‾\____/‾‾‾‾‾\____
采样触发: ↓ ↓ ↓
采样窗口: [====] [====] [====]
4.5 实战中的避坑指南
最后,分享几个我这些年总结的经验:
- 采样电阻的温漂:铜的温漂是3900ppm/°C,工作温度从25°C升到85°C,电阻值变化23%。所以一定要用低温漂的锰铜或康铜电阻。
- ADC参考电压:不要直接用3.3V供电作为参考。用专门的参考电压芯片(比如REF3033),精度能提高一个数量级。
- 软件滤波:硬件滤波做完了,软件还要补一刀。我习惯在电流环里加一个一阶低通滤波,截止频率设为电流环带宽的5倍。
- 校准:每次上电后做一次ADC偏移校准。因为运放的零漂会随温度变化,不校准的话,低速时会有明显的电流偏置。
嗯,ADC采样这部分内容就讲到这里。下一章咱们聊聊电流环的软件实现,到时候你会看到,采样做得好,后面的控制算法写起来有多顺畅。