☰
电流采样链路深度解析:从差分放大到ADC采集的实战指南
2026/10/3 11:12:44 网站建设 项目流程

电流采样这活儿,表面上看就是把一个电阻两端的电压量出来,但真正动手做过的人都知道,难点从来不在“量”,而在“准”。尤其是把差分放大器和ADC凑在一起之后,电路图看着简单,实测数据却往往让你怀疑人生:为什么空载时读出来有几百毫安的偏差?为什么电机一转,ADC数值就开始跳?为什么同一个板子换一颗运放,零漂就变了?这篇文章我打算把“采样电阻 → 差分放大 → ADC采集”这条链路从头到尾拆一遍,把共模电压、运放选型、RC滤波、采样周期、PCB布局、软件校准这些容易忽略的细节摊开讲。适合正在搞电机驱动、数字电源、电池管理系统、PFC这些工况的硬件和嵌入式工程师参考,刚入门的新手也能按着思路去查自己板子上的问题。

1. 先说清楚:电流采样为什么天生比电压采样难

很多人一开始会觉得,电流采样不就是欧姆定律,电阻两端测个电压嘛。真上手就发现,同样是用ADC,电压采样可以拿两个电阻分压直接怼进去,电流采样却很难这么干。原因不在采样电阻本身,而在信号所处的环境。

1.1 共模电压和微小差分信号,是一对天然矛盾

采样电阻上的有效信号,是两端之间的电位差。比如一颗10mΩ的采样电阻流过10A电流,差分电压只有100mV。这个100mV是“骑”在一个很高的共模电压上面的。低侧采样稍微好一点,共模电压接近功率地,但电机驱动或桥式电路在开关瞬间,地电位会剧烈跳动;高侧采样就更麻烦了,共模电压可能是母线电压,12V、24V乃至几百伏,你想要的差分信号却只有几十到几百毫伏。

普通ADC的地是信号地的“绝对参考”,它可不管你想要的是两端之差,它只认自己引脚对地的电压。所以直接把采样电阻两端引到ADC引脚,本质上就是拿一个微小差分信号去和很大的共模干扰打仗,结果几乎必然是被共模淹没。差分放大器在这里的核心作用,不是“放大”信号,而是先把共模电压减掉,只把差分电压放大。

我见过不少新手直接拿两个电阻分压衰减采样电阻电压再接ADC,这在实验室桌面电源上偶尔能跑,一到开关电源或电机驱动里,波形全是毛刺。原因就是分压网络没有共模抑制能力,功率地上的噪声会原封不动耦合进ADC。

1.2 宽动态范围让“增益”变得很难定

第二层麻烦是动态范围。电流采样经常要覆盖从几十毫安到几十安培。假设10mΩ电阻,0.5A电流只有5mV,这已经接近普通运放的失调电压水平;而30A电流时压降300mV,放大后又要不超过ADC参考电压。如果增益选大了,大电流时输出削顶;选小了,小电流时信噪比又不够。

所以设计一开始就要明确:你到底要量多宽的电流范围,精度指标是满量程的百分之几,还是要求小电流下也能分辨出毫安级变化。不同答案会导向完全不同的电路方案和运放选型。

1.3 功率地和信号地,天然会联手制造地弹噪声

第三个坑是“地弹”。功率回路上有大电流di/dt,任何PCB走线都有寄生电感,电流突变时就会在地线上感应出电压尖峰。采样电阻低侧端如果直接接在功率地和大电流路径上,ADC参考的地和这个功率地之间不可避免存在电位差。这个电位差虽然只有几十毫伏,但在100mV级的采样信号面前已经是巨大干扰。

因此电流采样电路的设计,从来不只是“选运放和电阻”,而是要同时解决共模、增益、地电位差和噪声抑制。下面的几个部分,我会按一条完整信号链的顺序逐个拆解。

2. 采样电阻选型与差分放大拓扑选择

电阻是整个采样链路的源头,源头不准,后面运放和ADC再好也白搭。这个环节的取舍,直接决定你能得到多大的信号、耗费多少功耗、以及高频噪声有多大。

2.1 毫欧级采样电阻:阻值、功率、温漂和感量怎么权衡

采样电阻阻值的选择,本质是在信号幅度和功耗之间找平衡。阻值越大,同样电流下压降越大,对运放和ADC越友好,但电阻上的功耗按电流平方往上涨。拿一个直流电机驱动举例,如果长期工作电流10A,你选一颗10mΩ电阻,压降100mV,功耗1W;如果选1mΩ,压降只有10mV,功耗0.1W,但你需要把增益提高10倍才能获得同样幅度的输出,这时运放失调、噪声的影响也会被放大10倍。

功耗对应的是温升,温升会带来阻值漂移。为了减小温漂,建议优先选低温度系数的合金电阻或锰铜类材料,常见的有开尔文四端封装,温度系数能做到50ppm/°C以内。你可能觉得50ppm不多,但如果电阻温升50°C,阻值变化就是0.25%,对精度要求高的场景已经不能忽略。

另一个容易忽略的参数是寄生电感。贴片电阻的引脚和内部结构在高频下会呈现感性,而采样电阻流过的是带有大量开关谐波的电流,寄生电感和di/dt相互作用会产生感应电压尖峰,直接叠加到差分信号上。做电机或者开关电源采样,采样电阻的感量要尽量小,同时后级差分放大器的输入端要加RC滤波来吸收这个尖峰。

这里我习惯的做法是:

参数主要影响建议
阻值信号幅度与功耗使满量程压降50~100mV,兼顾信噪比与温升
额定功率长时间过流下的稳定性至少留2倍以上余量
温度系数阻值随温度漂移尽量选50ppm/°C以下的合金电阻
寄生电感高频电流尖峰用四端开尔文封装或低感结构

2.2 低侧采样和高侧采样:共模电压决定拓扑

电流采样有两种常见接入位置。低侧采样把电阻放在负载和地之间,优点是共模电压低,差分放大器和ADC都好处理;缺点是采样电阻插入地回路,负载下端的电位不再是真正的0V,而且大电流地回路上的噪声会直接影响采样参考点。

高侧采样把电阻放在电源正端和负载之间,共模电压接近母线电压,对差分放大器的共模抑制能力要求高很多。但高侧采样不会干扰地回路,负载接地更干净,在汽车电子和电池管理里更常见。

如果只做低侧采样,普通的单运放差分电路也够用;一旦涉及高侧采样或者母线电压很高的系统,我建议直接用集成电流检测放大器,比如INA240、INA282这类。它们内部做好了电阻匹配和共模抑制,比你自己用四颗电阻搭差分电路可靠得多。这个选择会在下面展开。

2.3 分立差分放大器、仪表放大器和集成电流检测放大器怎么选

做了这么多年硬件,我面对“差分放大”这个词时第一反应不是某个电路,而是先问一句:这个“差分”到底靠什么实现?最常见的三种方案:

  • 分立运放+外部电阻搭成差分放大电路,成本低,但CMRR取决于外部四个电阻的匹配精度。
  • 仪表放大器,内部有三个运放,输入阻抗高、CMRR高,但价格贵,而且电流采样场景往往不需要那么高的输入阻抗。
  • 集成电流检测放大器,专为低侧/高侧电流采样设计,内置匹配电阻和滤波,性价比和可靠性最均衡。

单运放差分电路的CMRR直接受外部电阻匹配度限制。四个电阻都是1%精度时,最差情况下CMRR可能只有40~50dB,这对开关电源里的高共模环境是不够用的。不要以为放大器本身CMRR很高就万事大吉,外部电阻失配会把放大器的高CMRR拖垮。所以要么用0.1%精度的薄膜电阻,要么直接选集成方案。

仪表放大器在电流采样里略微有点“杀鸡用牛刀”。它的优势是高输入阻抗和精密匹配,但采样电阻本来就是低阻抗源,并不需要仪表放大器那么高的输入阻抗,而且价格贵不少。除非你需要在强共模环境下同时保持超高精度,否则性价比不高。

集成电流检测放大器这几年用得越来越多,尤其在FOC电机驱动里。以INA240为例,内部有精确匹配的差分网络和可调增益,还带有内部滤波,外部只需要接采样电阻和输出RC。这种方案把“差分放大”变成了一个器件选型问题,大大降低了调试难度。

2.4 从FOC电流采样看“差分放大”的实际姿态

FOC矢量控制里,电流采样的质量直接决定扭矩环能不能稳住。常见的FOC电流采样是把采样电阻放在逆变器下桥臂MOSFET的源极和功率地之间,三个桥臂逐次采样。这种低侧采样在PWM导通瞬间,采样电阻两端的电压会叠加下管开关产生的地弹噪声,所以除了差分放大,还必须靠采样时刻避开开关边沿,这个后面会专门讲。

这时候差分放大器的共模抑制能力、带宽和噪声特性就变得很关键。你会发现,FOC的电流采样不只是一个“放大电路”,而是整个控制环路的第一个环节,它的延迟、相位和噪声,都会体现在电机噪音和扭矩纹波上。这也是我为什么强调,差分放大器的带宽不能一味做高,也不能为了滤波把RC压得太低,否则采样到的电流波形会失真,后续角度估算和PI调节器都会跟着倒霉。

3. 差分放大电路参数计算与运放选型

参数计算是很多人的薄弱环节,因为拿到手的不是现成方案,而是“满量程30A、ADC是3.3V、采样电阻10mΩ”这种需求。下面我带一遍完整的计算思路,不套公式模板,直接按实际项目走。

3.1 增益怎么定:从满量程电流反推运放输出摆幅

假设一个双向电流采样需求,电流范围±20A,采用10mΩ采样电阻,ADC参考3.3V,希望差分放大器输出在0.15V~3.15V范围内,留出一点线性裕量。

满量程电流20A在10mΩ上产生±200mV的差分电压。要让输出在1.65V基础上摆动±1.5V,需要的增益是:

增益 = 输出电压幅度 / 输入电压幅度 = 1.5V / 0.2V = 7.5

所以外部电阻比例按7.5倍设计,或者选增益为8倍的集成电流检测放大器,输出范围会到1.65V ±1.6V,即0.05V~3.25V,依然在3.3V电源以内,ADC采样也没问题。选8倍的好处是电阻比例和芯片档位更标准,但要注意接近电源轨的线性度会下降,所以最好再留一点余量。

实际计算时还会遇到一个容易忽略的点:增益是信号通带内的增益,如果前端RC滤波和运放带宽交互,高频段增益会滚降。对电流采样来说这是好事还是坏事取决于应用。如果是平均值采样,可以故意把带宽压住,把开关纹波滤掉;如果是FOC电流环,需要保留电流波形的关键谐波,带宽要覆盖到PWM频率的基波和主要边带。

3.2 失调电压、温漂和CMRR:小数字背后的大误差

运放选型时大家喜欢看带宽、电源电压,却经常低估失调电压Vos和温漂。这里有个非常直接的换算:在10mΩ采样电阻上,1mV失调电压等价于100mA的电流误差。如果你的系统要求小电流时误差不超过50mA,那么一颗Vos为1mV的普通运放直接就不合格了。

所以电流采样运放必须选低失调、低温漂的类型,比如斩波稳零运放,Vos能做到微伏级;或者集成电流检测放大器,内部做了校准,Vos通常在几十微伏到几百微伏。以一颗Vos为0.25mV的运放为例,它在10mΩ电阻上造成的零电流误差是25mA,对大多数功率控制场景还能接受,但如果你要做0.1A级别的检测,这个误差就很明显。

CMRR的影响同样可以用等效电流误差来评估。假设你在一个母线电压24V的高侧采样场景,差分放大器的CMRR是100dB,那么共模电压折算到输入端的等效失调大约是:

24V / 10^(100/20) = 24V / 100000 = 0.24mV

这个0.24mV折算成电流误差只有24mA,可以接受。但如果CMRR只有80dB,等效失调就变成2.4mV,对应电流误差240mA,那就完全不能用了。这也是为什么高侧采样场景必须选择高CMRR的集成方案。

3.3 带宽、压摆率和输出驱动能力:放大器不是运放就够

增益定了,接下来看运放的带宽和压摆率。闭环带宽和增益之间存在固定关系,一个GBW为10MHz的运放,如果设定增益为8倍,闭环带宽大约只有1.25MHz。在设计差分放大电路时,带宽不需要比信号丰富太多,否则会把高频开关噪声也放大。常见的做法是把带宽控制在几百kHz到1MHz左右,让20kHz的PWM基波及其少量谐波通过,再靠后级RC滤掉高频尖峰。

压摆率决定了运放输出能不能跟上快速变化的输入。如果你需要1MHz带宽内输出3Vpp的信号,按正弦波估算,压摆率至少需要:

SR ≈ 2π × f × Vpk = 6.28 × 1MHz × 1.5V ≈ 9.4V/µs

实际选型时留出余量,选择20V/µs以上的运放比较稳。压摆率不够会导致输出出现类似失真的钝化波形,尤其在电机堵转或短路瞬间,采样信号变化很快,放大器如果“尿不尽”,ADC采到的就不是真实电流了。

运放的输出驱动能力也要注意。常规运放输出阻抗在闭环下很低,但驱动ADC内部采样电容时,瞬间需要一定的充电电流。很多精密运放输出级偏弱,带不动大容性负载,这时就需要在运放输出和ADC输入之间加RC缓冲,RC的电阻不宜过大,否则会在采样建立时间上“卡脖子”。这个点直接引到下一部分。

4. 从运放输出到ADC输入:RC滤波、采样周期与驱动能力

很多人把电路设计做到运放输出就停了,觉得ADC引脚往里一怼就行。实际上ADC输入是很挑剔的,它对源阻抗有要求,对建立时间有要求,对前端电容也十分敏感。这一段的处理水平,往往决定你的实际分辨率是12bit还是8bit。

4.1 SAR ADC的采样保持电容,为什么会“拉垮”前级

普通MCU内部的ADC基本都是逐次逼近型,也就是SAR ADC。它的输入端有一个采样开关和一个采样电容。每次采样开始,采样开关闭合,采样电容需要从前级源充电到输入电压。如果前级输出阻抗太高,采样电容在规定的采样周期内充不满,ADC转换出来的结果就会偏低,而且是随机的、和输入阻抗相关的误差。

数据手册里通常会给一个最大源阻抗推荐值,比如STM32系列某些型号在12bit模式要求源阻抗不超过10kΩ,而GD32H7这类带硬件过采样和高性能ADC的芯片,要求通常更严格。这个10kΩ不是随便给的,它和内部采样电容大小以及ADC时钟周期数直接相关。

所以运放输出到ADC之间如果直接加一个大电阻,比如10kΩ,那ADC采样时就会“拉不动”采样电容。尤其运放输出本身有一定输出阻抗,两者串联后源阻抗更高,采样误差会更明显。这也是为什么我的经验是,运放输出到ADC之间加RC滤波时,串联电阻尽量控制在100Ω到1kΩ,不要为了滤波效果好而盲目加大。

4.2 前端RC滤波的截止频率,怎么定才不伤信号

RC滤波有两个作用:一是滤除采样电阻和差分放大引入的高频噪声,二是为ADC的采样电容提供一个低阻抗充电源。很多人一上来就喜欢用低截止频率,恨不得把PWM噪声全滤掉,结果动态响应慢得一塌糊涂,电流环根本跟不住。

实际做法应该先看采样信号的最高频率。直流电机电流采集中,如果你只需要测量平均电流,RC截止频率可以放在几十kHz到一百kHz;但FOC控制里,电流环带宽可能要到5kHz甚至更高,RC截止频率至少要在几十kHz以上,否则会带来相位滞后,影响控制稳定性。

在开关电源和电机驱动中,最常见的噪声源是PWM开关边沿的高频振荡,频段通常在几MHz到几十MHz。所以更合理的思路是,把RC截止频率放在几百kHz到1MHz附近,滤掉高频尖峰,又不伤有用的中低频信号。例如一个非常常用的组合:串联电阻100Ω,并联电容1nF,截止频率约1.6MHz;或者串200Ω、并2.2nF,截止频率约360kHz。具体选择要结合ADC采样率和控制带宽。

针对∑-Δ型ADC,前端RC设计又略有不同。∑-Δ调制器内部对输入电流的抽取是持续的,而且输入阻抗呈动态变化,外部RC会与调制器输入特性一起构成抗混叠滤波。这类芯片的手册一般会给出推荐的外部RC数值,我建议直接按手册来,不要自己魔改,因为调制器采样频率和RC相互作用的规律比SAR ADC更复杂。

4.3 采样周期、源阻抗与建立时间:让每一次转换都站得稳

ADC的采样时间是可配置的。MCU的ADC模块一般以ADC时钟周期为单位,比如STM32里可以设1.5、7.5、13.5……个周期。采样时间越长,内部采样电容充电越充分,精度越好,但通道切换吞吐率会下降。

在电流采样场景里,你可能同时要采两相电流,甚至三相电流。如果通道切换太频繁,前一个通道的残余电荷会影响后一个通道的采样建立。这时我建议把采样周期适当地加长一些,比如在满足控制周期要求的前提下,选择中等偏上的采样时间,同时利用DMA的规则组扫描来减轻CPU负担。

更关键的是,ADC采样触发要跟PWM同步。用PWM中心对齐模式触发ADC,而不是让ADC完全自由运行,能有效躲开PWM开关边沿的尖峰。具体做法是:配置PWM中心对齐计数,在计数到特定值(通常是载波周期的中点,下管导通中间位置)时产生触发信号给ADC。这个时候采样电阻上的电压已经稳定,开关噪声还没有到来,采到的电流最干净。

4.4 时钟抖动与电源噪声对ADC信噪比的影响,以及PCB布局的三个要点

ADC对时钟抖动和电源噪声的敏感程度远超很多人想象。时钟抖动会让实际采样点在一个很小的范围内晃动,如果输入信号本身是干净的直流或低频信号,影响不大;但如果输入信号上叠加了高频噪声,采样点的晃动会把这些高频成分随机混叠进采样结果,表现为ADC码值的额外方差。

电源噪声的影响更直接。SAR ADC内部的比较器和电容阵列都依赖参考电压,参考电压上有几十毫伏的纹波,ADC码值就会跟着跳。电流采样链路里,运放电源、ADC参考电源、MCU数字电源如果共用一颗LDO而不做隔离,很容易出现在电机启动瞬间ADC读数整体偏移几十甚至上百码的现象。

关于PCB布局,我总结了三个自己实测下来最有效的动作:

  1. ADC参考电压引脚和模拟电源引脚,各自就近放0.1µF和1µF电容,且电容地端要直接打到模拟地平面,不要经过过孔绕远路。
  2. 时钟线、USB、通信线这些高频数字信号,不要在模拟输入走线下方或旁边长距离平行,时钟线如果非穿过模拟区域不可,就加串阻并在两侧铺地包住。
  3. 模拟地和功率地不一定要大面积分割,但采样电阻的“地端”和ADC参考地必须在同一点附近单点汇接,避免大电流地回流穿过模拟信号路径。

这三点不需要多高级的设备才能验证。你拿示波器测运放输出,再测ADC转换结果,通常能看出电源噪声和时钟布线的影响。

5. PCB布局:开尔文连接、地平面和模拟分区的实战细节

原理图再漂亮,布局一塌糊涂,电流采样照样一塌糊涂。这部分不是玄学,而是实打实的电磁学。我见过太多工程师在原理图上花了很多精力,最后板子回来波形全是毛刺,然后翻过头来改原理图,其实问题全在Layout。

5.1 采样电阻的开尔文连接:四线制为什么能显著提高精度

采样电阻的焊盘不仅要承受大电流,还要提供电压采样点。如果直接把电压采样走线接到大电流焊盘的外侧,那一段焊盘和铜皮也会有电阻,大电流流过时会产生额外压降,从而叠加到你要采的差分信号上。电流越大,这个误差越不能忽略。

正确的做法是开尔文四线制:大电流从焊盘的两个端头进出,电压采样走线从电阻焊盘的内侧边缘、紧贴电阻体引出来,单独走细线到差分放大器输入端,不再经过任何大电流路径。这样采样线上几乎没有电流,电压就是采样电阻本体的压降。

实际画板时要注意,电压采样走线尽量从电阻焊盘的内侧引出,两根线尽可能靠近并等长,可以平行走在一起,减少环路面积。环路面积越小,受到磁场干扰的感应噪声就越小。我用过一个简单判断方法:把整个电流采样网络想象成一个磁通收集器,环路面积越大,收集到的噪声越多。

5.2 功率地、模拟地:“割地”还是“不割地”

关于地平面分割,网上说法很多,我自己试下来最稳的做法不是把模拟地和功率地完全分开,而是单点汇接。完全分割的地平面会让回流电流失去连续路径,被迫绕过缝隙,反而增加了环路面积。尤其在ADC采样这种低电平模拟信号附近,地平面不连续比共用地更糟糕。

推荐的做法是:在PCB布局上把电流采样电路放在功率器件旁边的“隔离区”,模拟地作为独立的一块铜皮,只在采样电阻地端或ADC参考地附近的一点和功率地汇接。这个汇接点要尽量靠近采样电阻的功率地端,让功率回流在采样电路上游提前分流,不要让大电流回流穿过模拟信号的下方。

地分割的目的不是“断开”,而是控制回流路径。你可以在心里画一遍:功率MOSFET开关产生的di/dt回流路径,会不会经过模拟放大器的地参考点?如果会,就要调整布局。

5.3 时钟、开关管与ADC的PCB布局关键动作

回到前面热词里提到的“时钟抖动与电源噪声的3个PCB布局要点”,我再展开讲一下:

第一,时钟源和数字信号线要远离模拟输入差分走线。ADC的时钟往往来自MCU内部PLL或外部晶振,如果时钟线在模拟输入附近穿越,每次时钟边沿都会通过寄生电容耦合到高阻抗的采样走线上,最后表现为ADC码值有条纹状跳变。

第二,采样电阻和差分放大器要尽量靠近功率MOSFET或采样点。这样能缩短采样走线长度,减少天线效应。但放大器的输出到ADC输入可以适当走远一点,因为输出已经是低阻抗信号,抗干扰能力更强。

第三,去耦电容的位置比数量更重要。0.1µF电容要放在电源引脚旁边,而且电容的电源和地端都要直接打过孔到对应平面,不能通过很长的细线连接。VREF引脚的电容更关键,参考电压的纹波直接决定ADC的绝对精度,建议用单独的RC或LDO供电,并且参考电容的地端单独接到模拟地。

这些布局原则,本质上都是为了让“信号环路面积最小化”和“噪声回流路径可控”。电流采样电路对布局的敏感度,比普通数字接口高几个数量级,这一点一定要有心理准备。

6. 数据漂移怎么办:硬件校准和软件滤波的实战组合

电路焊好、驱动写完之后,数据出来还是不干净,这是常态。下一步不是换芯片,而是先用软件手段处理和诊断。我这边的原则是:硬件是基础,软件是兜底,两者要结合。

6.1 零点漂移:不是简单“减个零点”就完事

所有电流采样电路在零电流时,ADC读出来的值都不是理想中点。原因是运放失调、采样电阻两端的热电势、PCB漏电流等因素叠加在一起。开机时做一次零点校准,把这些偏移记下来,之后每次采样减掉,这个操作很容易,但很多人忽略了一个问题:零点是会随温度和时间漂移的。

更实用的做法是,在系统空闲时周期性地执行零点校准,比如电机或者功率回路不工作的时刻,采集若干次ADC值取平均作为新的零点。注意校准时的输入状态要一致,如果校准时刻还有共模电压,或采样电阻还有残余电流,那记下来的零点本身就带误差。

我的仪表类项目里,还喜欢做双点增益校准:通一个已知的精确电流,比如10A,记录ADC读数,再和零点一起算出一个比例系数。虽然采样电阻的标称值是10mΩ,但实际值可能有±1%的偏差,增益校准能把这一部分系统误差也抵消掉。代价是需要一个精密电流源,不是每个项目都有条件做,但做了之后精度提升非常明显。

6.2 C语言滤波函数:滑动平均、去极值平均和一阶低通

即使硬件和布线都做到位,ADC转换结果里还是会有些随机性,软件滤波是最后一道防线。我用的比较多的是两种:滑动平均和去极值平均。

滑动平均适合平稳电流的测量,比如电池充放电电流。它本质是把最近N次采样结果做算术平均,高频噪声被抑制,但动态响应会变慢。N太大时会掩盖真实的电流突变,所以要根据控制周期选取。

去极值平均适合开关电源和电机驱动这类有偶发毛刺的场景。做法是把最近N次采样排序,去掉最大的几个和最小的几个,剩下的取平均。这样即使有一两个采样点撞上开关噪声,也不会把平均值带偏。下面这个函数就是我在FOC采样里常用的去极值平均滤波:

#define ADC_FILTER_N 8 #define ADC_FILTER_TRIM 2 static uint16_t adc_buf[ADC_FILTER_N]; static uint8_t adc_idx = 0; uint16_t adc_filter(uint16_t raw) { uint16_t tmp[ADC_FILTER_N]; uint16_t sum = 0; uint8_t i, j; adc_buf[adc_idx] = raw; adc_idx = (adc_idx + 1) % ADC_FILTER_N; for (i = 0; i < ADC_FILTER_N; i++) { tmp[i] = adc_buf[i]; } // 冒泡排序,数据量小,简单直接 for (i = 0; i < ADC_FILTER_N; i++) { for (j = i + 1; j < ADC_FILTER_N; j++) { if (tmp[j] < tmp[i]) { uint16_t t = tmp[i]; tmp[i] = tmp[j]; tmp[j] = t; } } } // 去掉最大和最小的各TRIM个点,中间值取平均 for (i = ADC_FILTER_TRIM; i < ADC_FILTER_N - ADC_FILTER_TRIM; i++) { sum += tmp[i]; } return sum / (ADC_FILTER_N - ADC_FILTER_TRIM * 2); }

一阶低通滤波则更轻量,适合做缓慢变化的均值采样。它在代码里只需要一个全局变量:

static float filtered_value = 0.0f; #define FILTER_ALPHA 0.2f uint16_t adc_lowpass(uint16_t raw) { filtered_value = filtered_value + FILTER_ALPHA * (raw - filtered_value); return (uint16_t)filtered_value; }

系数alpha越大,响应越快,滤波越弱;越小则越平滑,但滞后越明显。实际使用时可以从0.2开始调,观察数据在负载突变时的跟随情况。

6.3 用PWM中心对齐触发ADC采样,从源头躲开开关毛刺

软件滤波能解决一部分随机噪声,但有一类“噪声”它是解决不了的:PWM开关边沿带来的周期性干扰。这种干扰幅度大、重复性强,最好的办法不是滤,而是别让它进ADC。

电机驱动和数字电源里,我用得最多的方法是PWM中心对齐触发ADC。原理很简单:PWM载波在一个周期内有个中心点,这个时刻开关管处于确定的导通状态,采样电阻上的电流已经稳定,开关尖峰也已经衰减。配置PWM定时器的某个比较事件或更新事件作为ADC触发源,让ADC自动开始转换,就能天然避开边沿噪声。

以STM32为例,高级定时器的中心对齐模式配合重复计数,可以非常方便地产生一个位于载波中心的触发点;GD32H7这类芯片也类似,而且它的ADC支持更灵活的触发配置和硬件过采样,读到的结果可以直接用于FOC。硬件过采样相当于在芯片内部做了多次平均,比纯软件滤波省CPU,但要注意过采样会降低输出数据率,不是所有应用都适用。

6.4 实测中的漂移案例:从一包乱码到稳定数据

最后分享一个实际案例。之前做一台直流电机驱动,采样电阻10mΩ,差分放大器输出电压接到STM32的ADC。最初的情况是:电机不转时ADC值还算稳定,电机一转,电流读数在空载时就有±200mA左右跳动,怎么滤波都压不住。

先用示波器测采样电阻两端波形,发现每个PWM周期的开关沿都有一个大的振铃尖峰,幅度甚至超过了有效信号。检查布局,发现采样走线从电阻焊盘直接拉到板子另一端,中间穿过了一颗开关管的驱动走线,这等于给差分输入端并联了一个小天线。后来把采样电阻移到MOSFET附近,采样走线改短并用开尔文连接,同时把ADC触发改成PWM中心对齐,再读数据就稳多了,过滤后电流纹波控制在±20mA以内。

这中间没有换任何一颗芯片,纯粹是布局和触发时序的调整。所以每次看到“ADC数据漂移”的问题,我都会先问自己几个问题:采样走线是不是太长?地回流是不是穿过了模拟区域?ADC是不是自由运行没跟PWM同步?这几个问题排查完,80%的漂移都能解决。

回到最初那句话,电流采样难在“准”,而“准”从来不是某一个环节的事。电阻精度、差分放大共模抑制、RC滤波截止频率、ADC采样时序、PCB布局、软件校准,这条链路上任何一个薄弱点都会最后体现在ADC码值上。我个人的调试顺序是:先示波器看采样电阻两端原始波形,再查PCB布局,接着调ADC触发时序,最后才动软件滤波。按这个顺序走,通常能快速定位问题,而不是盲目换运放、改电阻、堆滤波代码。希望这篇拆解能帮你少走几步弯路,也欢迎在评论区把你遇到的电流采样问题丢出来一起聊。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询