ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

FOC电流采样运放电路设计:偏置与放大计算及调试指南

2026/9/23 2:05:05 拓冰建站 浏览量
FOC电流采样运放电路设计:偏置与放大计算及调试指南 去年在调试一台自制无刷电机FOC驱动器时我把示波器探头点到电流采样运放的输出端看到的波形完全不是书上画的平滑正弦——而是一边被削平、一边叠加着密密麻麻的毛刺的梯形。折腾了整整一天才定位到问题STM32的ADC只能采集0~3.3V的单极性电压而采样电阻上的电流信号是正负双极性摆动的中间的偏置电压和放大倍数没设计好FOC算法根本无从谈起。这篇文章就把这个环节彻底讲透。我会从为什么必须加运放开始推导偏置电压和放大倍数的计算公式再给一个从电流规格到电阻取值的完整设计实例最后把我实际调试中踩过的一堆坑和排查思路全部分享出来。适合正在做无刷电机FOC驱动、自己画板子又对模拟前端心里没底的嵌入式工程师。1. FOC电流采样为什么绕不开运放偏置与放大缺一不可1.1 单极性ADC遇上双极性电流信号FOC磁场定向控制算法需要实时获取电机三相绕组的电流值用来做Clark变换和Park变换进而计算出当前转子磁链的角度和转矩。这个电流是交流性质的意味着它在正负方向都会流动。无感FOC最常用的电流采样方案是在逆变器低端使用采样电阻。电机电流流过这个毫欧级电阻时会在电阻两端产生一个与电流成正比的小电压。问题在于当电流方向为正时采样电阻高端对GND是正压当电流方向为负时高端对GND就是负压。而STM32的ADC输入范围是0V到Vref通常是0~3.3V。负电压直接进ADC引脚轻则采样结果为0重则损伤引脚内部的ESD保护二极管。也就是说ADC能处理的信号必须是一个完全位于0V以上的单极性电压而电流信号天然是双极性的这两者之间存在一个明显的电压域鸿沟。1.2 运放的两个任务电平移位与信号放大要打通这个鸿沟运放电路需要同时完成两件事。第一件事是电平移位也叫偏置叠加。把以GND为参考的双极性信号整体向上抬升让零电流点对应ADC量程的中点比如1.65V。这样电流正向最大时输出接近3.3V反向最大时输出接近0V波形就能完整落在ADC的可采范围内。第二件事是信号放大。毫欧级采样电阻在中小电流下产生的压降非常小。举个例子10mΩ采样电阻流过5A电流时只有50mV压降而STM32F103的12位ADC在3.3V参考下1个LSB对应约0.8mV。50mV信号只占约60个LSB分辨率完全不够看。必须把信号放大到接近ADC满量程的范围才能发挥12位ADC的精度。这两个任务在电路设计上是耦合的不是简单做一次加法器再串一个放大器就能完成。后续的公式推导会说明这一点。1.3 低端采样、高端采样与隔离采样的选择在开始电路设计前先明确采样拓扑。低端采样把采样电阻放在逆变器下管MOSFET的源极与GND之间电流采样时要求下管导通。这是FOC入门最常用的方案共模电压低运放选型容易成本最低。缺点是占空比较小或过大时采样窗口会变短需要合理设计PWM触发采样时机。高端采样把采样电阻放在母线正端与上管漏极之间可以一直检测到电流不受占空比限制但共模电压很高普通运放无法直接使用需要高共模抑制比的差分放大器或电流检测芯片。隔离采样则使用隔离放大器或电流传感器适合高压电机驱动场景成本和复杂度都更高。对于学习FOC和理解运放电路的读者低端采样是首选。本文的电路设计和计算也基于低端采样电阻展开。2. 同相加法电路公式推导增益和偏置其实彼此锁定2.1 叠加定理同相端的两个输入各管一路我推荐的低端采样运放电路拓扑如下采样电阻的高端通过一个电阻R1接到运放同相端一个基准电压Vref通过另一个电阻R2也接到运放同相端反相端通过Rg接地通过Rf接到输出端。同相端同时接入两个电压源用叠加定理可以分别计算每个源在Vp节点产生的分量再相加得到最终的同相端电压Vp Vs × R2/(R1R2) Vref × R1/(R1R2)这个式子的物理含义很清晰。R1和R2构成了一个分压网络Vs对Vp的贡献被R2比例衰减Vref对Vp的贡献被R1比例衰减。衰减比例之和等于1因为R2/(R1R2) R1/(R1R2) 1。定义信号通道的衰减系数α R2/(R1R2)那么Vref通道的衰减系数就是1-α。Vp的表达式可以简化为Vp Vs × α Vref × (1-α)2.2 输出表达式的两种理解方式同相放大器部分的增益是G 1 Rf/Rg。运放输出端的电压就是Vp乘以GVout G × [ Vs × α Vref × (1-α) ]把它拆开成两个部分会更好理解Vout Vs × G × α Vref × G × (1-α)其中Vs × G × α是信号通道对输出的贡献也就是真正需要被ADC采样的电流信号放大结果Vref × G × (1-α)是偏置通道对输出的贡献它决定了零电流时运放输出端的电压。当电机电流为零Vs0时输出为Vout(零电流) Vref × G × (1-α)这个值就是ADC采样范围内的零电流基准点通常希望它等于ADC量程的中点电压。2.3 先放大再加偏置为什么说不通很多初学者会下意识认为电路设计就是先算好放大倍数再把偏置直接加上去也就是把输出理解为Vout Vs × 增益 Vref但从2.2节的公式可以看出在同相加法电路里Vref并不是直接乘以一个独立的偏置增益而是也要经过R1、R2的分压衰减后再被同相放大G倍。相当于偏置电压Vref被先衰减、再放大两个通道相互纠缠。这意味着一个非常重要的事实你一旦改变了放大倍数G零电流输出点也会跟着变反过来你改变了R1、R2的分压比信号增益也会变。增益和偏置不是两个独立旋钮而是同一个联动机构上的两个变量。所以在设计参数时不能只考虑放大倍数要多少必须同时满足两个约束零电流输出要落在ADC量程中点附近满量程电流输出要落在ADC量程的上下限之内。这就是下一章要解决的核心问题。3. 手把手算一遍从电流规格到具体电阻取值3.1 采样电阻阻值、功耗与连接方式采样电阻的阻值直接决定了信号电压的大小但阻值选太大电阻上的功耗和温升也会急剧上升。以一个额定30A、峰值60A的小型无刷电机驱动器为例。如果选用10mΩ采样电阻峰值60A电流时电阻上消耗的功率为P I² × R 60² × 0.01 36W这个功耗会导致电阻严重发热。所以实际设计中一般不会让电机长时间工作在峰值电流采样电阻选型要按持续电流工况考虑。若持续30A工况10mΩ电阻上的功耗为P 30² × 0.01 9W这已经需要专门挑选大功率合金电阻如2512封装的2W~3W或插件式功率电阻并联使用。如果峰值电流只有30A持续电流15A左右那么5mΩ或10mΩ的低阻值合金电阻更合适功耗可以控制在1W到3W级别。信号电压方面设采样电阻为10mΩ目标采样电流范围为±30A那么Vs_max 30A × 0.01Ω 0.3V信号范围是-0.3V到0.3V峰峰值为0.6V。3.2 定义ADC电压窗口别把满量程用尽STM32 ADC在3.3V参考电压下的理论量程是0~3.3V但实际设计时不能真的把整个量程用尽。原因有两个。第一绝大多数运放在接近电源轨时会出现非线性输出跟不上输入或者出现饱和压降所以必须留出至少100mV到150mV的余量。第二采样电阻的误差、运放的失调电压、基准源的误差都会让实际曲线偏移如果一开始就贴在量程边界稍微偏一点就削波了。我把目标输出电压窗口定义为0.1V到3.2V。中心电压就是(0.1 3.2) / 2 1.65V这个1.65V正好是3.3V的一半也是零电流对应的输出点。上下摆幅各为1.55V对0.3V的输入信号来说需要的总信号增益为A_sig (3.2 - 0.1) / 0.6 5.167倍也就是说输出端信号的峰峰值3.1V对应输入端0.6V的峰峰值。3.3 联立求解增益G与衰减系数α现在回到2.2节的两个关键公式A_sig G × αVout(零电流) Vref × G × (1-α) 1.65V我需要选择基准电压Vref。最推荐的是专用的2.5V精密基准源例如LM4040A25、REF3025、TS431等。如果为了省成本直接接3.3V电源VDD上的纹波会通过偏置通道耦合到输出端在FOC的高频开关环境下很容易引入噪声。将Vref2.5V代入G × (1-α) 1.65 / 2.5 0.66又因为α A_sig / G代入上式G × (1 - A_sig / G) 0.66G - A_sig 0.66G A_sig 0.66 5.167 0.66 5.827α A_sig / G 5.167 / 5.827 0.887这个α对应的R1与R2比值关系是R1 / R2 (1-α) / α 0.113 / 0.887 ≈ 0.127取R210kΩ则R1≈1.27kΩ。这个阻值在E96系列中有标准值可以直接选1.27kΩ精度1%或者0.1%都可以。3.4 圆整到标准电阻后的回代验证G 1 Rf/RgG需要5.827所以Rf/Rg≈4.827。取Rg1kΩRf4.87kΩE96标准值则G5.87。将R11.27kΩ、R210kΩ、G5.87代回公式α 10 / (1.27 10) 0.8873Vout(零电流) 2.5 × 5.87 × 0.1127 ≈ 1.654V满量程正0.3V时输出Vout 1.654 0.3 × 5.87 × 0.8873 1.654 1.562 3.216V满量程负-0.3V时输出Vout 1.654 - 1.562 0.092V可以看到正端3.216V贴着3.2V窗口上限负端0.092V贴着0.1V窗口下限余量有点紧。如果你希望更稳妥可以把Rf换成4.7kΩ此时G5.7重新计算Vout(零电流) 2.5 × 5.7 × 0.1127 ≈ 1.606V正满量程输出 1.606 0.3 × 5.7 × 0.8873 1.606 1.517 3.123V负满量程输出 1.606 - 1.517 0.089V负端还差一点。这种情况下有两种处理思路一是换用0.1%精度的E96电阻让理论值和实际值更吻合二是在软件中做零点校准把1.606V这个偏移作为offset记录下来。硬件只要保证不削波软件可以把剩余的零点误差消掉。这里要特别强调计算完一定要用实际选取的电阻值回代验证不要算完理想值就直接画板。很多第一次做FOC的工程师栽就栽在这——理想值和圆整后的实际值差了百分之几在满量程处被放大后可能直接导致削波。3.5 输出端RC滤波与ADC输入阻抗匹配运放输出到STM32 ADC引脚之间通常要加一级RC低通滤波一方面抑制高频开关噪声另一方面给ADC内部的采样保持电容提供足够的电荷。典型接法是运放输出串联一个100Ω到1kΩ的电阻Rfilt在ADC引脚对地接一个电容Cfilt。截止频率为Fc 1 / (2π × Rfilt × Cfilt)如果选用Rfilt470Ω、Cfilt10nF截止频率约为33.8kHz。FOC的PWM频率通常是10kHz到20kHz基波电流频率在几百Hz到几kHz这个截止频率既能保持电流信号完整又能抑制PWM开关频率附近的噪声。电容大小不是越大越好。STM32 ADC在工作时采样保持电容通常几皮法到十几皮法会在采样开关闭合瞬间从外部抽取电荷外部Cfilt越大提供给内部采样电容的电荷越充足电压跌落越小。但Cfilt太大会导致RC时间常数过大在有限的ADC采样时间内电压建立不完全采样结果反而偏低。F103的ADC采样时间最短约1.5个ADC时钟周期在12MHz ADC时钟下约125ns这个时间远小于RC建立时间所以实际上要给ADC配置足够长的采样时间建议把采样周期配置为7.5个或13.5个周期很多FOC驱动代码里直接配置为最大采样周期来保证精度。3.6 运放选型的四个参数选运放时我主要看四个参数。第一是轨到轨输出。单电源3.3V或5V供电下普通运放输出最多到电源电压减1V左右这会直接吃掉输出窗口。轨到轨运放在轻负载下可以输出非常接近电源轨的电压例如5V供电时输出可以达到4.95V以上3.3V供电时输出可以达到3.25V左右。第二是增益带宽积GBW。运放的闭环增益乘以信号频率不能超过GBW。FOC电流环带宽通常做到1kHz到2kHz但PWM谐波和采样尖峰是高频分量GBW至少需要几MHz。比如GBW1MHz、闭环增益为5.8时能处理的最高信号频率只有约170kHz用于电流环基波完全够但如果要做更快的电流环或采样率更高的应用建议选GBW在10MHz以上的型号如OPA2350、MCP6002等。第三是输入失调电压Vos。普通运放的失调电压在1mV到5mV经过5.8倍放大后会产生6mV到30mV的输出偏移对应到ADC读数就是几个到几十个LSB。FOC电流环对这种零漂很敏感建议选用Vos在1mV以下的精密运放。第四是输入偏置电流。采样电阻的源阻抗很低一般这个参数不太容易出问题但如果R1、R2用了大阻值例如100k以上偏置电流流过这些电阻产生的压降就会影响精度。本文的例子中使用10k和1.27k普通CMOS运放完全没问题。4. 实测调试的典型坑与完整排查链路4.1 零电流输出不是中位值从ADC读数倒推偏置支路最常见的问题就是电机静止时ADC读回来的数值不是理想的中位值比如应为2048但实际读到了1980或者2200。排查时不要急着改软件。先把示波器探头直接点到运放输出端测量零电流时的实际直流电压。如果实测电压和理论计算值相差较大按照以下链路逐个排查。第一步检查基准电压Vref本身。用万用表测R2上端对GND电压如果不是2.5V恭喜你问题找到了一半。TS431这类可调基准的反馈电阻如果接错输出不会再是2.5VLM4040这种固定基准如果买到了假货电压可能完全不对。第二步检查运放供电。运放供电电压如果低于输出电压需求比如用5V供电而电源实际只有4.6V输出摆幅会被拉低。测量运放电源引脚上的实际电压最好用示波器看因为开关电源的纹波可能让万用表的平均值看起来正常。第三步检查R1与R2的实际阻值。实际焊接过程中很多工程师习惯用直插电阻跨接引脚剪断时如果不小心连到了旁边的焊盘分压比就变了。用万用表断电状态测量R1、R2的实际阻值和设计值对比。如果以上三步都没问题再考虑运放输入失调电压的影响。精密运放的Vos只有几百微伏普通运放可能是几毫伏经放大后产生几十毫伏的偏移完全正常。这属于硬件原理带来的本底误差需要靠后面的软件校准消除不属于故障。4.2 波形一边先削波轨到轨运放的真实余量调试中另一个高频问题电流正半周波形正常负半周底部变平或者反过来正顶被削掉。排查第一步确认输出窗口是不是贴得太紧。比如我前面计算中正满量程3.216V如果运放实际满摆幅输出只能到3.1V那正半周削波就不可避免。示波器上会看到正顶被压平。排查第二步确认运放是不是真正的轨到轨输出。很多标称轨到轨的运放在输出接近正轨时会被内部输出级限制实际最大输出电压可能只有Vcc-50mV到Vcc-200mV。如果供电是3.3V输出到3.15V左右就已经有非常接近电源轨的非线性畸变了。所以3.2V的窗口上限在3.3V供电下看起来留了100mV余量但实际并不充裕。排查第三步检查负半周削波是不是因为运放单电源供电。单电源运放输出接近0V时内部乙类推挽级的NPN管会进入饱和输出可能只能到50mV左右。如果你把输出窗口设成0.05V那就一定会看到底部削波。我的经验是在设计阶段把输出窗口设在0.15V到3.15V而不要用0.1V到3.2V会稳妥很多。代价是增益要微调但值得。4.3 采样点撞上开关噪声触发时机与滤波器FOC电流采样最大的噪声来源是PWM开关边沿。功率MOSFET在开关瞬间产生的电压尖峰和振铃会通过寄生电容耦合到采样电阻和运放输入端在ADC采样值上表现为幅度很大的毛刺。这种噪声有一个特点它出现在PWM开关沿附近而在PWM周期中心位置下管导通稳定后采样电阻上的电压最接近真实电流。所以正确做法是让ADC采样触发和PWM中心对齐也就是在中心对齐PWM的计数器上溢或下溢时刻触发ADC采样。以STM32F103为例可以使用高级定时器TIM1或TIM8的中心对齐模式把ADC注入组的触发源配置为定时器的更新事件或者直接在更新事件中断中启动ADC转换。有些工程师会在DMA传输完成中断里读取ADC数据然后立即计算Clark变换和Park变换这种流程配合中心对齐采样点效果很好。如果换了采样点仍然有毛刺就要检查RC滤波参数。Rfilt470Ω、Cfilt10nF的截止频率是33.8kHz对20kHz PWM的谐波衰减有限。可以适当增加Cfilt到22nF或33nF截止频率降到15kHz左右同时把ADC采样时间加长让RC在采样窗口内有足够的建立时间。还有一个很多人在原理图上看不出来的坑运放输出到ADC引脚的走线如果和PWM驱动信号线平行跑了很长一段就会通过分布电容耦合开关尖峰。这种噪声用滤波器很难完全滤掉最好的办法是PCB上把敏感线和强干扰线分开或者在ADC引脚附近加一个100pF的小电容对高频尖峰的效果比加大滤波电容更明显。4.4 采样电阻地弹与开尔文接法PCB层面的坑低端采样电阻的参考地处理不好整个信号链都是假精度。当电机电流很大时采样电阻两端的电压包含了电阻本身的压降也包含了电流流过PCB地平面时产生的地弹噪声。如果运放的参考GND和采样电阻的功率GND混在一起地弹电压就会直接叠加到输入信号上。解决办法是采用开尔文接法四线制。采样电阻的电流流过的两个端子走功率路径而运放采集信号的端子直接从采样电阻本体上单独引出两条信号线不走功率电流路径。信号线和功率线在采样电阻本体处才相遇这样信号线回路中不会流过大的功率电流地弹噪声就不会进入运放输入端。另外三相低端采样电阻的GND端不要并联到同一个地焊盘上而是各自回到逆变器母线的GND去耦点。如果三个采样电阻的GND汇合点形成一个小面积的地岛大电流换相时地岛上的电位会快速跳动三个ADC通道都会受到影响。5. 从分立运放到专用芯片以及软件校准兜底5.1 普通运放 vs 专用电流检测放大器手把手算完分立方案之后我想认真对比一下专用芯片方案。以TI的INA240系列为例它内部集成了差分放大器增益固定为20、50、100或200V/V共模输入范围可以到-4V到80V专门为电机驱动场景设计了PWM抑制功能。输出以Vref引脚输入的电压为基准输出公式非常简单Vout (IN - IN-) × Gain Vref如果你把采样电阻两端分别接到INA240的IN和IN-再把2.5V基准接到Vref引脚那么零电流时输出就是2.5V满量程时输出在2.5V上下摆动。整个计算过程绕开了R1、R2耦合推导直接得多。两类方案怎么选我列一个对比表格对比项普通运放方案专用电流检测芯片如INA240成本低几元以内中高十几元到几十元增益调整可自由调整固定档位共模抑制取决于外围电阻匹配内置高精度匹配很优秀抗PWM干扰需要自己加滤波内置PWM抑制电路计算复杂度需要联立推导公式简单温漂表现取决于运放和电阻集成后温漂较小我的建议是学习阶段第一次做FOC可以先用普通运放把偏置和增益的计算完全吃透这比直接拔高用专用芯片更有收获如果是做产品、画量产板直接上INA240这类芯片省心很多整体BOM成本里的贵是值得的。5.2 STM32G4内置PGA省掉外部运放的另一条路如果你选的主控不是F103而是STM32G431或G474那么外部运放都可以省掉了。G4系列内部集成了多个可编程运算放大器OPAMP输入可以配置为内部连接或外部引脚增益可编程输出直接路由到内部ADC通道不需要经过外部走线。用G4的内置PGA做FOC电流采样时偏置电压和增益的计算逻辑与本文推导的原理完全一致只是把外部R1、R2、Rf、Rg换成了寄存器配置。好处是PCB面积大幅缩小且不需要担心电阻匹配精度坏处是G4的内部互连关系对初学者来说更抽象一旦配置错误波形异常时排查难度更大。我的建议是先用F103加外部运放把电路原理吃透再迁移到G4内部PGA思路会很顺畅。5.3 软件数字校准把零点偏差修正到1个LSB以内无论硬件设计得多好电阻精度、运放失调、基准源误差都会留下一个固定的零点偏移。这个偏移在FOC里会表现为静止时电流不为零导致电机静止时轻微抖动。软件校准的思路很简单电机上电后在确认没有电流流过逆变器全关断的情况下通过ADC采样一次当前输出把这个值记为offset_adc。之后每次采样计算电流时先减去这个offset。C语言伪码类似这样#define ADC_FULL_SCALE 4095.0f #define VREF_ADC 3.3f #define R_SENSE 0.01f #define GAIN 5.7f static uint16_t offset_adc 0; void current_offset_calibrate(void) { // 确保此时逆变器桥臂全关断电机无电流 offset_adc adc_read_channel(CURRENT_CH); } float get_current(void) { uint16_t adc_val adc_read_channel(CURRENT_CH); float voltage (float)(adc_val - offset_adc) / ADC_FULL_SCALE * VREF_ADC; return voltage / (GAIN * R_SENSE); }这段代码把硬件残余的零点偏移一次性消除只需要确保校准时刻真的是零电流状态并且校准完成前不要使能PWM输出。需要注意运放的失调电压会随温度漂移长时间运行后零点可能再次偏离。更稳妥的工程做法是在每次电机启动前做一次快速校准或者在电机长时间运行后定期让PWM输出关闭几毫秒重新校准一次。这个逻辑在量产电机驱动器中很常见。安排完硬件偏置计算、软件校准之后电流采样链路基本就完整了。实际调FOC时我还会先去读一次上电零电流ADC值再对比示波器上的运放输出是否一致——这个习惯帮我避免了至少十次算法写得没错但硬件偷偷出了问题的困扰。