做电机驱动这几年,我把三电阻、双电阻、单电阻这三种电流采样方案挨个焊过、调过、烧过。很多朋友私信问我,说网上资料一堆,但都是各讲各的,什么“三电阻精度高”“单电阻省成本”,真到自己画板子、写FOC代码的时候就懵了:到底该选哪个?手里的STM32F103RCT6能不能跑单电阻?为什么我双电阻采出来的电流波形毛刺大得像心电图?这篇就把三种无刷电机电流采样方案从原理、硬件、时序到真实调试踩坑,一次性讲透。看完你至少能明白:你的项目该为“精度”花多少钱,又该为“省成本”接受哪些坑。
1. 三种采样方案到底在采什么?先搞清楚原理再谈选型
1.1 为什么电流采样是无刷电机FOC绕不开的一环
无刷电机FOC矢量控制的核心,是让电机定子电流矢量始终和转子磁场保持正确夹角。你没采样回来的真实相电流,算法就不知道现在该给哪一相通多少电压,整个控制环等于瞎猜。所以电流采样不是“可选优化项”,而是FOC的地基。
很多人一开始以为电流采样就是拿万用表量一下母线电流,其实完全不是一回事。FOC需要的是一组瞬时相电流,时刻、幅值、方向都要对,采样延迟一两个微秒,电流环相位裕度就可能撑不住。这也是为什么很多入门朋友把驱动代码从网上抄下来,电机转起来很顺,但一带载就抖,问题多半出在电流采样质量上。
三种电阻采样方案的区别,本质上是用几个电阻、放在哪、怎么在PWM周期里取数据的区别。它们都能回答“现在三相电流是多少”,但成本、精度、算法复杂度完全是三档。
1.2 三电阻采样:一次零矢量全拿齐,精度天花板
三电阻方案是在逆变器三个下桥臂的MOSFET源极和地之间,各串一个毫欧级采样电阻。三个电阻的一端都接地,另一端各自接一个运放放大后进ADC。这样,每一相下管导通时,流过该相的电流就会在这个电阻上形成压降,就能测出这一相的实时电流。
关键操作点是:SVPWM中心对齐模式下,PWM波形在周期中点有一个“三相下管同时导通”的零矢量状态(即000状态)。在这个瞬间,三个采样电阻上同时有电流,ADC一次触发就能把三相电流全部采回来。这也是三电阻方案在FOC里最好用的原因——你拿到的三个电流是同一时刻的,完全不需要重构,电流重构算法那部分代码直接省掉。
三电阻的代价也很直接:三个采样电阻加三路运放,成本高、PCB面积大。一个双运放芯片(比如常用LM358、MCP6002)只能处理两路,三路就得用四运放或者多加一颗单运放。BOM成本比双电阻大概贵2到4块人民币,比单电阻贵更多。体积和布线难度也跟着上来,尤其在电机驱动板和电调这类空间紧张的产品里,三路运放和对应滤波电容要排队硬塞。
但它换来的好处是实打实的:电流波形干净、高频噪声小、低速大扭矩下稳定,而且几乎不需要写补偿代码。我自己实测过,同样的电机和FOC参数,三电阻方案在2%额定转速下电流THD比双电阻低不少,这对需要精细低速运行的项目来说,是多花几块钱完全值得的。
1.3 双电阻采样:两相实测加一相推算,性价比主力
双电阻方案是把三个采样电阻砍成两个,通常放在V相和W相下桥臂(U相不放)。根据基尔霍夫电流定律,三相电流之和为零,所以U相电流直接算:Iu = -Iv - Iw。
这个方案的采样时刻和三电阻类似,也是在中心对齐PWM周期中点,当下管导通时同时采两路。因为省掉了一路运放和电阻,成本和PCB面积都降下来,是市面上绝大多数中低端无刷驱动板和电调的首选。STM32F103RCT6做FOC的例程里,最常见的就是双电阻。
双电阻的核心坑在死区和低调制区。前面说了,采样要利用下管导通的时间窗口。如果某一相的占空比很高(接近100%),那这一相下管几乎不导通,对应的采样电阻上流过的电流就很少,采样窗口变得非常窄。窄到ADC还没完成转换,窗口就结束了,采出来的数据完全不能用于FOC。
怎么应对?两个方向:
一是扇区判断切换采样相。SVPWM的六个扇区里,不同扇区有一相或两相占空比处于极端值,那就只采两相中窗口够宽的那两相,缺的相用电流和公式算。这样采样相是随扇区变化的,代码复杂度上升一点,但覆盖范围大很多。
二是移相PWM。检测到采样窗口不足时,把某一路PWM的中心位置微调错开,人为造出一个足够宽的采样窗口。代价是电流纹波会变大,电机噪声略微增加。这个方案对MCU定时器的要求高一些,需要支持中心对齐且能动态改比较值。
双电阻的优点很明确:精度比单电阻高、成本比三电阻低,是我给大多数项目推荐的“折中甜点”。但如果你要做低速大扭矩或零速堵转,双电阻采样在过零点附近的窗口问题会让你调试到怀疑人生,这个后面细说。
1.4 单电阻采样:母线电流里“抠”出三相电流
单电阻方案最极端:只在直流母线负端(或正端)放一个采样电阻。整个系统只有一路电流信号、一路运放,BOM成本压到最低。
原理是利用不同开关状态下母线电流等于某一相电流这一事实。看SVPWM的开关序列:一个PWM周期内会经历两个有效矢量和一个零矢量。比如在某个扇区里,先执行矢量V1,再执行矢量V2,这期间母线电流分别等于某两相的相电流。在这两个有效矢量持续期间各采样一次,就得到两相电流,第三相用电流和公式推算。
采样两次的时间点必须和PWM状态精确对齐。比如ADC触发时刻要比PWM跳变沿晚一个固定的延时,确保避开MOSFET开关振荡和死区带来的尖峰。这个延时不能太短,也不能太长,要卡在电流建立稳定之后、矢量切换之前。
单电阻方案最大的问题是有效矢量时间过短。在低调制区(输出电压很小)或某些扇区边界,某个有效矢量的持续时间可能只有几百纳秒,ADC根本来不及转换。STM32F103的ADC最快转换也要1微秒左右(12位),采样窗口短于这个值,那一相电流就丢了。
单电阻的补偿策略一般也是移相:把占空比小的那相PWM做局部调整,增加有效矢量持续时间,保证采样窗口够用。但移相带来的电流纹波、额外噪声、算法复杂度,让它在diy项目里并不友好。如果你不是对成本极度敏感,或者不是想在算法上挑战自己,不建议从单电阻入门。它适合无人机电调、电动工具这类以“便宜、能转”为第一目标的产品。
2. 硬件电路上的考量:电阻选多大、运放怎么选、滤波怎么加
2.1 采样电阻的阻值、功率、温漂与布局
采样电阻阻值太小,信号幅度低,运放需要高增益,噪声和失调也跟着放大;阻值太大,电阻上压降和损耗大,电机母线电压利用率下降。我常用的选择范围是10毫欧到50毫欧,具体根据电机额定电流来定。
简单算一下:假设额定电流10A,选20毫欧电阻,满载压降就是0.2V。这个信号经过20倍放大后是4V,对于3.3V或5V ADC来说已经可用了。如果额定电流只有2A,选20毫欧压降只有0.04V,放大20倍只有0.8V,ADC分辨率用不满,不如选50毫欧或加大增益。
功率要按峰值电流和占空比核算,不是按平均电流。无刷电机堵转或加速瞬间,电流可能是额定值的好几倍。比如10A额定、瞬间30A,流经20毫欧电阻的瞬时功率是900毫瓦,即便占空比不高,热冲击也很大。我一般选额定功率2倍余量的电阻,2512封装起步,留足铜皮散热,否则电阻漂阻值还不算最麻烦,焊盘过热脱焊才真要命。
温漂这个参数容易被忽略。锰铜合金或康铜合金的采样电阻温漂能到75ppm/°C以内,普通的厚膜电阻温漂够300ppm/°C。做FOC的电流环,增益随温度漂移会导致力矩估算不准。精度要求高的项目,务必选合金电阻或低温度系数的专业采样电阻。
布局上,采样电阻必须尽量靠近MOSFET的源极和地平面,采样走线采用开尔文接法,也就是把采样电压的感测线单独引到运放,不要经过大电流路径。很多新手直接在大电流铺铜上取信号,采出来的波形叠了一堆开关噪声,怎么调都调不干净。
2.2 运放选型:轨到轨、失调电压、带宽与增益
运放选型有四个硬指标:是否轨到轨、失调电压、带宽、摆率。
轨到轨很重要,因为低端采样信号的共模电压接近地。普通运放如果输入不能到轨,近零电流段就非线性,低速FOC直接失灵。我推荐至少选择输入输出轨到轨的运放,比如MCP6002、LMV358这类,价格便宜,diy完全够用。
失调电压是分流采样里最隐蔽的敌人。假设失调电压是2mV,采样电阻20毫欧,等效到电流就有100mA的零位偏差。FOC电流环对零位偏差很敏感,Iq有100mA的直流偏置意味着电机会发热、噪音大、力矩不平滑。高精度方案建议用零漂移运放(如OPA4376、MCP6V11那一类),价格贵一点,但电流环调起来省心太多。
带宽方面,PWM开关频率一般是10kHz到20kHz,运放带宽至少要2MHz以上,否则采样信号的建立时间和方波响应都会打折。摆率建议不低于1V/us,快速电流变化时才能跟得上。FOC项目里我踩过用LM358做电流采样的坑,LM358带宽不够,采出来的信号在高频段衰减严重,电流波形怎么看怎么别扭。
2.3 偏置与滤波网络的搭配,直接决定毛刺大小
低端采样电阻上的电压是单极性的,范围在0到几百毫伏。为了充分利用ADC量程,一般要加一个直流偏置,把信号垫到ADC量程中间。比如3.3V ADC,把零电流点偏置到1.65V,这样正负电流都能表示。
偏置电压一定要干净,最好由基准电压源或LDO单独供电分压,不要直接从MCU的VDD取,否则PWM开关动作会把噪声耦合进偏置里。我见过不少直接用3.3V分压做偏置的板子,示波器一量,偏置电压上全是一串毛刺,最后电流环根本没法收敛。
RC滤波是双刃剑。滤得太多,信号建立时间变慢,采样点还没稳定就转换,误差大;滤得太少,高频开关噪声直接进ADC。我的经验是,截止频率放在300kHz到1MHz之间,兼顾噪声抑制和建立时间。RC参数要按运放输出阻抗、ADC采样电容重新核算,不能随便抄网上参数。
具体取值我给个参考:假设运放输出串100欧电阻,再接1nF电容到地,截止频率约1.6MHz,建立时间在几百纳秒量级。这个组合对10kHz到20kHz的FOC够用,对大部分MCU ADC的采样窗口也友好。采样窗口小于RC五倍时间常数的时候,ADC采到的一定是错误值,这句话我建议每个做电机驱动的人都贴在自己工位上。
3. 结合STM32F103的FOC实现:时序是灵魂,ADC触发是关键
3.1 采样窗口计算:在一个PWM周期里什么时候采、能采多久
不管你用哪种方案,采样窗口的本质是:从保证下管导通(或有效矢量)的时刻开始,到矢量切换时刻为止,这中间的时间就是窗口。窗口里必须完成:信号通过RC的建立时间 + 运放摆率建立时间 + ADC采样保持时间 + ADC转换时间。
STM32F103的ADC是12位,ADC时钟最高14MHz,最短采样时间1.5周期加上转换时间12.5周期,一共14周期,理论最快约1us完成一次转换。但实际操作中我一般把ADC采样时间设为7.5周期或13.5周期,保证采样电容充满。这样一次转换需要大约1.4us到1.9us。如果是三电阻方案要三个通道同时采样,你还得看MCU有几个ADC:
F103RCT6是高密度型号,自带3个ADC。三电阻可以用ADC1、ADC2、ADC3分别采样三相,配合定时器触发实现同一次转换完成三相采样。如果芯片只有1个ADC(比如F103C8T6这类),三电阻就要用规则组注入组交替扫描,采样时刻就有轻微错开,精度打折扣。这也是为什么很多人拿C8T6做三电阻FOC后觉得效果一般——硬件上采样就不是同时的。
中心对齐PWM的中点是天然采样点。F103的高级定时器(TIM1和TIM8)支持中心对齐模式,设置更新事件或比较事件触发ADC。我习惯用定时器计数到中心值时触发ADC注入组,把三路通道配成注入组一次同时转换。注意触发方式选边沿触发,别选周期触发,周期触发时刻对不齐。
3.2 三电阻和双电阻的ADC触发配置要点
先说三电阻,在STM32CubeMX里配置流程大概是:TIM1设为中心对齐模式1或2,PWM频率定16kHz,三个通道输出互补PWM,死区时间按MOSFET驱动芯片的关断延迟去设(一般几百纳秒到1微秒)。然后ADC1/2/3的注入通道分别对应三路采样,触发源选择TIM1_TRGO。TIM1的TRGO事件要设为“计数器更新”或“计数器归零”,具体选“Update Event”或者“Center-aligned counter overflow/underflow”事件。
双电阻方案省一路ADC和运放,触发逻辑和三电阻类似,不过只要ADC1和ADC2两路注入采样。但要额外处理前面说的扇区边界问题。我实现的做法是:在每个PWM中断里实时判断当前扇区和调制比,当某一相采样窗口不足时,切换到另一组采样相组合,算缺失相。判断依据是SVPWM的占空比,也就是比较寄存器的值。这个值在PWM中断里可以实时拿到,算一下三路占空比的最小值,如果小于可安全采样的占空比阈值,就启用备用采样相。
这个逻辑看着简单,实际调起来坑不少。切换点附近电流容易跳变,需要加滞回,不能临界来回切。我最后加的滞回区是阈值上下各留3%到5%的占空比,开关切换频率才压下来。另外切换瞬间要做电流重构,把切换前和切换后算出来的相电流做一个一阶滤波过渡,不然力矩会有一顿一顿的感觉。
3.3 单电阻方案的两次采样与重构策略
单电阻采样对时序的要求最苛刻。因为每个PWM周期要采两次,而且这两次分别落在两个有效矢量的中间段。实现上一般用定时器比较通道来触发ADC:第一个比较值设定在V1有效矢量的中间点,第二个比较值设定在V2有效矢量的中间点。每次比较事件触发ADC注入通道采样。
第一次采样得到电流I_a,第二次采样得到电流I_b,第三相由二者取反相加得到:I_c = -(I_a + I_b)。这里有个前提:两次采样的电流必须是在同一个PWM周期内,如果因为时序抖动跨了周期,重构出来的三相电流相位就乱了,电流环会剧烈振荡。
为了满足采样窗口,单电阻方案几乎必做移相补偿。SVPWM开关序列里,如果某个有效矢量持续时间小于最小采样时间(我一般按3us算,含ADC转换和信号建立),就临时把另一相的占空比微调,把这个有效矢量“撑宽”。补偿的量后面还要从电压指令里减回去,不然电机输出电压会有偏差。
这部分代码要实现完整,涉及SVPWM生成、采样标记、移相量计算、电压补偿,代码量比双电阻多出一大截。如果只是学习,单电阻能帮你把FOC底层机制彻底搞明白;如果是要做产品,你得先算清楚省下的那一两颗电阻物料钱,够不够覆盖你多花几周的开发调试时间。
4. 三种方案横向对比:成本、精度、复杂度和适用场景
4.1 一张表讲透参数差异
下面这张表整理了我实际项目中对比过的数据,供选型参考。成本按小批量BOM估算,不含加工费;精度评价以我自己的示波器和电流探头实测为准。
| 对比项 | 三电阻采样 | 双电阻采样 | 单电阻采样 |
|---|---|---|---|
| 采样电阻数量 | 3 | 2 | 1 |
| 运放通道数 | 3 | 2 | 1 |
| 附加BOM成本 | 高 | 中 | 低 |
| PCB面积占用 | 大 | 中 | 小 |
| 三相电流同时性 | 好 | 较好 | 差(重构) |
| 低调制区性能 | 好 | 需补偿 | 需较大补偿 |
| 高调制区性能 | 好 | 需切换相 | 需移相 |
| 电流重构代码量 | 无 | 少 | 多 |
| 对ADC采样速度要求 | 中 | 中 | 高 |
| 采样噪声水平 | 低 | 中 | 高 |
| 典型场景 | 伺服、高端驱动器 | 通用FOC驱动 | 电调、电动工具 |
选型逻辑说白了就一句话:三电阻是花钱买时间和精度,双电阻是平衡,单电阻是在算法时间上省硬件钱。
4.2 不同应用场景怎么选:无人机、电动工具、家电、学习板
无人机电调是单电阻的天下,因为要往手臂里塞,PCB面积和重量都是硬约束;而且高速电机主要在中等以上调制区跑,单电阻的盲区问题不常触发,加上飞控对电流精度要求主要是堵转保护和母线功率估算,不会拿相电流去做特别精细的力矩环。这个场景里,单电阻能省下每路几毛钱的运放和电阻,对出货量大的产品就是纯利润。
三段式电动工具(电钻、角磨机)用的最多是单电阻或双电阻。电动工具电流大、冲击大,采样电阻选型要按堵转电流算。这类产品对成本极度敏感,电流环只需要保证堵转保护和基本恒功率输出,不需要太高的低速性能。但如果要求低速带载钻孔的平滑性,单电阻会露馅,这时候宁可用双电阻加扇区切换方案。
家电里的风机、泵类,转速相对稳定、负载变化平缓,双电阻是最常选方案。开发量适中,代码好维护,产品迭代的时候换MCU也不用动太多采样逻辑。如果家电主打“静音”卖点,对低速风噪和转矩脉动有要求,三电阻会是更好的选择,但BOM成本会高出一截,需要产品经理点头。
学习板和DIY项目,我强烈建议从双电阻入门。三电阻的PCB布线和三路ADC配置对新手门槛不低,很多同学第一版板子焊完根本采不出像样的波形;单电阻的时序和移相算法又太劝退,很容易打击信心。双电阻是最能在“一个月内把电机转起来、波形调好看”的方案。我自己带过几个实习生,从双电阻上手,一周内就能看见FOC的电流波形在示波器上转成圆形,那种成就感对新入行的人来说太重要了。
4.3 低成本不等于低技术,单电阻的平替思路
单电阻方案的“低成本”,本质是把硬件成本转移到算法和调校上。很多刚接触的人以为省掉两颗电阻和运放是白赚的,结果花了一个多月调移相补偿,回头算算工时,还不如多花两块BOM成本来得划算。这账要会算。
如果你确实要上单电阻,我建议在硬件上做两件事来降低算法压力:一是采样电阻选大一点,比如30毫欧到50毫欧,让信号幅度不至于太小;二是运放带宽留足余量,别用那种刚好1MHz的,选3MHz以上的,为信号建立争取一点时间。这两点能让你在移相补偿时稍微“奢侈”一点,不用把窗口压到极限。
另外一个常见的平替思路是“双电阻母线采样”混合模式:正常工作时用双电阻,在低调制区把采样切到母线单电阻。这种模式在电机控制论坛里偶尔能看到,实际产品中确实有人这么做,介于双电阻和单电阻之间的成本,性能接近双电阻。但实现复杂度不比纯单电阻低多少,除非你是想练手,否则不推荐为省一颗电阻去碰这个。
5. 调试中踩过的坑与排查实录
5.1 常见问题速查表
调试无刷驱动,问题千奇百怪,但追根溯源,一半以上落在电流采样环节。我把这几年来被问得最多的问题整理成一张速查表:
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 电流波形毛刺巨大 | RC滤波不足、采样点离开关沿太近 | 示波器看运放输出,确认采样点是否避开死区和振荡 |
| 低速力矩抖动 | 采样窗口不足、重构相切换跳动 | 检查低调制区采样窗口时长,候选项切换是否带滞回 |
| 电机空载正常、带载转速骤降 | 电流采样增益偏大触发过流保护 | 用电流钳实测校准,确认采样增益和过流阈值 |
| FOC运行几分钟后电流零位漂移 | 采样电阻温漂、运放失调温漂 | 断电摸电阻温度,换低温漂电阻或零漂移运放 |
| 三电阻只转3000rpm以上才正常 | 低速时零矢量窗口太短 | 检查PWM频率与ADC采样时间的总窗口预算 |
| 单电阻电流重构后波形畸变 | 两次采样跨PWM周期、移相补偿未回减 | 用逻辑分析仪确认两次采样时刻在同一周期内 |
排查这类问题,我始终奉行一个原则:先看硬件波形,再动软件参数。很多新手一上来就调PID增益,但电流波形本身是一团乱麻,调再久也是白费。示波器夹到运放输出,看采样点前后几百纳秒的波形,就能定位八成问题。
5.2 几个印象深刻的实际案例
说一个我印象最深的双电阻调试案例。当时给一个客户做无刷水泵驱动,双电阻方案,低速时电机发出明显的嗡鸣声,电流波形在示波器上像锯齿。查了两天没头绪,最后发现是低调制区某一相的采样窗口实际只有400ns,ADC却配置了1.5us采样时间,采的其实是窗口关闭后的电容残留电压。解决办法也简单:把调制比低于15%时的PWM频率从16kHz降到10kHz,采样窗口变宽,波形立刻干净了。这个案例告诉我,PWM频率不是越高越好,要在开关频率和最小可采样占空比之间找平衡。
还有一个三电阻的地线坑。客户反馈说电机转起来偶尔会复位重启,查了很久发现是采样电阻的地回流路径和MCU的地之间存在高di/dt引起的电位差,采样信号被抬高,触发了硬件过流保护。把功率地、采样地、控制地做单点隔离并加磁珠后,问题消失。这类问题原理不复杂,但PCB布局不佳时极难定位,调试时很容易误判成干扰或程序bug。
单电阻方案的坑我也写过不少。有一次给客户做压缩机驱动方案,初始板用单电阻,每次压缩机启动瞬间都会失步。用示波器抓母线电流波形,发现启动时电流突增导致采样电阻上的换向尖峰幅值超过运放输入范围,运放瞬间饱和,重构出来的相电流全是错的。后来在运放输入端加了一个针对死区尖峰的窄脉冲过滤电路,尖峰被限制住,启动恢复正常。这个案例说明,单电阻方案的采样点位置必须紧跟死区结束后的第一个稳定电流段,而这个稳定时间窗口在低阻抗负载场景下非常窄。
我自己总结的调试顺序也很简单:先确认三个电阻的静态偏置电压正常(在ADC量程中点,没有短路和断路);然后手动给定恒定占空比,不闭环,确认三相电流采样值基本平稳、三相之和为零;再开电流环,看Iq和Id是否稳定;最后才上速度环。每一步都在上一层确认正常后再往下走,能省下大量排查时间。
最后补一个个人建议:做电机驱动研发,别把PCB上那点采样电阻成本抠到极限,但也不必动不动就上三路高精度运放。把你的应用场景、开发周期、目标成本三者列出来逐项打分,再去选方案。如果实在拿不准,双电阻加扇区切换是通用性最好的起点,大多数项目都能兜住。