做FOC调试这些年,我最深的感受是:炸机不可怕,可怕的是不知道为什么炸。而十次炸机,有七八次都跟电流采样脱不了干系。你可能已经把SVPWM扇区推导背得滚瓜烂熟,PI参数也算得头头是道,但只要电流采样在这个链路里掉链子,最后的结果大概率是功率管烧穿、驱动板冒烟、项目周期被硬生生拉长两周。
这篇文章就是把FOC最底层的电流采样这件事掰开揉碎讲清楚,重点围绕中心对齐PWM模式下的单电阻、双电阻、三电阻三种采样方案——它们各自的采样窗口怎么算、ADC触发时刻怎么卡、硬件上哪些细节决定生死。无论你是刚入门FOC的小白,还是已经调了很久但总觉得电流波形不对的老兵,这篇文章都值得你静下心看完。
1. 别急着焊板子:先搞清楚电流环的信誉问题
1.1 炸机链条:从一次错误的采样值开始
大家都喜欢讨论FOC算法本身:Clark变换、Park变换、SVPWM、无感观测器……这些固然重要,但很多人忽略了一个前提——FOC本质上是一个电流闭环系统,它的控制品质完全取决于电流反馈信号的质量。想象一下你在开车,眼睛看到的车速表如果比实际速度慢了20%,你一定会持续踩油门,最后的结果是什么?超速、发动机过热、甚至失控。
电机控制里完全一样。当采样到的电流值比实际电流小时,电流环的PI控制器会以为"电流还没到位",于是继续增大占空比输出,实际电流一路飙升,超过MOSFET的耐受极限。功率管的击穿是微秒级的,等你反应过来已经晚了。这不是危言耸听,我做驱动板调试时,第一次炸管就是这种链条:采样电阻虚焊,导致ADC读到的电流只有真实值的一半,我还以为是PI参数不够激进,结果一加大Kp,MOSFET直接裂开。
所以,炸机的根源很少是算法本身,而是采样链路"撒谎"了。要保证电流环不发疯,先得保证每一次采样值都真实可信。这个可信度,取决于三个环节:采样电阻网络是否准确、ADC触发时序是否正确、滤波与保护链路是否有兜底。
1.2 三种采样拓扑的定位:成本、精度、风险的三方博弈
在聊具体搭建之前,先摆清楚单电阻、双电阻、三电阻这三种方案在工程上的定位。这决定了你在立项之初就该怎么选型,而不是等做完了再回头改。
| 指标 | 三电阻 | 双电阻 | 单电阻 |
|---|---|---|---|
| 采样电阻数量 | 3 | 2 | 1 |
| 运放数量 | 3 | 2 | 1 |
| ADC同步要求 | 需3通道同步采样 | 2通道同步或接近同步 | 1通道,但需两次分时采样 |
| 三相电流获取 | 直接全采样 | 两相采样 + 基尔霍夫计算 | 两个矢量时刻采样 + 计算 |
| 低调制区表现 | 好 | 较好 | 差,存在采样盲区 |
| 实现复杂度 | 低 | 中 | 高 |
| 典型应用场景 | 高端伺服、机器人关节 | 中端工业驱动、电动工具 | 低成本无人机、消费类电机 |
这张表背后的逻辑,本质上是"用钱换时间,还是用代码换钱"的选择。三电阻方案最朴实,硬件成本最高,但控制软件最省心;单电阻方案硬件成本压到极限,但软件上要处理一堆采样盲区和重构误差,调试周期长得多。如果你做的是量产消费级产品,单电阻可能是唯一选择;但如果是做伺服驱动精度要求高的场合,三电阻几乎是必须的。
2. 中心对齐PWM留给采样的时间窗口,到底有多少?
2.1 FOC为什么普遍选中心对齐而不是边沿对齐
FOC里绝大多数主控都用中心对齐PWM(也叫三角载波PWM),而不是边沿对齐,这件事不是拍脑袋定的。中心对齐模式下,PWM波形在一个周期内是对称的,三相电流的纹波比边沿对齐小很多,谐波成分里偶次谐波和直流分量更少,电机的转矩脉动、噪声和振动都更低。
对电流采样来说,这个对称性还有一个隐藏好处:在三角载波的波峰和波谷——也就是定时器计数到ARR值或计数到0的时刻——三相的PWM输出状态都是确定的。当三相占空比都没有到100%时,在这个时刻三相下桥臂会同时导通(或者刚进入死区前/后的某个确定性状态)。这种"确定性"是三电阻和双电阻采样的命根子。
反面教材我也见过有人用边沿对齐做FOC,不是不能转,而是电流波形毛刺多、谐波大,采样点稍微偏一点就采到开关噪声里,光靠软件滤波很难压干净。所以除非你只是做教学演示,否则请老老实实用中心对齐。
2.2 采样窗口的计算:占空比、死区、ADC时间的博弈
中心对齐模式下,某一相下桥臂的导通时间由占空比决定。假设PWM周期为 T_pwm,某相占空比为 D(上桥臂导通比例),则一个完整周期内下桥臂的总导通时间为 (1-D) × T_pwm。注意,这个导通时间被分成前后两半,分别位于三角波的下溢和上溢附近。
在三电阻或双电阻方案中,最关键的采样时刻就在下溢或上溢附近。此时所有目标相的下桥臂都处于导通状态,采样电阻上有电流流过。但这里有一个约束:我们必须保证在采样电阻上的电流已经稳定之后,ADC才开始采样。这个"稳定时间"包含三部分:死区时间 T_dead、RC滤波建立时间 T_settle、ADC采样保持时间 T_sample。
举个实际算例。PWM频率20kHz,周期 T_pwm = 50μs。某相最大占空比限制为95%,则下桥臂导通时间为 50μs × 5% = 2.5μs。死区设置为500ns,RC建立时间按五倍时间常数算约500ns,ADC采样时间为300ns。三项加起来:0.5 + 0.5 + 0.3 = 1.3μs。2.5μs的窗口放得下1.3μs的消耗,还有点余量。但如果最大占空比放到98%,下桥臂导通时间就只剩1μs,1.3μs的需求就会吃不消——这就是很多系统要限制最大调制度不超过95%的原因。
2.3 ADC触发点:上溢、下溢还是比较匹配?
很多人搞不清ADC到底该在哪个时刻触发。答案不是固定的"上溢"或"下溢",而是要看你的PWM极性和死区配置。核心原则是:ADC触发时刻必须落在下桥臂已经完全导通、且开关振铃基本结束的时间点。
最稳的做法是用定时器的比较通道(比如TIM1的CH4)来触发ADC,而不是直接用更新事件。原因是比较通道的触发点可以用CCR值微调,能够精确避开死区内和开关切换瞬间的振铃窗口。假设你希望在计数器下溢后300ns再触发ADC,而系统时钟配置为定时器计数频率120MHz,那么一个计数周期约8.3ns,300ns大约对应36个计数。把比较值设置为36即可。
下面是一段STM32中心对齐PWM下通过比较通道触发ADC的示意配置:
// TIM1中心对齐模式,PWM频率20kHz // 假设定时器时钟120MHz,PSC=0,ARR=2999 TIM1->CR1 &= ~TIM_CR1_DIR; TIM1->CR1 |= TIM_CR1_CMS_1; // 中心对齐模式2(或模式1,取决于需求) // 使用CH4比较触发ADC,比较值设在下溢后约300ns // 120MHz下,300ns约等于36个计数 TIM1->CCR4 = 36; // ADC1外部触发选择:TIM1_CH4 ADC1->CR2 |= ADC_CR2_EXTTRIG; MODIFY_REG(ADC1->CR2, ADC_CR2_EXTSEL, 0bXXXX); // 按实际芯片映射表配置提示:不要直接在上溢/下溢中断里手动触发ADC转换。中断响应有延迟,且延迟不固定,会导致采样点抖动。硬件触发才是最可靠的工程做法。
3. 三电阻采样:理论最直白,但细节也能坑人
3.1 拓扑与元器件选型怎么才不心虚
三电阻采样的电路拓扑并不复杂:在逆变器三个下桥臂功率管的源极(发射极)分别串联一个采样电阻,每个电阻两端接一个差分运放,放大后的信号送往MCU的ADC。三个电阻的电流正好代表三相电流 ia、ib、ic,一个PWM周期内同时采样三个通道就能得到完整的三相电流。
采样电阻的选型直接决定信噪比和损耗。阻值太小,信号微弱,运放的失调电压和噪声占比太大;阻值太大,电阻损耗和发热显著,效率下降。常见的选择范围是0.01Ω到0.05Ω。假设峰值电流30A,用0.02Ω电阻,采样电压为0.6V,经运放放大10倍到6V——如果ADC参考电压是3.3V,这个增益就太大了,需要重新匹配。所以选阻值时必须和运放增益、ADC基准电压一起联合计算,算完再留出至少1.5倍过流余量。
硬件上,运放建议选择带宽至少10MHz、压摆率不低于20V/μs的轨到轨放大器。FOC电流环的带宽通常在1kHz到5kHz,运放带宽太窄会引入相位延迟,影响电流环稳定性。我踩过一个坑:用了某款带宽只有1MHz的通用运放,静态测试没问题,一旦电流环带宽调到2kHz以上就开始震荡,花了两天才定位到是运放带宽不够。
3.2 时序配置:让ADC在正确的瞬间睁眼
三电阻采样的时序配置,需要在每个PWM周期的下溢或上溢时刻附近同时触发3个ADC通道进行采样。STM32的多个ADC支持注入组同步采样,或者用DMA把规则组的多个通道的转换结果搬运到内存,但规则组转换是顺序执行的,通道之间存在微小延迟。如果延迟发生在电流快速变化期,三个采样值之间会有相位差,重构出的电流矢量会有误差。
所以,三电阻方案建议使用多个ADC的同步模式(如STM32的ADC1/ADC2/ADC3注入同步),让三个通道在同一个触发边沿同时开始转换。如果芯片只有单个ADC,那就得权衡:是接受微小相位差,还是提高PWM频率来减小采样间隔占比。我的经验是,电流环带宽低于3kHz时,单ADC顺序转换的微小延迟带来的误差通常可以接受,但超过3kHz就最好上同步采样。
触发时刻的具体设置,我建议落在下溢事件之后一个固定延迟,如上文所述用比较通道微调。这样能确保运放输出已经建立稳定,又避开了桥臂开关切换的振铃区。
3.3 三电阻方案里的"假故障":为什么波形正常却老报过流
三电阻相对安全,但不是没有坑。最常见的一种"假故障"是:电机刚启动瞬间,某相采样电阻上的电压尖峰触发运放输出饱和,被ADC读到一个接近满量程的值,软件过流保护立刻动作,PWM被封锁。这种现象在电机堵转、或者反电动势相位偏转时特别容易复现。
排查起来也很费劲,因为用示波器看运放输出明明没有尖峰,可MCU就是能读到异常值。后来我用隔离示波器同时抓运放输出和实际MOSFET的Vds波形,才发现问题出在采样电阻的GND回路——采样电阻的功率地走线和运放信号地共用了同一条铜箔,功率回路中的寄生电感在开关瞬间产生了地弹噪声,刚好叠加到运放输出上。
解决方法是把功率地、采样地、信号地分开走,采样电阻到运放之间用开尔文连接(四线制)拉差分信号。这些布局细节我在后面第6节展开讲。总之,三电阻方案的"简单"是指控制逻辑简单,硬件上还是得按高频电路的标准来对待。
4. 双电阻采样:真正麻烦的从来不是算第三相
4.1 采样点受限问题:当某相下桥臂导通时间不够用
双电阻采样只在两个下桥臂(比如A相和B相)放采样电阻,第三相电流用基尔霍夫定律算:ic = -ia - ib。很多人一听觉得简单:三电阻少一路,软件里加一行减法而已。但实际上,双电阻真正的坑在于采样窗口的不均匀性。
在三电阻方案中,上溢/下溢时刻三相下桥臂都导通(只要占空比没到100%),所以三个采样电阻都能采到电流。但在双电阻方案中,如果A相占空比接近100%,A相下桥臂的导通时间会变得极短,可能短到不足以保证运放输出稳定建立和ADC完成采样。此时A相采样电阻上读到的电流值是不可信的。
那怎么办?一种思路是动态选择采样相:每个PWM周期里检查哪些相的下桥臂导通时间足够长,从中选择两相进行采样,第三相计算。这个方案有一个额外好处:可以让被计算的那一相电流在任意时刻都避开欠采样导致的误差。但代价是软件需要实时计算导通窗口长度,且要在两个不同的PWM半周期内组合出三相电流,给控制环增加了一个PWM周期的延迟。
4.2 重构第三相电流:公式1秒钟,噪声一整天
"第三相电流 = -a - b"这个公式在大一电路课就学过,但在实际的FOC控制中,它带来的噪声问题够你调一个月。
因为实际采样的两相电流不是理想值,它们各自带有开关噪声、运放失调和ADC量化误差。用两路带噪声的信号做加法和取反,第三相电流的信噪比只会更差——噪声是叠加的。如果采样电阻和运放的三路一致性再差点,静态时第三相电流可能显示出一个几十毫安的"虚假偏置",电机还没转,电流环就已经在较劲了。
我在一个双电阻项目里遇到过这样的现象:转速越低,电机的嗡嗡声越明显。抓波形发现第三相电流重构值(即计算出来的那相)比其他两相约高0.15A的偏置,且伴随随机噪声。后来把两路的零点校准掉,又做了对称的低通滤波,才把噪声压下去。所以双电阻方案对运放的零点失调和滤波对称性要求,其实比三电阻更高。
4.3 高调制区的策略:限制占空比、钳位还是移相?
双电阻方案在低调制区表现还算可以,但高调制区处理不好就是灾难。随着调制深度增大,总有一个相的占空比会接近100%,对应下桥臂导通时间不足,形成采样窗口缺失。此时三个选择:
限制最大调制度(比如限制相电压矢量的幅值在最大可输出幅值的95%以内)。这是最简单、最粗暴的做法,适用于对母线电压利用率要求不高的场合。缺点是会损失一部分母线电压利用率,高速弱磁场景下会明显限制转速。
采用PWM移相(Phase Shift)技术。把三相PWM的对称中心稍微错开,在三相之间人为制造一个固定的、足够宽的采样窗口。这个方案能保住母线电压利用率,但代价是电流纹波和谐波会增加,电机噪声和损耗也跟着上升。
占空比钳位(Clamping)加最小值限制。把某一相的占空比限制在某个最小值以上,牺牲一点波形质量换取足够的采样窗口。
我个人在实际项目里通常的做法是:优先限制调制度到95%左右,如果这时候高速区性能不够,再上移相法。直接一步到位做移相法会让开发周期拉长很多,不要一开始就追求极限。
5. 单电阻采样:一个电阻换来的复杂度暴增
5.1 两次采样重建三相的底层逻辑
单电阻采样是在直流母线正端或负端串联一个采样电阻,通过检测母线电流来间接获得相电流。它的原理依赖一个关键事实:在任意时刻,母线电流都可以用某种开关状态的相电流组合来表示。
以SVPWM第一扇区为例,一个PWM周期内的开关序列是 000 → 100 → 110 → 111 → 110 → 100 → 000。其中,矢量"100"表示A相上桥臂导通、B和C相下桥臂导通,此时母线电流等于A相电流 ia;矢量"110"表示A、B相上桥臂导通、C相下桥臂导通,此时母线电流等于负的C相电流(-ic)。于是,在一个PWM周期内,在"100"矢量作用期间采样一次,得到ia;在"110"矢量作用期间再采样一次,得到-ic;再通过基尔霍夫定律算出ib = -ia - ic。三相电流就这样重建出来了。
听起来很巧妙,但实际做起来,你会发现两个采样窗口都非常短,且出现的时间点还不固定,完全取决于当前矢量的作用时间。在中心对齐模式下,有效矢量在一个周期内会出现两次,所以窗口的调度稍微灵活一些,但依然脆弱。
5.2 采样盲区:为什么有些扇区怎么调都采不到
单电阻采样最大的难题是采样盲区(Sampling Blind Zone)。当某个有效矢量的作用时间太短,短到不足以完成"开关管导通稳定 + 运放输出建立 + ADC采样保持"这一整套流程时,这个矢量的窗口就无法用来采样。
盲区出现在两类场景。第一类是低调制区:此时目标电压矢量很小,对应的两个有效矢量作用时间都很短,无论怎么安排采样顺序,都可能采不到任何一个相电流。第二类是扇区边界附近:以一个扇区切换到相邻扇区为例,其中一个有效矢量的持续时间会趋近于零,同样导致采样窗口缺失。
盲区在物理上表现为:电机低速运转时,电流环反馈信号出现周期性缺失,实际电流波形坑坑洼洼,电流环带宽一高就震荡。很多做无感FOC入门的朋友在这块卡了很久——不是控制参数的问题,而是采样链路本身就"半瞎"。
5.3 工程上常用的补救手段及其代价
解决盲区,工程上常用的有三招。
第一招是限制调制深度。和双电阻一样,把调制度上限压低,确保有效矢量的持续时间不小于某个最小安全值。优点是实现简单,缺点是母线电压利用率受限,高速区性能打折。
第二招是移相法(Vector Shift / Sampling Shift)。在不改变目标电压矢量的前提下,把一个PWM周期内的开关序列的相位调整一下,把有效矢量的位置挪一挪,让原本过短的矢量持续时间被"凑"到足够采样。这个方法很常用,但会增大电流纹波和谐波,而且算法复杂度明显上升。
第三招是插入测量矢量(Measurement Vector Insertion)。当检测到即将进入盲区时,在SVPWM序列中额外插入一个已知的开关状态,人为制造出宽一点的采样窗口。这个方法对调制度的损失较小,但会引入额外的开关噪声和损耗,同时需要修改SVPWM的生成逻辑。
单电阻方案没有标准答案,不同的控制策略、PWM频率、电机参数,适合的补盲方法都不一样。我的建议是:先把限制调制深度跑通,再逐步加入移相法或插入法。一上来就实现完整补盲算法,会把自己绕进debug的泥潭。
6. 硬件底层那些决定生死的细节:运放、滤波、布局、保护
6.1 采样电阻和运放怎么选才算"不心虚"
采样电阻的选型不只是阻值问题,还有功率、温漂、电感、封装四个维度。
功率上,必须按电机峰值电流计算电阻功耗。假设峰值电流30A,电阻0.02Ω,损耗为P = I²R = 900 × 0.02 = 18W。这个功率相当可观,需要足够尺寸的电阻和散热条件。温漂方面,锰铜合金电阻的温漂很低(50ppm以内),适合做电流采样。电感上,开关切换瞬间di/dt极大,采样电阻的寄生电感会产生额外压降尖峰,让采样值污染。所以应选低电感的贴片合金电阻(如2512封装),避免使用绕线电阻。
运放选择我在三电阻部分说过了,这里补充一个关键点:运放的共模抑制比(CMRR)要足够高。因为采样电阻两端的电压都很小(毫伏级),但两端对GND的共模电压可能是母线高压经过开关管后的高压摆动脉冲,CMRR不够的运放会把共模信号差模化,输出里混入严重的开关噪声。我见过有人用通用LM358做电流采样,结果波形一团糟,就是这个原因。
6.2 RC滤波参数:一个算错就把采样窗口吃掉的例子
运放输出到ADC引脚之间通常加一个RC低通滤波器,用于滤除高频开关噪声。但RC参数取大了,信号建立时间就会变长,你辛辛苦苦算出来的采样窗口可能就不够用了。
以一个真实例子说明:我在某项目里第一次选了R=1kΩ、C=47nF,截止频率约3.4kHz。这个滤波器把电流信号的一个高次谐波衰减得几乎看不见,而且在阶跃输入时需要约5τ = 235μs才能进入误差带——而PWM周期只有50μs,这意味着每次采样都建立不到位,ADC读到的永远是"半稳态"的值。最后把参数改成R=100Ω、C=4.7nF,截止频率约340kHz,τ约0.47μs,才在采样窗口内给信号留足了建立时间。
RC参数的选取需要遵循两条经验法则:一是截止频率要远高于电流环带宽,约在PWM频率的5到10倍以上;二是时间常数τ要小于最小采样窗口的1/5到1/10。在这两条约束下,R取50~200Ω、C取1~10nF通常是比较安全的选择。
6.3 PCB上必须守住的几个几何规则
采样电路能不能稳定工作,很大程度在PCB布局阶段就决定了。三条铁律:
第一,采样电阻必须紧贴功率管源极/发射极引脚,用开尔文连接方式引出差分信号线。四线制开尔文连接能避免大电流路径上的寄生电感产生压降误差。如果采样信号的走线和大电流路径共用了一段铜箔,开关瞬间的di/dt会把地弹噪声直接叠加到采样信号上,你后期用软件怎么滤波都滤不干净。
第二,采样电阻的GND端要被单独引出一条模拟地线,到运放的GND参考点之间不要和大功率地共用一个过孔。"单点接地"在这里是保命原则,信号地必须在运放附近找一个安静的点接回功率地。
第三,运放输出到ADC输入之间的距离尽量短,走线要远离MOSFET的栅极驱动线和PWM输出走线。栅极驱动线上的高dv/dt和开关电流的回流会在相邻走线上感应出噪声,这个干扰很难用滤波彻底消除,只能从布线层面切断耦合路径。
6.4 比MCU更快的硬件过流保护:最后一堵墙
最后聊一下保命手段。所有软件层面的过流保护都有响应延迟——你需要等ADC转换完成,DMA搬运数据,CPU读寄存器判断阈值,再关闭PWM输出。这套流程至少也需要好几微秒,而MOSFET的短路耐受时间通常只有几微秒到十几微秒,软件响应可能来不及。
所以,成熟的驱动板一定会有硬件过流保护:采样电阻的放大信号除送往ADC之外,还会送到一个高速比较器,比较器阈值设为1.5~2倍的电流极限。一旦超过阈值,比较器输出立刻跳变,直接连接到MCU的PWM刹车输入引脚(如STM32的BKIN),由定时器硬件立即封锁PWM输出。
这个硬件保护的响应时间可以做到几百纳秒,比软件快了十倍不止。即使采样链路有虚焊或异常导致ADC读数不准,只要有独立的一路比较器路径,也能兜住底。
注意:硬件过流保护的阈值不能设得太大,否则失去了保护意义;也不能太小,否则正常峰值电流就会误触保。建议根据实测的峰值电流和裕量需求,用可调电位器或电阻分压网络来校准。
调试时,我习惯先用电阻负载代替电机,人为给一个过流信号,验证硬件保护能在PWM输出上留下干净的关断沿。再确认MCU收到BKIN事件后,软件能正确进入故障状态并停止使能PWM。这两步都通过之后,才敢把电流环带宽调高去进行正式的加载测试。
最后再说点实在话
电流采样这件事,看起来只是FOC整个系统里很小的一环,但它决定了整个系统的稳定性和安全性。如果你现在正要设计一款新的驱动板,我的建议是:第一版先用三电阻方案,把电流环调试流程跑通,拿到准确的电流反馈后再考虑降成本、换双电阻或单电阻。这样即使后面遇到问题,至少有据可查。我自己在单电阻方案上栽过跟头之后,就养成了一个习惯——哪怕产品最终用单电阻,开发初期也会先在三电阻评估板上把所有算法逻辑都验证好,再迁移到目标板。这个习惯帮我省掉了大量排查底层采样问题的时间,也少炸了不少板子。