拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FOC单/双/三电阻电流采样方案对比与避坑指南

FOC单/双/三电阻电流采样方案对比与避坑指南

做FOC控制的工程师,几乎没有人能在电流采样这一环上完全顺风顺水。不管是刚接触无感FOC入门、正在调一台PMSM无感FOC样机,还是用NXP平台做电机控制量产项目,第一道关卡都是把三相电流这口“地基”打好。标题里那句“单/双/三电阻电流采样方案全对比”之所以值得认真看,是因为从采样方案选型开始,后面整个调试链路——转子初始位置检测、无感启动、电流环带宽、波形质量乃至整机效率——都会被它牵住鼻子。这篇文章我会把三种方案的工作原理、工程折中以及我在NXP平台上踩过的坑一次性讲透,顺便聊一聊从电阻选型、运放调校到ADC触发窗口这些平时很少被系统性讨论的细节,希望读完你不需要再走一遍我当初的弯路。

1. 先把三种采样方案的本质差异讲清楚

单电阻、双电阻、三电阻,光听名字好像只是采样电阻数量不同,实际上它们在成本、PCB面积、采样精度、算法复杂度上的差别非常大,而且直接影响你后续代码怎么写。

1.1 三电阻采样:最直观,但ADC通道和PCB面积都吃紧

三电阻采样的做法是在电机驱动器的每个桥臂低边MOSFET源极和地之间串联一颗采样电阻,三颗电阻分别对应A、B、C三相。FOC控制需要两相电流就能算出第三相,但三电阻方案并不满足于“能算出来”,它的核心理念是直接把三相电流都测出来,即便某一相出现问题也能快速察觉。

实现原理上,SVPWM通常采用PWM中心对齐模式,在一个PWM周期内,会存在两个零矢量(000和111)以及两个相邻的有效电压矢量。三电阻的采样窗口通常放在零矢量期间——当三个低边管全部导通时,三相电流分别流过各自的采样电阻,此时用ADC同时(或交替)采集两路,再利用基尔霍夫电流定律算出第三相。

这个方案的优势非常明显:

  • 电流波形还原度最高,低转速和小电流下也扛得住,特别适合需要高动态响应的伺服、机器人关节等场景。
  • 采样时刻选择相对宽松,不一定非要让PWM占空比保持很大,只要零矢量时间足够就能正常采样。
  • 对算法工程师最友好,电流环调起来不容易被“采样重构误差”这个变量干扰。

代价是硬件成本最高:三颗毫欧级采样电阻、三路运算放大器、至少两路ADC同时采样通道,PCB上还要为每相留出独立的采样走线。如果NXP主控的ADC通道数不够、或者没有两个ADC模块可以同步触发,三电阻的优势就发挥不出来,反而把自己卡住了。

1.2 双电阻采样:省一路运放,但欠调制区间会露马脚

双电阻采样是当前量产电机控制器中使用最广的方案,NXP很多参考设计默认就是这个结构。它只采样A、B两相的下桥臂电流,C相电流通过“Ia + Ib + Ic = 0”推算得到。

问题在于采样窗口的选择变了。三电阻是在零矢量期间采样,双电阻因为缺了一颗电阻,零矢量时只能测到两相,所以它必须在两个不同的有效电压矢量作用区间内,分别采样两相电流。

以中心对齐PWM为例,一个PWM周期内先经过矢量U1(例如100),然后是矢量U2(例如110),这两个矢量作用期间,桥臂开关状态不同,流过下管采样电阻的电流也不同。双电阻方案就是在U1期间采样A相电流,在U2期间采样B相电流,两个采样点都必须在有效矢量时间窗口内完成。

这个方案的成本比三电阻低,精度也比单电阻好,但有一个很现实的限制:空间矢量调制在扇区边界附近会出现某一矢量作用时间极短的情况,比如过调制深度较高时,某个有效矢量窗口可能小于“死区时间 + 运放建立时间 + ADC采样时间”,此时采样窗口不够,电流重构精度就会迅速劣化。我后面会专门讲这部分在NXP平台上的扳手腕过程。

1.3 单电阻采样:成本最低,但把复杂度全部转移给了软件

单电阻采样只在直流母线负端串联一颗采样电阻,利用开关状态的变化,在不同时间窗口内测量流经母线的电流,再通过扇区状态表和占空比信息重建三相电流。从成本、Layout面积、器件数量来看,它几乎是最极致的选择,特别适合电动工具、小家电这类对BOM成本极度敏感的场合。

代价一是算法复杂度显著上升。单电阻方案必须在两个不同的PWM矢量作用区间内分别采样母线电流,然后映射到对应相,整个过程要求PWM触发时序非常精确;如果某个矢量作用时间太短、无法完成一次可靠采样,还会出现不可观测区间,需要额外做移相补偿甚至脉冲注入。

代价二是电流环带宽与载波频率更容易受限。单电阻重构的采样点分布在PWM周期的不同位置,电流信息的“新鲜度”不如三电阻方案,动态响应会打折扣。另外,它对采样电阻的精度、温漂乃至PCB寄生参数都更敏感,因为“一颗电阻测三相”本质上是在靠算法补硬件,容错空间小得多。

下面用一个表格把三种方案的关键差异摆在一起。

维度三电阻双电阻单电阻
采样电阻数量3颗2颗1颗
运算放大器数量3路2路1路
每周期采样次数1次(可同时采两路)2次不同矢量2次不同矢量
电流重构复杂度低,可直接测三相中,需推算第三相高,需按扇区映射
不可观测区几乎无扇区边界/高调制比时出现多个矢量窗口受限时出现
采样精度下限高,零矢量窗口内稳定中,小占空比时劣化较低,对时序和噪声敏感
硬件成本高中低
典型应用伺服、机器人、高性能驱动新能源汽车、工控、通用变频电动工具、家电、低端方波替代场景

看这个表格就能明白,方案选型并不是“越贵越好”,而是要看你的应用在哪一档:追求极致动态响应,三电阻是底线;兼顾成本与性能,双电阻最稳妥;预算死死卡住,单电阻也能做,但你要做好在算法和调试上多投入的准备。

2. NXP平台上的ADC触发配置与采样窗口避坑

理论讲完落到实操。NXP的电机控制平台(比如S32K1系列、i.MX RT系列)在PWM触发ADC这件事上给开发者留了非常灵活的配置空间,但灵活的另一面就是“配置不好就翻车”。

2.1 PWM触发ADC的时序设计:延迟时间不能拍脑袋定

电流采样最关键的问题是什么时候触发ADC。太早,MOS管开关振铃还没结束,运放输出没有稳定;太晚,采样窗口可能已经关闭,或者测到的电流不是当前周期的真实值。

NXP的PWM模块(如FlexTimer的PWM子模块)可以通过脉冲触发输出(PTO)产生ADC触发事件,ADC可以配置为PWM触发启动转换。这里有一个需要自己确认的关键参数:触发延迟时间,也就是从PWM边沿变化到ADC真正开始采样的间隔。

这个延迟时间至少应该包含三部分:

  • 死区时间:避免上下桥臂直通而插入的延迟,比如0.5us到2us;
  • 功率器件开关振铃时间:MOSFET或者IGBT在开关瞬间产生的振铃通常持续几百纳秒;
  • 电流采样运放的建立时间(settling time):运放从输入阶跃到达规定精度所需时间。

我踩过的一个坑就是:刚开始直接把触发延迟设成了零,结果ADC采样点正好落在PWM切换后的振铃里,三相电流波形上叠加了一大堆毛刺,电流环一上PI增益就啸叫。

调整思路如下:

// 伪代码:以S32K1系列FlexTimer + ADC为例,示意触发延迟的配置逻辑 // 采样窗口 = 死区时间 + 开关振铃时间 + 运放建立时间 + 裕量 #define DEADTIME_NS 1000U // 1us 死区 #define SWITCH_RING_NS 300U // 开关振铃约0.3us #define OPA_SETTLING_NS 800U // 运放建立到0.1%约0.8us #define SAFE_MARGIN_NS 400U // 兜底裕量 #define SAMPLING_DELAY_NS (DEADTIME_NS + SWITCH_RING_NS + OPA_SETTLING_NS + SAFE_MARGIN_NS)

当然,实际芯片的寄存器配置方式因型号而异,这里更重要的是传达一个思路:触发延迟不是随便填一个寄存器值,而是要根据你板子上功率管和运放的实际参数去算,最好再用示波器验证一下运放输出波形,确认ADC转换时刻已经落在稳定平台上。

2.2 最小可采样占空比的计算:欠调制区间的硬约束

双电阻和单电阻方案都遇到同一个问题:有效矢量作用时间太短时,没法完成可靠采样。以双电阻为例,假设PWM频率是16kHz,周期62.5us,如果某个有效矢量只持续1us,而你需要“死区1us + 运放建立0.8us + ADC采样1.2us = 3us”才能得到准确结果,那这个矢量窗口就是不可用的。

这里有一个实用的估算公式:

最小有效矢量时间 = 死区时间 + 运放建立时间 + ADC采样时间 + 保护裕量

换算成占空比约束,就是该矢量对应的PWM比较值不能小于某个寄存器阈值。NXP参考代码里通常会有PWM占空比限制宏,比如强制每个通道的占空比保持在某个范围内,例如:

// 示意:限制PWM最小比较值,保证双电阻采样窗口 #define PWM_MIN_COMPARE 120U // 对应的最小有效矢量时间约3us #define PWM_MAX_COMPARE (PERIOD - PWM_MIN_COMPARE)

这个阈值到底设多少,取决于主频、PWM计数周期和你自己的采样时序参数。我自己的经验是:先把阈值往宽了设,让系统稳定跑起来,再慢慢往小调,观察电流波形是否出现周期性畸变,一旦出现就说明采样窗口已经贴到极限了。

2.3 我用S32K1实测时遇到的两个典型问题

第一个问题是空载正常、带载启动时电流波形突然乱掉。排查了半天,最后发现是启动瞬间母线电压跌落导致PWM占空比突然拉大,进入过调制区域,某些扇区边界上的有效矢量窗口变得非常窄,双电阻的第二次采样落到了不可观测区间。解决方法是限制最大调制深度,同时给采样触发加上“窗口最小时间检查”,如果检测到窗口不足,就跳过本次采样、沿用上一周期的电流值做Clarke变换。

第二个问题是低速运行时相电流有周期性偏置。这个更隐蔽:低速时反电动势很小,电流主要靠电阻压降维持,波形接近正弦但幅值很低,而采样电阻上的压降可能只有几十毫伏,运放零点漂移和ADC量化误差被放大得非常明显。后来通过两个手段解决了:一是在无感FOC的零速/低速段用高频注入或者I/F启动策略,把电流工作点抬高;二是做一次硬件校准,上电后不驱动电机时把运放零点读出来,在软件里消偏。

3. 从电阻到运放再到PCB的硬件暗坑

很多调不好电流环的问题,往深处查,其实是硬件设计阶段埋的雷。这一节我把最容易翻车的三个硬件细节单独拿出来说。

3.1 采样电阻选型:阻值、温漂和功率三者怎么权衡

采样电阻的阻值选择直接影响信噪比和损耗。阻值大,采样信号强,但发热严重,而且温漂会让增益漂移;阻值小,损耗低,但信号太弱,运放增益要拉得特别高,噪声也跟着被放大。

我常用的选择范围在0.01Ω到0.02Ω之间,具体由母线电压和最大相电流决定。比如最大相电流50A,用0.01Ω电阻,满载压降0.5V,采样功率0.25W,选额定功率1W的电阻还算安全。此时运放如果要放大到ADC满量程附近的3.3V,需要的增益是6.6倍,考虑峰值裕量,实际设计一般在10到20倍之间。

温漂问题容易被低估。一颗采样电阻从冷态到满载温度升高50℃,如果温漂系数是75ppm/℃,阻值漂移接近0.4%,映射到电流环增益上就可能让转矩波动肉眼可见。量产设计建议选用合金电阻或低TCR贴片电阻,优先选择温漂在50ppm/℃以下的型号,不要因为省几分钱把电流环精度搭进去。

3.2 运放带宽和建立时间:采样精度的“隐形天花板”

很多人都知道选低失调电压的运放,但容易忽略带宽和建立时间的匹配。FOC电流采样本质上是在PWM开关切换后,等运放输出稳定到ADC精度所需误差带内,才去启动ADC转换。如果运放带宽不够,输出建立过程拖得很长,你前面算好的采样窗口就白搭了。

我踩过的典型案例是:用了一款增益带宽积只有1MHz的通用运放,放大倍数20倍,等效闭环带宽只有50kHz,PWM切换后的阶跃信号要到5us以上才能稳定到0.1%精度。结果我被迫把PWM频率从20kHz降到10kHz才勉强留出采样窗口,系统动态性能大幅缩水。

建议是:FOC电流采样运放选择增益带宽积至少5MHz到10MHz以上,压摆率不低于5V/us,并且要实际测量运放输出在小信号阶跃下的建立时间,而不是只看数据手册标称值。NXP评估板上常用的运放方案普遍是这一档,可以直接参考。

3.3 PCB布局:采样走线和地平面处理的实战记录

采样电阻和运放之间的走线,讲究的是“越短越好、越对称越好”。采样电阻最好紧贴MOSFET源极引脚,不要让大电流走线绕一个圈之后再回到采样电阻,否则采样电阻检测到的电压会包含额外铜箔上的压降和寄生电感产生的尖峰。

地线处理上,NXP的电机控制参考设计通常把功率地和模拟地分开走,在运放地引脚附近单点连接。这个单点连接位置要特别注意:如果接在采样电阻的地端,会引入功率地噪声;如果接在ADC参考地附近,又可能造成地弹压差。我在一个双电阻方案里遇到过一次采样波形在开关边沿出现严重负尖峰,后来就是把模拟地和功率地的单点连接点从采样电阻地端挪到了靠近MCU的ADC参考地端,负尖峰直接消掉了。

另外一个容易被忽视的PCB问题是采样电阻两端的开尔文连接。大电流走线会引入几十毫伏的误差电压,而开尔文接法用独立的细走线把采样电压引到运放输入端,能有效规避这个问题。没有条件做开尔文时,至少要让运放差分输入的两个引脚走线保持等长等距,做成“双胞胎走线”,这样共模噪声可以在运放输入端被抵消掉一部分。

我把这些硬件问题整理成一个排查表,方便对照。

现象可能原因排查方法对策
相电流波形有开关频率毛刺采样时刻落在MOS管振铃期示波器观察运放输出加大触发延迟、优化驱动电阻
电流波形厚度周期性波动采样窗口进入欠调制区用FreeMASTER或DAC观察重构电流限制定最大调制深度
小电流时电流波形为“肥肉状”运放零点漂移明显测量零电流时的运放输出软件消偏或选低失调运放
低速转矩波动明显采样电阻温漂导致增益漂移监测电阻温度变化换低TCR电阻
某一路采样值明显偏低PCB走线寄生电感过大检查采样电阻两侧走线开尔文接法最短走线

4. 单电阻重构的盲区与双电阻欠调制区的工程处理

算法层面的问题如果处理不好,前面硬件做得再扎实也可能白搭。这一节聊两个最核心的工程难点:单电阻为什么会有不可观测区,以及双电阻在欠调制区间会怎么劣化。

4.1 单电阻“不可观测区”到底是怎么来的

单电阻重构的前提,是在一个PWM周期内找到两个不同的开关状态,分别测量母线电流,再根据开关状态映射回相电流。假设第一个矢量是100,此时母线电流等于A相电流;第二个矢量是110,此时母线电流等于C相电流的反向值,于是A相和C相都有了,B相通过基尔霍夫定律算出来。

问题在于:当某个矢量的作用时间太短时,ADC来不及完成一次可靠采样,此时该矢量对应的那一相电流就无法得到。如果两个有效矢量窗口都足够长,一切顺利;如果其中一个矢量窗口小于最小采样时间,当前周期就少了一个关键信息。更极端的情况是,在某一扇区边界附近,两个有效矢量同时变得很短,整个PWM周期内根本找不到两个可用的采样窗口。

这种情况叫“不可观测区”。它不只是算法上的麻烦,物理上它对应的是“某几相电流确实没法通过母线电阻直接测到”的区间,单纯提高ADC采样速度只能缓解,不能根除。

4.2 移相和矢量注入补偿:两种常见破解思路

破解不可观测区的思路,本质是让原本过短的矢量窗口变长,或者把采样点换到其他可用的时间窗口。

第一种是移相补偿。通过微调PWM比较值,人为制造一个最小采样窗口。比如原本U1矢量窗口只有1.5us,不足以采样,那就把U1略微拉长,同时缩短相邻的零矢量时间,这样U1窗口被“挤”到2.5us,能采了,代价是实际输出的电压矢量发生微小偏差,需要在变换里反推修正。

第二种是矢量注入。当检测到某个周期处于不可观测区时,额外插入一个已知的小矢量,在这个插入的矢量内完成采样,然后在下个周期把多注入的伏秒积扣除。这种方法更狠,效果更直接,但会让相电流波形里出现轻微的“沟槽”,对电流总谐波失真有一点影响。

我在NXP平台上实现时采用的是“移相为主、极端扇区边界辅以矢量注入”的组合策略:正常情况靠移相补偿保证最小窗口,当调制比很高、移相补偿已经补偿不出足够窗口时,才触发矢量注入逻辑。这套组合在我的PMSM压缩机项目上把最低可运行转速从800rpm降到了200rpm,代价只是代码里多了一个状态分支。

4.3 双电阻在欠调制区间也会“虚”

很多人以为双电阻比单电阻稳妥,就不用管不可观测区了,其实在深度过调制和扇区边界附近,双电阻一样会遇到有效矢量窗口不足的问题,只不过概率和范围比单电阻小很多。

我在一个风机项目里遇到过这样的现象:转速升到额定值附近时,转矩波动突然变大,相电流波形开始出现半个周期左右的不对称。抓FreeMASTER波形之后发现,问题出在扇区切换角附近,某个有效矢量的窗口被调制比压缩得只剩2us左右,而我的最小采样需求是3us,导致该扇区边缘处电流重构值发生了跳变。

双电阻的常用处理方式有两种:

  • 限幅式处理:在调制深度接近极限值时,主动把PWM占空比“削峰”,避免进入欠调制区,这种方式最简单,但会牺牲一小部分母线电压利用率。
  • 变采样点处理:当检测到某个矢量窗口不足时,将采样点转移到另一个窗口,并通过软件修正获取电流的时序差异,这种方式更优雅但需要处理时间补偿。

从我个人的项目经验来说,如果母线电压利用率不是极端敏感指标,优先用限幅式处理更稳,因为采样点切换会引入周期性的延时偏差,在高速弱磁控制场景里容易变成高频抖动源。

5. 用NXP调试工具链看波形的实战经验

代码和硬件都落地之后,剩下的事情就是不断调参和看波形,这一步的效率直接决定项目能不能按时交付。NXP给电机控制开发者提供了MCAT(Motor Control Application Tuning)和FreeMASTER这组工具,把很多原本需要反复烧录代码的调试工作变成了在线操作。

5.1 MCAT和FreeMASTER的配合用法

MCAT工具负责的是参数化整定。在NXP的电机控制库里,你可以通过MCAT界面直接修改电流环Kp、Ki、速度环参数、PWM频率、采样方式等关键项,并不需要每次修改都重新编译下载固件,这在我做无感FOC启动策略调试时节省了大量时间。

FreeMASTER则相当于一个实时示波器面板,可以实时观察速度反馈、转子角度、三相ADC原始值、Clarke变换后的Ialpha/Ibeta、PI控制器输出等中间变量。我习惯把以下信号放到同一个观察列表里:

  • 三相原始ADC采样值和重构后的相电流
  • PWM一个周期内的采样点位置标记
  • 速度环输出和转矩电流Iq实际值
  • 速度估算模块的角度误差和观测器收敛标志

一套组合拳下来,大多数问题是能在10分钟之内定位到“硬件层面还是算法层面”的。

5.2 三个高频异常波形和它们的真实原因

看波形不能瞎看,我总结了自己踩过三次坑的三个典型场景。

第一次,三相重构电流中有一相呈现正弦状但幅值偏低,另外两相还算正常。当时以为是传感器问题,测了硬件才发现是那一相的运放零点被PCB铺铜的某种寄生耦合拉到偏了,重新调整PCB布线后才恢复。如果你看到固定某一相异常,优先怀疑那一相的硬件信号链,而不是算法。

第二次,双电阻方案在低速轻载时,重构电流出现明显的“台阶状”失真。原因是低速轻载时电流很小,但死区时间相对占空比而言占比不小,死区效应造成的非线性失真被双电阻采样点直接采了进去。后来在软件里增加了死区时间补偿,台阶消失,低速转矩波动也从肉眼可见变成几乎感知不到。

第三次,单电阻方案频繁出现过流保护误触发,但示波器测母线电流又看不到明显过流。排查后发现是采样点正好落在PWM高压侧开关造成的共模干扰尖峰上,ADC偶发采到很大的瞬时值。解决方法是增加ADC过采样加数字滤波,同时对硬件采样线路增加RC滤波(截止频率选在1MHz到3MHz之间),误触发率直接降为0。

如果你在调试中也遇到类似的“说不清道不明”的波形问题,不妨先对照这三个场景自查一遍,很多时候问题就是同一个套路。

6. 我的选型结论与最后几条建议

从纯工程角度,我的选型结论其实很直白:

  • 如果做的是伺服、机器人关节或者任何对低速性能和动态响应有硬性要求的项目,直接上三电阻方案,不要犹豫,省下来的那点硬件成本会在调试周期里加倍赔回去。
  • 如果做的是风机、水泵、压缩机这类对成本有要求、对低速性能又有一定要求的中高端应用,双电阻方案是投入产出比最高的选择。NXP参考设计里的默认配置基本就是这个方案,周边生态最成熟。
  • 如果做的是电动工具、低端家电这类极致成本导向的场景,单电阻方案可行,但一定要预留足够的软件资源来处理重构盲区,并且不要对低速性能抱太高期望。

最后分享一个我这两年一直在用的调试顺序,顺序本身比每一步的技巧更重要:先验证硬件信号链(用示波器量运放输出、确认采样窗口),再用MCAT把电流环调到稳定,接着做位置估算器收敛调试,最后才去碰无感启动和带载测试。这个顺序看起来缓慢保守,但实际上是最快能走到量产阶段的路径。

电流采样方案这个话题说大不大,说小不小,但它确实像一块多米诺骨牌的第一张——选型正确、布局合理、时序算明白,后面FOC调试就是一路顺畅;如果第一张牌推倒了,后面所有算法优化都会变成在沙地上盖楼。希望这篇文章能把你在电流采样这条路上可能踩的坑提前标记出来,让你少走一段我走过的弯路。

返回列表