做嵌入式硬件这几年,我最常被问到的电路里,“电流检测”绝对排得进前三。不管是电池供电的手持设备,还是电机驱动板、电源监控模块,几乎都要用到“小电流采样-运放放大-ADC读取”这条链路。而当我推荐用LMV321这类通用低压运放去搭低成本电流检测电路时,很多人第一反应是“这玩意儿能行吗”。其实不仅能行,只要把采样电阻和放大倍数算明白,稳定性和精度完全够用,成本还能压到一两块钱以内。这篇文章我就拿一个实际设计来走一遍完整流程,采样电阻怎么选、放大倍数怎么推导、LMV321的边界在哪里、MATLAB仿真文件怎么写,最后再分享几个调试现场踩过的坑。
这套方案特别适合三类人:一是正在做低功耗产品、不想为了电流检测专门加专用芯片的工程师;二是刚开始接触运放电路、想搞清楚“电阻到底怎么算”的学生;三是想把现有电流检测精度再抠一抠的嵌入式硬件老兵。下面直接开整。
1. 方案选型:为什么是LMV321,采样点放在哪
1.1 LMV321这颗运放凭什么合适
LMV321是TI出品的一颗单通道、低功耗、轨到轨输入输出运放,供电范围大概在2.2V到5.5V之间,典型静态电流只有130μA左右。这几个参数放在一起,基本就是为电池供电设备量身定做的。很多手持设备主控是3.3V或者3.0V供电,ADC参考电压就取电源,后端根本没有多余的负压源,这时候就需要运放能单电源工作、能在接近电源轨的范围内输出。LMV321输出级是轨到轨,理论上可以很靠近地端和电源端,虽然实际上还差几毫伏到十几毫伏,但已经足够用了。
和专用电流检测放大器相比,通用运放最大的优势是灵活。专用芯片像INA180这种,内部增益是出厂定死的,50倍就是50倍,100倍就是100倍,你没法自己调。你项目里最大电流变了,采样电阻就得跟着变,但采样电阻一变信号幅度又可能不合适。用LMV321做同相放大,外面两颗电阻就把增益定了,想改成多少倍就改多少倍,哪怕后期改版,只动一个电阻就行,不用换芯片、不用改PCB。另一层优势是成本,一颗LMV321在批量时的价格比专用电流检测放大器低不少,这也是很多消费电子产品里大量使用它的原因。
不过这颗运放也有自己的脾气,最典型的就是失调电压。LMV321的Vos典型值大约1mV,最大值可以到4.5mV左右。你可能觉得1mV毫不起眼,但放大倍数一上去,这个1mV会被一起放大。假设你设计增益是100倍,那输出端就有100mV的直流偏移,再把满量程输出电压一除,误差就很可观了。这个点后面算误差预算的时候再展开,但选型时心里要先有数。
1.2 低边、高边和下桥:三种采样位置怎么选
电流检测电路结构上看起来简单,核心就是把电流变成电压,然后放大。但采样电阻往哪里放,直接决定了整个电路的设计难度。我实际做过的项目里,最常见有三类位置:低边采样、高边采样,以及电机控制里非常典型的“下桥电阻采样”。
所谓低边采样,是把采样电阻放在负载和系统地之间,电流流过负载后,先经过采样电阻再到地。这种做法的最大好处是运放输入端的共模电压很低,基本在0V附近,单电源运放很容易处理,LMV321可以直接上场。而且低边采样对后端的ADC没有过高要求,电路结构最简单、最容易调通。
高边采样是把采样电阻放在电源正端和负载之间。这样采样电阻上的压降和系统电源的共模电压叠加在一起,运放输入端可能同时顶着12V、24V甚至更高的电压。LMV321工作电压最高5.5V,显然不能直接接,这时就得用电阻分压、电平移位或者其他专用高边电流检测芯片。所以如果你做的是低压3.3V或者5V设备,LMV321做高边是可行的,只要共模电压不超过电源范围;一旦系统电压超过5.5V,通用低压运放方案就玩不转了。
下桥电阻采样常见于电机驱动和开关电源里。采样电阻串在下桥MOSFET的源极和功率地之间,PWM导通时电流从采样电阻流过,PWM关断时电流走续流回路。这种做法的好处是没用高边电流检测芯片也能看电机相电流,但问题在于采样波形是断续的,而且采样电阻串在功率回路里,对PCB布局和采样时机都有要求。后面第5部分我会专门讲这块的注意事项。
1.3 先定设计要求,再来反推参数
任何电路设计都应该从指标倒推。我在做这个示例方案时先设定了四个设计目标:
- 最大被测电流 Imax = 1A
- ADC参考电压 Vref = 3.3V
- 满量程输出目标 Vout_max = 2.8V(给ADC留出10%余量,防止过采样)
- 系统整体精度目标 ≤2%
有了这四个指标,采样电阻和增益就不再是拍脑袋定的了。后面两章就是围绕这组指标一步步做计算。这里先提个醒:ADC参考电压直接取3.3V供电时,3.3V本身可能是有波动的,尤其是电池供电场景,电池电压会随放电慢慢降低。如果你对精度有更高要求,建议用独立基准源或者带内部基准的ADC,否则运放放大倍数再准,ADC参考一变,读回来也是错的。本项目里先用3.3V固定值做设计,严谨一点还得检查电源纹波和负载调整率。
2. 采样电阻:先算阻值,再选封装
2.1 阻值的第一层约束:信号不能太小
采样电阻的阻值选择有两个方向相反的约束:阻值大,采样信号强,运放放大后信噪比好,但功耗和发热也大;阻值小,发热小、压降低,但信号太弱,运放的失调电压、噪声都会被放大出来。
先算信号侧的账。如果按Imax=1A、用2mΩ采样电阻,最大压降是:
Vsense_max = Imax × Rs = 1A × 0.002Ω = 2mV
要把这2mV放大到2.8V,需要的增益是:
G = Vout_max / Vsense_max = 2.8V / 0.002V = 1400倍
这个增益放在单级运放上基本是不可用的。LMV321的增益带宽积只有1MHz,1400倍留给闭环带宽只剩700Hz左右,而且1mV失调电压放大1400倍就是1.4V,直接把自己的满量程占掉一半,这电路根本没法用。
所以低阻值不是不行,而是你得先接受高增益带来的副作用。如果把这2mV信号放大140倍到280mV,ADC在3.3V满量程下只能用到8.5%的量程,分辨率损失太多。结论就是:低边采样里,采样电阻尽量往大选,让运放放大倍数保持在100倍以内是比较舒服的范围。
2.2 把阻值换算成功率预算
用Imax=1A继续算。为了保证信号够强,我实际在这个例子里先选Rs=0.01Ω,即10mΩ。最大压降:
Vsense_max = 1A × 0.01Ω = 10mV
需要的增益:
G = 2.8V / 0.01V = 280倍
280倍虽然比1400倍好点,但单级还是偏高。于是我再往上提采样电阻,选Rs=0.05Ω,50mΩ。最大压降变成50mV,增益变成:
G = 2.8V / 0.05V = 56倍
56倍对通用运放来说很舒服。此时采样电阻功耗:
P = Imax² × Rs = 1A² × 0.05Ω = 50mW
50mW对0805贴片电阻来说非常轻松,甚至0603也能承受。所以从散热角度完全没问题。
再来一档:如果项目最大电流是5A,仍然用50mΩ,功耗就会变成5² × 0.05 = 1.25W,普通贴片电阻根本顶不住,这时候就必须用2512大封装甚至功率电阻,或者干脆把阻值降下来。所以采样电阻阻值选择其实是一个“信号幅度”和“功耗体积”的折中,大电流时优先压功耗,小电流时优先保信号。
2.3 精度、温漂和电阻类型
采样电阻阻值定了以后,下一个问题是电阻自身精度。常见的贴片电阻精度有1%、0.5%、0.1%,温漂性能差别也很大。普通厚膜电阻温漂可能到100ppm/°C甚至200ppm/°C,而合金电阻或者精密薄膜电阻可以做到50ppm/°C以下。
算一笔温漂的账:如果环境变化40°C,采样电阻是50ppm/°C,那阻值变化就是:
50ppm/°C × 40°C = 2000ppm = 0.2%
这个误差虽然不小,但还在可以接受的范围内。如果换成200ppm/°C的普通贴片电阻,40°C温升就是0.8%的阻值漂移,这个直接进增益误差,是最难补的。所以电流检测电路里,采样电阻真心不建议用普通厚膜电阻,最好选锰铜合金、康铜合金或贴片合金电阻。这些电阻本身温漂小,通过大电流时自己发热导致的阻值变化也小。预算再高一点,可以直接选四线开尔文结构的采样电阻,这种电阻自带独立的采样引脚,能避开大电流端子的接触电阻误差。
2.4 布局里的开尔文接法
采样电阻阻值小,焊盘引脚和走线的电阻就不能忽略。一个普通PCB过孔和一段几十毫米的走线,阻值可能在10mΩ到50mΩ之间,这要是和采样电阻一个量级,那采出来的电压就完全说不清了。
解决办法是开尔文接法,也叫四线接法。大电流从采样电阻两端主焊盘进出,而采样引线单独从电阻两端的感测点上引出,尽量不共享大电流路径。这样采样引线上几乎不流过电流,引线上的压降可以忽略,运放采到的就是采样电阻本体两端的真实压降。很多人第一次画低边采样电路,直接把运放输入接在采样电阻的焊盘上就完事,结果大电流路径上的压降全被一起采进去了,波形乱七八糟。这个坑我早期踩过,后面会再强调。
3. 放大倍数计算与LMV321电路设计
3.1 同相放大电路增益公式推导
采样电阻两端的电压是差分信号,但低边采样时其中一端直接接GND,所以可以很自然地把采样信号接成单端,送到运放的同相输入端。常规电路结构如下:采样电阻输出端接运放同相输入IN+,反相输入IN-通过电阻Rg接地,再通过反馈电阻Rf接到运放输出端。这个就是最经典的同相放大电路。
负反馈稳定后,运放输入端满足“虚短”,即IN+电压约等于IN-电压。设采样电压为Vsense,则IN+是Vsense。由于运放输入阻抗极高,流入运放输入引脚的电流可以忽略,所以流过Rg和Rf的电流相同。根据分压关系:
V- = Vout × Rg / (Rg + Rf)
由虚短得到:
Vsense = Vout × Rg / (Rg + Rf)
两边整理:
Vout = Vsense × (1 + Rf / Rg)
这就是同相放大器的增益公式,实际增益就是1加上反馈电阻比。比如Rf=56kΩ、Rg=1kΩ,增益就是57倍。很多初学者会把公式记成“Rf除以Rg”,最后算出来的增益和实际电路差一个“1”,导致输出比预期低一点。注意这点,别在这个细节上翻车。
3.2 增益取值不是越大越好
前面用Rs=0.05Ω算出了需要的增益是56倍。那是不是增益越大越“能放大”?当然不是。增益越大,意味着运放的闭环带宽越小,因为增益带宽积是固定的。LMV321的GBW约1MHz,闭环-3dB带宽大约等于:
BW_closed = GBW / G
增益56倍时,带宽约17.9kHz。对低频电流监控来说这足够;如果只是监测电池放电电流,几赫兹到几百赫兹就够用了。但如果要采样电机PWM波形的瞬时电流,PWM频率可能是20kHz,那这个带宽就不够看,得降低增益或者换更高GBW的运放。
增益大还有一个麻烦,就是失调电压被同步放大。按LMV321典型Vos=1mV算,56倍增益下输出端直流偏移:
Vos_out = 1mV × 56 = 56mV
相对满量程2.8V,这个偏移占比是:
56mV / 2800mV ≈ 2%
也就是说,即使输入电流为0,ADC也能读到大约2%满量程的读数。这在很多消费类产品里勉强能接受,但如果你想做1%精度,这个偏移就必须处理。软件校准可以消掉它,但前提是你知道这个偏移存在,而不是莫名其妙地以为电路坏了。
3.3 输出摆幅、负载驱动与带宽余量
LMV321虽然叫轨到轨输出,但“轨到轨”不是精确等于电源轨,从数据手册看,输出到地或者到电源的饱和压降大约在5mV到15mV量级。设计时一定不要把满量程卡在电源轨上,否则ADC可能永远采不到满量程,还可能出现非线性区。所以我前面设计目标里留了10%余量,满量程输出只用到2.8V而不是3.3V,这是从实践中来的经验。
输出驱动能力也得看负载。如果ADC内部采样保持电容比较大,或者输出走线很长,运放直推会不够稳,严重的会出现振荡或者建立时间太长。我的习惯是在运放输出到ADC之间串一个小电阻,比如100Ω,再对地并联一个1nF到10nF的电容,组成一个低通滤波,既滤掉高频噪声,又给ADC提供一个低阻抗源。这个RC会影响信号带宽,时间常数要算一下,别随手选个100nF就把信号全滤没了。
3.4 输入端偏置和RC滤波
LMV321是CMOS输入,输入偏置电流非常小,可以认为是pA级,所以不用太担心偏置电流流过采样电阻造成额外压降。但输入端串联电阻如果太大,偏置电流流过它就会产生一个偏移电压。LMV321这样低偏置电流的运放倒是不怕,但如果你换成某些双极型运放,几十nA的偏置电流流过100kΩ电阻,会产生几毫伏的误差,那就不能忽略了。
输入端RC滤波的作用主要是滤除高频噪声和采样开关噪声。比如PWM电机驱动环境里,开关噪声可能非常高,如果直接进运放,放大以后全是毛刺。可以在运放同相输入端加一个RC低通,R取1kΩ到10kΩ,C取1nF到100nF。需要平衡滤波效果和信号带宽,RC截止频率不能低于你关心信号频段的最高频率,不然会失真。
4. MATLAB辅助设计与仿真
4.1 参数计算脚本:一秒钟出结果
很多人做电路设计还在用Excel甚至手算,其实用MATLAB写一小段脚本,参数一改就能看结果,省事很多。下面这段脚本就是我在这个方案里用的参数计算工具,输入Imax、采样电阻、ADC参考电压,它会自动算出增益、功耗、带宽、失调误差等关键数据。
% Current sensing parameter calculator for LMV321 clear; clc; % User parameters Imax = 1.0; % Maximum load current, A Rs = 0.05; % Sensing resistor, ohm Vref = 3.3; % ADC reference voltage, V headroom = 0.1; % Output headroom, 10% GBW = 1e6; % LMV321 gain-bandwidth product, Hz Vos = 1e-3; % LMV321 typical offset voltage, V % Calculation VoutMax = Vref * (1 - headroom); % target full-scale output VsenseMax = Imax * Rs; % max sensing voltage G = VoutMax / VsenseMax; % required gain P_Rs = Imax^2 * Rs; % sensing resistor power BW = GBW / G; % closed-loop bandwidth offsetErr = (Vos * G) / VoutMax * 100; % offset error in % % Display fprintf('Vsense max : %.2f mV\n', VsenseMax * 1e3); fprintf('Required G : %.2f V/V\n', G); fprintf('Resistor P : %.2f mW\n', P_Rs * 1e3); fprintf('Closed BW : %.2f kHz\n', BW / 1e3); fprintf('Offset err : %.2f %% of full scale\n', offsetErr);这段脚本的思路是把设计指标和器件参数分离。你改任意一个输入值,比如把Imax改成2A,或者把Rs改成10mΩ,脚本会立刻告诉你增益、带宽、失调误差会怎么变,比在纸上反复估算快得多。顺手还可以把运行结果拷到项目记录里,作为设计评审的依据。
4.2 最坏情况误差分析:用蒙特卡洛看风险
光算一个“典型值”是不够的,实际批量生产里电阻有容差、运放的失调电压有离散性,我们需要知道最坏情况下的误差有多大。用MATLAB可以做一个简单的蒙特卡洛仿真,模拟10000个样本,假设采样电阻精度1%、温漂50ppm/°C、运放失调电压按正态分布,最后输出误差分布。
% Monte Carlo worst-case error analysis rng(2025); N = 10000; r_tol = 0.01; % resistor tolerance temp_drift = 50e-6 * 40; % temperature drift over 40 degC Vos_std = 1.5e-3; % offset voltage std-dev G_nominal = 56; VoutMax = 2.8; % random variables G_mc = G_nominal * (1 + (r_tol + temp_drift) * randn(N, 1)); Vos_mc = Vos_std * randn(N, 1); % output error in volts err_mc = Vos_mc .* G_mc; err_percent = err_mc / VoutMax * 100; fprintf('Offset error mean: %.2f%%\n', mean(err_percent)); fprintf('Offset error 99th percentile: %.2f%%\n', prctile(err_percent, 99));这个脚本没有模拟到所有误差源,比如反馈电阻的比值失配也没加进去,但已经足够说明问题:如果你不做任何校准,光运放失调这一项项就可能吃掉好几个百分点的精度。所以量产时要么选低Vos档的运放,要么在出厂测试里做一次软件校准,或者两种一起上。
4.3 用Simulink搭电路模型验证
如果你的项目里还要验证整个控制环路的联动,不只想看静态参数,可以用Simulink搭一个简化的电机电流采样模型。模型里用一个受控电流源模拟负载电流,一个电阻接成采样网络,再用一个增益模块代表LMV321同相放大,最后接个一阶低通滤波模块模拟ADC前端的RC。改变PWM占空比输入,就能看到采样电压和运放输出电压的波形,同时也能观察到RC滤波造成的延迟和幅值衰减。
这个模型的好处是能把真实系统的开关纹波、滤波影响直观呈现出来。比如20kHz的PWM,你选1kΩ和1nF的RC,时间常数为1μs,截止频率约159kHz,基本不影响20kHz的纹波测量;但如果选1kΩ和100nF,截止频率就掉到1.6kHz,20kHz的PWM纹波会被大幅衰减,结果看电流平均值还行,看瞬时电流就会错很大。这种取舍在Simulink里几分钟就能验证,不用动硬件。
4.4 关于MATLAB版本和中文注释的一个小坑
用MATLAB做这类仿真时,很多国内工程师习惯把注释写成中文,结果2023或者更早的一些版本里,默认编码如果不是UTF-8,新建的.m文件里的中文经常变成乱码。我也遇到过,解决办法是在MATLAB主页的“预设项”里把文件编码设置成UTF-8,或者干脆像我上面那样全用英文注释。更省事的方法是:写完脚本后另存为UTF-8格式,下次打开就不容易乱。另外,MATLAB正版授权是硬性的,学生朋友可以用校园版,学习目的的轻量脚本其实也可以用GNU Octave,它和MATLAB语法高度兼容,跑我上面的脚本基本不用改,拿来练手足够了。
5. 实测、校准和常见问题排查
5.1 一张实际测试数据表
理论算得再漂亮,最后还是得用万用表或者示波器验证。我按Rs=0.05Ω、G≈56倍搭了一块测试板,用可编程电子负载从0到1A逐点加电流,ADC用万用表直接测量运放输出电压,得到一组实测数据:
| 输入电流(A) | 理论输出(V) | 实测输出(V) | 绝对误差(mV) | 折合误差(%) |
|---|---|---|---|---|
| 0 | 0 | 0.023 | 23 | — |
| 0.2 | 0.56 | 0.578 | 18 | 3.2% |
| 0.4 | 1.12 | 1.139 | 19 | 1.7% |
| 0.6 | 1.68 | 1.691 | 11 | 0.7% |
| 0.8 | 2.24 | 2.246 | 6 | 0.3% |
| 1.0 | 2.80 | 2.791 | -9 | -0.3% |
看数据可以发现:零电流时输出并不是0V,而是23mV,这就是运放失调电压被放大后的结果。随着电流增大,相对误差反而变小,这说明失调电压是一个固定偏移,不是增益性的比例误差。这种固定偏移很适合用软件方式校准,减掉一个零点值就能解决大半问题。
5.2 两点校准法
对低成本电流检测方案,我最推荐的校准方法是“两点线性校准”,不需要昂贵的标定设备,只需要一个能输出已知电流的直流源。第一步,不给负载加电流,记录ADC读数zero_code;第二步,通入一个接近满量程的已知电流I_cal,记录ADC读数cal_code。然后按照两点确定一条直线,得出实际电流的计算公式:
I = offset + slope × ADC_code
这个斜率其实综合标定了采样电阻阻值、运放增益和ADC参考电压的乘积;截距则主要来自运放失调电压。实际写入固件时,用这个公式把这个系数存到EEPROM或者Flash里,每一台产品出厂前做一次标定,比只靠硬件精度省了不少成本。很多仪表类产品都是这么干的。
这里有个经验:零点校准要在系统正常上电、运放稳定几分钟之后再做。LMV321功耗低,发热小,但任何运放通电后芯片温度都会微微上升,失调电压也随之稍微漂移。刚上电就校零,可能半小时后零点又偏了几个毫伏。我自己的习惯是通电预热3到5分钟再校准,虽然慢一点,但稳定效果好。
5.3 常见问题速查表
实际项目中,电流检测电路出问题其实非常共性。我把这几年遇到的和朋友问过的问题整理成一个速查表,方便大家按图索骥。
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 输出一直接近电源轨 | 运放同相输入端悬空、采样电阻开路、反馈电阻虚焊 | 先测运放输入引脚电压,再测供电,排除接触不良 |
| 输出一直0V且不随负载变 | 运放输入接反或虚焊、ADC引脚配置错误 | 万用表直接测运放输出引脚,确认是否运放根本没输出 |
| 带电机或PWM负载读数跳动巨大 | 采样点离功率回路太近、没有加RC滤波 | 在运放输入端加RC低通,采样引线改成开尔文接法 |
| 输出信号叠加大幅毛刺 | PWM开关噪声通过地线或寄生电容耦合 | 改善PCB布局,采样地要单点接地,避免与功率地共用走线 |
| 输出自激振荡 | 运放输出驱动容性负载过大,或者反馈走线太长 | 输出串一颗100Ω小电阻,反馈电阻尽量靠近运放引脚 |
| 零点偏移过大 | 运放失调电压被放大、采样电阻两端焊锡接触引入了热电势 | 软件校准零点,改用低Vos运放,检查焊接质量 |
| 接上ADC后读数比空载低 | 运放驱动能力不足,ADC采样保持网络拉垮了输出 | 运放输出到ADC之间加缓冲电阻并联电容,或者用RC隔离 |
5.4 下桥PWM采样里的特殊注意事项
如果你的电路是电机控制里的下桥采样,除了上面这些通用问题,还要额外注意几点。首先,采样电阻上的电压只在PWM导通期间存在,PWM关断时负载电流走续流回路,不经过采样电阻,所以根本测不到。别指望它像线性负载那样输出一个平滑的电流波形。
其次,采样电阻放在功率地回路里,同时它也承担了大电流回流路径。阻值不能选太大,否则会在MOSFET源极上叠出一个很高的对地电位,导致栅极驱动电压不足。比如下桥采样电阻选了0.05Ω,通10A电流时就有500mV压降,源极被抬到0.5V,栅极驱动电压相对源极就少了0.5V余量,驱动不足就可能发热或者烧管。
再次,采样时机很重要。PWM开通瞬间,MOSFET导通会有米勒平台和振铃,那个时间段测出来的电流完全不可信。正确做法是等开关稳定之后再采样,很多MCU的ADC都支持PWM中心对齐触发,把采样安排在PWM中心时刻,能避开开关边沿的噪声。如果MCU不支持,也可以在采样电路上加一个RC滤波器,时间常数设为开关周期的几分之一,把开关纹波平均掉。不过RC滤波会损失电流的快速变化信息,做无刷电机换相判断时要特别注意。
最后还有一点容易被忽略:下桥采样电阻上的压降虽然小,但它也是“悬浮”在功率地回路里的。采样电阻两端应该用差分走线直接连到运放输入,不要让采样引线和大电流走线串在一起,更不能让采样引线绕一大圈经过MCU再回到运放。我见过一个同事把采样引线走了十几厘米,结果测出来的不是电阻压降,而是整块板子上的地噪声,折腾了一下午才发现是走线问题。
结尾:一个小小的量产经验
如果让我给一个最重要的建议,那就是:采样电阻和增益参数算完之后,一定不要直接开批量,先焊几块板实测一遍,尤其是把温度和环境电磁噪声因素考虑进去。我吃过一次亏,用公式算出来好好的,结果产品放到工业现场就出现读数跳变,最后查下来是采样电阻开尔文接法没做好,大电流走线的压降全部耦合到运放输入。后来把采样电阻的四线接法落到PCB布局规范里,问题再没出现过。希望这篇文章能帮你少走这段弯路。