
电流采样这活儿表面上看就是把一个电阻两端的电压量出来但真正动手做过的人都知道难点从来不在“量”而在“准”。尤其是把差分放大器和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滤波来吸收这个尖峰。这里我习惯的做法是参数主要影响建议阻值信号幅度与功耗使满量程压降50100mV兼顾信噪比与温升额定功率长时间过流下的稳定性至少留2倍以上余量温度系数阻值随温度漂移尽量选50ppm/°C以下的合金电阻寄生电感高频电流尖峰用四端开尔文封装或低感结构2.2 低侧采样和高侧采样共模电压决定拓扑电流采样有两种常见接入位置。低侧采样把电阻放在负载和地之间优点是共模电压低差分放大器和ADC都好处理缺点是采样电阻插入地回路负载下端的电位不再是真正的0V而且大电流地回路上的噪声会直接影响采样参考点。高侧采样把电阻放在电源正端和负载之间共模电压接近母线电压对差分放大器的共模抑制能力要求高很多。但高侧采样不会干扰地回路负载接地更干净在汽车电子和电池管理里更常见。如果只做低侧采样普通的单运放差分电路也够用一旦涉及高侧采样或者母线电压很高的系统我建议直接用集成电流检测放大器比如INA240、INA282这类。它们内部做好了电阻匹配和共模抑制比你自己用四颗电阻搭差分电路可靠得多。这个选择会在下面展开。2.3 分立差分放大器、仪表放大器和集成电流检测放大器怎么选做了这么多年硬件我面对“差分放大”这个词时第一反应不是某个电路而是先问一句这个“差分”到底靠什么实现最常见的三种方案分立运放外部电阻搭成差分放大电路成本低但CMRR取决于外部四个电阻的匹配精度。仪表放大器内部有三个运放输入阻抗高、CMRR高但价格贵而且电流采样场景往往不需要那么高的输入阻抗。集成电流检测放大器专为低侧/高侧电流采样设计内置匹配电阻和滤波性价比和可靠性最均衡。单运放差分电路的CMRR直接受外部电阻匹配度限制。四个电阻都是1%精度时最差情况下CMRR可能只有4050dB这对开关电源里的高共模环境是不够用的。不要以为放大器本身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.15V3.15V范围内留出一点线性裕量。满量程电流20A在10mΩ上产生±200mV的差分电压。要让输出在1.65V基础上摆动±1.5V需要的增益是增益 输出电压幅度 / 输入电压幅度 1.5V / 0.2V 7.5所以外部电阻比例按7.5倍设计或者选增益为8倍的集成电流检测放大器输出范围会到1.65V ±1.6V即0.05V3.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布局我总结了三个自己实测下来最有效的动作ADC参考电压引脚和模拟电源引脚各自就近放0.1µF和1µF电容且电容地端要直接打到模拟地平面不要经过过孔绕远路。时钟线、USB、通信线这些高频数字信号不要在模拟输入走线下方或旁边长距离平行时钟线如果非穿过模拟区域不可就加串阻并在两侧铺地包住。模拟地和功率地不一定要大面积分割但采样电阻的“地端”和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触发时序最后才动软件滤波。按这个顺序走通常能快速定位问题而不是盲目换运放、改电阻、堆滤波代码。希望这篇拆解能帮你少走几步弯路也欢迎在评论区把你遇到的电流采样问题丢出来一起聊。