4、运放与信号调理电路:差分放大器、共模抑制比(CMRR)、偏置电压对采样精度的影响,实战中如何校准零点漂移
各位做电机驱动的朋友,咱们接着聊电流采样。上一章讲了采样电阻和霍尔传感器的选型,但有个问题我一直想强调:传感器出来的信号,几乎不可能直接送给STM32的ADC。为什么?因为信号太弱、噪声太大、共模电压太高。
这时候就需要运放和信号调理电路上场了。说白了,它们就是信号的“翻译官”和“清洁工”。今天我就把这块掰开了讲清楚,尤其是那些让你采样精度翻车的坑。
核心观点:电流采样的精度,80%取决于运放电路的设计,20%取决于ADC本身。很多工程师花大价钱买高精度ADC,却在运放上省成本,结果采样数据一塌糊涂。
4.1 差分放大器:为什么单端采样不行?
先看一个常见场景。你在电机相线上串了一个10mΩ的采样电阻,两端电压可能是±50mV。这个电压相对于电机母线(比如24V或48V)来说,简直是“浮在高压上的小信号”。
如果用单端放大器去采,参考地是GND,那你要放大的不仅是50mV的差模信号,还有24V的共模电压。结果就是:放大器饱和,ADC烧毁。
差分放大器就是来解决这个问题的。它只放大两个输入端的差值,对共模电压说“不”。
最基本的差分电路长这样:
Vout = (R2/R1) * (V+ - V-)
但这里有个陷阱——电阻匹配精度。我见过一个项目,用了1%精度的电阻做差分,结果共模抑制比直接掉了40dB。你想想看,本来能抑制1000倍的共模信号,现在只能抑制10倍,那采样还能看吗?
我的习惯:差分放大器的四个电阻,要么用0.1%的精密电阻,要么直接用集成差分放大器芯片。别在这上面省钱,省下的钱都会变成调试时间赔进去。
4.2 共模抑制比(CMRR):被忽视的关键指标
CMRR,全称Common Mode Rejection Ratio,中文叫共模抑制比。它的物理意义很简单:放大器对共模信号的抑制能力。
公式长这样:
CMRR = 20 * log10(Adm / Acm)
其中Adm是差模增益,Acm是共模增益。CMRR越高,说明放大器越“无视”共模电压。
咱们算笔账。假设电机母线电压是48V,采样电阻两端差模信号是50mV,你用了增益50倍的差分放大器:
- 理想情况下,输出应该是50mV × 50 = 2.5V
- 但如果CMRR只有60dB(即1000倍),共模电压48V会被等效成48V/1000 = 48mV的差模误差
- 48mV × 50 = 2.4V的误差!这比真实信号还大
看到问题了吧?CMRR不够,采样就是猜数字游戏。
| CMRR值 | 抑制倍数 | 48V共模等效误差(输入) | 适用场景 |
|---|---|---|---|
| 40 dB | 100 | 480 mV | 基本不能用 |
| 60 dB | 1000 | 48 mV | 低压系统勉强 |
| 80 dB | 10000 | 4.8 mV | 24V系统可用 |
| 100 dB | 100000 | 0.48 mV | 48V系统推荐 |
| 120 dB | 1000000 | 0.048 mV | 高精度伺服 |
我曾经踩过的坑:选了一款标称CMRR 90dB的运放,但没注意测试条件。实际在10kHz开关频率下,CMRR掉到了55dB。后来查手册才发现,那个90dB是在直流下测的。高频下CMRR会急剧下降,选型时一定要看datasheet里的CMRR vs Frequency曲线。
4.3 偏置电压:零点漂移的元凶
偏置电压(Vos),是运放输入端的“固有误差”。理想运放输入为0时输出为0,但实际运放总有一个小电压偏置。
对于电流采样来说,这个偏置电压会被增益放大,直接表现为零点漂移。比如:
- 运放Vos = 1mV
- 增益 = 50倍
- 输出端零点漂移 = 1mV × 50 = 50mV
- 对应到采样电阻端,相当于50mV / 50 = 1mV的“假电流信号”
如果采样电阻是10mΩ,1mV的误差相当于100mA的电流误差。对于FOC控制来说,这个误差足以让电机在零速时抖动、产生转矩脉动。
偏置电压还受温度影响,这就是温漂。一般运放的温漂在几个μV/°C到几十μV/°C之间。从25°C升到85°C,60°C温差可能带来几mV的额外漂移。
选型建议:对于电机电流采样,建议选择Vos < 100μV、温漂 < 1μV/°C的运放。比如TI的INA240、ADI的AD8418,都是专门为电机电流采样设计的。
4.4 实战:如何校准零点漂移
好了,理论说完了,咱们来点实际的。不管你用多好的运放,零点漂移都不可能完全消除。所以,校准是必须的。
我常用的校准方法分两步:硬件调零和软件补偿。
4.4.1 硬件调零
在运放的同相输入端加一个可调偏置电压,通过电位器或DAC来抵消Vos。电路结构如下:
// 伪代码:硬件调零流程
1. 断开电机电源,确保采样电阻两端无电流
2. 用万用表测量运放输出
3. 调节电位器,使输出尽可能接近0V
4. 锁定电位器
但这个方法有个问题——温度一变,漂移又回来了。所以硬件调零只能作为粗调。
4.4.2 软件补偿(推荐)
这才是工程上最实用的方法。STM32上电后,先做一次“零电流校准”:
// 软件零点校准示例
#define ADC_SAMPLES 64
uint32_t zero_offset = 0;
void calibrate_zero_offset(void)
{
uint32_t sum = 0;
// 确保此时电机处于停止状态,无电流流过采样电阻
for(int i = 0; i < ADC_SAMPLES; i++)
{
sum += ADC1->DR; // 读取ADC原始值
}
zero_offset = sum / ADC_SAMPLES; // 计算零点偏移
}
// 实际采样时减去偏移
int32_t get_current_raw(void)
{
uint32_t adc_val = ADC1->DR;
return (int32_t)adc_val - (int32_t)zero_offset;
}
我建议:每次电机启动前都做一次零点校准。如果系统不允许停机校准,可以在电机过零(电流自然过零点)时动态更新偏移值。我在一个伺服项目里就是这么做的,效果很好。
4.4.3 温度补偿(进阶)
如果系统工作温度范围很宽(比如-40°C到+85°C),单点校准就不够了。这时候需要做多点温度校准:
- 在不同温度下记录零点偏移值
- 建立温度-偏移曲线(一般是线性或二次拟合)
- 运行时读取板载温度传感器,查表或计算当前偏移
这个方法的代价是增加了一个温度传感器和校准工序,但对于高精度应用来说,值得。
4.5 信号调理电路整体架构
把上面这些串起来,一个完整的电流采样信号链应该是这样的:
4.6 实战中的几个坑
最后,分享几个我在项目中真实遇到过的坑,希望能帮你少走弯路。
坑1:PCB布局导致CMRR劣化
差分信号的两根走线长度不一致,或者没有包地,会导致共模信号转换成差模信号。我曾经一个板子,就因为差分线走了不同的层,CMRR从80dB掉到了50dB。后来改成同层等长走线,问题解决。
坑2:电源纹波耦合进运放
运放的电源抑制比(PSRR)在高频下也会下降。如果开关电源的纹波直接耦合到运放供电端,会在输出端产生噪声。我的做法是:运放供电加LC滤波,或者用线性稳压器单独供电。
坑3:ADC采样时序与PWM同步
这个放到后面章节细讲,但提前说一句:不要在MOS管开关瞬间采样,那时候噪声最大。一定要把采样窗口对准电流平稳的区域。
好了,关于运放和信号调理电路,今天就聊这么多。记住一句话:电流采样的精度,是设计出来的,不是调试出来的。前期把电路设计好,后面能省90%的调试时间。