
1. 从“升魂浩荡”说起这套FOC电流环到底在折腾什么“升魂浩荡”这个词一看就是圈内人自己起的诨名带着点中二气息但背后指向的东西非常实在——一套永磁同步电机PMSM的FOC磁场定向控制程序而且重点落在电流环上。我第一眼看到这个标题的时候脑子里浮现的画面是一块STM32或者类似MCU的板子三路PWM输出接着三相逆变桥ADC在电流采样电阻或者霍尔传感器上盯着相电流然后代码里跑着Clarke变换、Park变换、两个PI调节器、反Park变换、SVPWM生成——这一整套流程就是电流环的核心骨架。为什么电流环值得单独拎出来讲因为在整个FOC三环控制电流环、速度环、位置环里电流环是最内环也是响应要求最快的那一环。速度环和位置环的带宽通常只有几十到几百赫兹而电流环的带宽动辄上千赫兹甚至几千赫兹。电流环没调好外环再怎么整定都是白搭——就像盖楼地基没打牢上面装修再漂亮也住不安心。很多人在做FOC的时候速度环调了半天发现电机还是啸叫、抖动、带载能力差根子往往就在电流环上。这套“升魂浩荡”的程序从标题和热词来看涉及的关键点包括FOC算法整体架构、电流环PI参数整定、d轴和q轴的解耦、ADC采样时刻的选择、SVPWM与FOC的配合、无感FOC的滑模观测器、转子初始位置检测、MTPA控制等。热词里还混进来一些看起来不太相关的东西比如“小程序”“npm不是内部命令”“conda不是内部命令”之类的这些大概率是搜索联想带出来的噪音跟FOC本身没关系我在后面的内容里会聚焦在电机控制的核心技术上不会被这些噪音带偏。这篇文章适合谁看如果你正在做PMSM的FOC控制尤其是自己写电流环代码不管你是用STM32、TI的C2000系列、还是国产MCU只要涉及到电流环的设计和调试这里面的内容都能直接参考。如果你是无感FOC的初学者刚开始接触滑模观测器或者龙伯格观测器电流环也是你绕不开的第一道坎。我会从整体设计思路讲到具体代码实现再到调试过程中踩过的坑尽量把每个关键决策背后的“为什么”说清楚。2. 电流环的整体设计思路与方案选型2.1 为什么电流环是FOC的“心脏”FOC的核心思想是把三相交流电机的定子电流通过坐标变换分解成两个直流量d轴电流励磁分量和q轴电流转矩分量。对于表贴式PMSMSPMd轴和q轴电感基本相等通常采用id0控制让所有电流都用来产生转矩对于内置式PMSMIPMd轴和q轴电感不等存在磁阻转矩这时候可以考虑MTPA控制让给定电流在d轴和q轴之间有一个最优分配。但不管哪种策略最终都要落到“让实际电流跟踪给定电流”这件事上。电流环的任务就是在每个PWM周期里采样三相电流经过Clarke和Park变换得到id和iq的实际值与给定值比较通过PI调节器算出ud和uq再经过反Park变换和SVPWM生成六路PWM信号驱动逆变桥。这个闭环的带宽决定了电机对转矩指令的响应速度也决定了整个系统的动态性能。我见过不少人做FOC速度环调得挺顺但一加负载就掉速或者电流波形毛刺很大用示波器看相电流发现畸变严重。这些问题十有八九出在电流环上要么是PI参数不对要么是采样时刻没对齐要么是解耦没做好导致d轴和q轴互相干扰。2.2 电流环的两种主流实现架构在实际工程中电流环的实现主要有两种架构单采样单更新和双采样双更新。前者在一个PWM周期内只采样一次电流、更新一次PWM占空比后者在一个PWM周期内采样两次、更新两次通常是在PWM周期的起点和中点各采样一次。单采样单更新的优点是实现简单MCU的计算负担小适合开关频率不高比如10kHz到16kHz的场景。缺点是采样到PWM更新的延迟较大电流环的带宽受限。双采样双更新可以把延迟缩短一半电流环带宽可以做得更高但对MCU的算力和ADC的采样速度要求更高通常用在开关频率20kHz以上的场合。我个人的选择是如果是工业伺服或者对动态响应要求高的场合优先考虑双采样双更新如果是风机、水泵这类对动态响应要求不高的应用单采样单更新完全够用还能省下算力去做无感观测器。这套“升魂浩荡”的程序从标题的“升魂”二字来看作者应该是追求高性能的所以我后面的分析会以双采样双更新的架构为主但也会说明单采样下的调整方法。2.3 电流环PI调节器的设计逻辑电流环的PI调节器设计本质上是要让闭环系统的带宽尽可能高同时保证足够的相位裕度。对于PMSM的d轴和q轴可以分别设计PI参数也可以共用一组参数。对于表贴式PMSM因为LdLqd轴和q轴的被控对象模型是一样的所以可以共用一组PI参数对于内置式PMSMLd和Lq不等严格来说应该分别整定。PI参数的理论计算方法有两种带宽法和零极点对消法。带宽法是先设定期望的闭环带宽比如1kHz然后根据电机参数反推Kp和Ki零极点对消法是把PI调节器的零点配置到被控对象的极点处抵消掉电机电气时间常数带来的相位滞后。两种方法在实际中都有应用我通常先用零极点对消法算出一组初值然后再根据实测波形微调。这里有一个关键点电流环的带宽不能超过采样频率的1/10。比如PWM频率是10kHz采样频率也是10kHz单采样那么电流环带宽最好不要超过1kHz。如果PWM频率是20kHz双采样双更新采样频率等效40kHz电流环带宽可以做到2kHz到3kHz。超过这个限制采样延迟和PWM更新延迟会严重侵蚀相位裕度导致振荡。3. 核心细节解析与实操要点3.1 Clarke变换和Park变换的实现细节Clarke变换是把三相电流ia、ib、ic转换到静止坐标系下的iα和iβ。对于三相星形连接、无中性线的电机iaibic0所以只需要采样两相电流就能算出第三相。常见的Clarke变换有两种形式等幅值变换和等功率变换。在FOC中通常采用等幅值变换系数是2/3。具体公式是iα iaiβ (ia 2ib) / √3。这个形式比标准的2/3系数形式更简洁因为省掉了一个乘法。我在实际代码里更倾向于用这个简化形式尤其是在MCU上跑的时候少一次乘法就少一点计算时间。Park变换是把iα和iβ转换到旋转坐标系下的id和iq需要用到转子电角度θ。公式是id iα·cosθ iβ·sinθiq -iα·sinθ iβ·cosθ。这里有一个坑θ的精度直接影响id和iq的解算精度。如果θ有偏差会导致d轴和q轴之间出现交叉耦合表现为电流环给定和反馈之间有稳态误差或者带载时电流波形不对称。对于有传感器的FOCθ来自编码器或者霍尔传感器精度通常没问题。对于无感FOCθ来自观测器滑模观测器、龙伯格观测器等观测器的精度和收敛速度就直接决定了电流环的性能。我在调试无感FOC的时候经常遇到低速时观测器角度不准导致电流环振荡的问题这时候要么降低电流环带宽要么改用高频注入等低速观测方案。3.2 ADC采样时刻的选择为什么它比你想的重要热词里有一条“foc adc采样应该在什么时刻”这个问题问到了点子上。ADC采样时刻的选择直接决定了电流采样值是否准确进而影响整个电流环的性能。在PWM控制的逆变桥中相电流是脉动的尤其是在PWM开关瞬间电流会有尖峰和振铃。如果在开关瞬间采样采到的值根本不能反映真实的基波电流。正确的采样时刻应该是在PWM周期的中点也就是上下桥臂都处于稳定导通或关断状态的时候。对于中心对齐的PWM中点正好是计数器达到峰值或者谷值的时刻这时候电流最平稳。具体来说如果是单采样单更新通常在PWM周期的中点触发ADC采样然后在下一个周期更新占空比。如果是双采样双更新可以在PWM周期的起点和终点各采样一次但起点采样容易受到开关噪声干扰所以更常见的做法是在中点采样一次然后在下一个半周期再采样一次。还有一个细节ADC采样需要和PWM计数器同步。大多数MCU的ADC都支持由定时器触发采样比如STM32的ADC可以由TIM1的TRGO事件触发。这样可以保证采样时刻和PWM周期严格对齐避免因为中断延迟导致采样时刻漂移。我在早期调试的时候曾经用软件触发ADC结果发现电流波形上有一层随机的毛刺后来改成定时器硬件触发毛刺立刻消失了。3.3 电流环PI参数整定的实操方法PI参数整定是电流环调试中最核心也最磨人的环节。理论计算只能给一个初值实际参数还得靠实测调整。我通常的步骤是这样的第一步根据电机参数和期望带宽用零极点对消法算出一组Kp和Ki。假设电机相电阻是R相电感是L期望电流环带宽是ωc那么Kp ωc·LKi ωc·R。这个公式的推导基于把PI调节器的零点配置到电机的电气极点R/L处实现零极点对消。第二步把算出来的参数写入代码给一个小的阶跃给定比如额定电流的10%用示波器或者MCU的DAC输出观察电流反馈的响应。如果响应有超调说明Kp偏大或者Ki偏大如果响应太慢说明Kp偏小或者Ki偏小。第三步微调。我通常先调Kp把Ki设为零观察纯比例控制的响应。Kp增大响应变快但超调也增大Kp减小响应变慢但更稳定。找到一个临界点然后稍微减小Kp再加入Ki。Ki的作用是消除稳态误差但Ki太大会导致振荡。Ki的调整幅度通常比Kp小一个数量级。这里有一个经验值对于大多数工业PMSM电流环Kp的典型值在几到几十之间具体取决于电感和带宽Ki在几百到几千之间。但这个范围仅供参考实际值跟电机参数、PWM频率、采样延迟都有关系。3.4 d轴和q轴的解耦什么时候需要什么时候可以忽略在FOC中d轴和q轴之间存在交叉耦合d轴电压会影响q轴电流q轴电压也会影响d轴电流。耦合项的大小与转速和电感有关转速越高、电感越大耦合越严重。在低速时耦合项可以忽略但在高速时如果不做解耦电流环的性能会明显下降。解耦的方法有两种前馈解耦和反馈解耦。前馈解耦是在电压指令上直接加上耦合项的补偿ud_comp -ωe·Lq·iquq_comp ωe·Ld·id ωe·ψf。其中ωe是电角速度ψf是永磁体磁链。反馈解耦是把耦合项作为扰动通过PI调节器来抑制但效果不如前馈解耦直接。我在实际项目中如果电机最高转速对应的电频率超过电流环带宽的1/5就会加入前馈解耦。如果低于这个比例解耦带来的收益不明显反而增加了代码复杂度和参数敏感性可以暂时不做。4. 实操过程与核心环节实现4.1 硬件平台搭建与外设配置这套电流环程序的硬件平台我假设是常见的STM32G4或者F4系列配上三相逆变桥和电流采样电路。电流采样可以用单电阻、双电阻或三电阻方案。单电阻成本最低但采样时刻和重构算法复杂三电阻采样最直接但需要三个ADC通道或者一个ADC的多个通道轮流采样双电阻是折中方案采样两相电流第三相通过iaibic0算出。我个人的偏好是双电阻采样因为它在成本和实现难度之间取得了比较好的平衡。具体配置是两个采样电阻放在下桥臂ADC由定时器触发在PWM中点采样。ADC配置为注入模式或者规则模式采样完成后触发中断或者DMA传输。PWM配置为中心对齐模式死区时间根据MOSFET或IGBT的开关特性设置通常在几百纳秒到一微秒之间。死区时间太短会导致上下桥臂直通太大会导致输出电压畸变。我通常先用示波器观察上下桥臂的驱动信号确认死区时间合适后再上电。4.2 电流环代码的完整实现流程电流环的代码通常放在PWM中断或者ADC采样完成中断里执行执行频率等于PWM频率。整个流程可以分成以下几个步骤第一步读取ADC采样值转换成实际的相电流值。这里需要注意ADC的参考电压、采样电阻阻值、运放增益等参数确保转换系数正确。我见过有人因为转换系数算错导致电流反馈整体偏大或偏小PI怎么调都不对。第二步Clarke变换把ia、ib转换成iα、iβ。如果用的是双电阻采样第三相电流通过iaibic0算出。第三步Park变换用转子电角度θ把iα、iβ转换成id、iq。θ来自编码器或者观测器需要确保θ和实际转子位置对齐。第四步PI调节。id和iq分别与给定值比较通过PI调节器算出ud和uq。PI调节器需要做限幅防止积分饱和。限幅值通常设置为逆变桥能输出的最大电压也就是母线电压除以√3。第五步反Park变换用θ把ud、uq转换成uα、uβ。第六步SVPWM生成根据uα、uβ计算三个比较寄存器的值输出六路PWM。第七步更新PWM占空比等待下一个周期。这个流程看起来简单但每一步都有细节需要注意。比如Park变换用的sin和cos如果每次都用查表法需要考虑表的大小和精度如果用硬件三角函数单元比如STM32G4的CORDIC可以省下不少计算时间。再比如PI调节器的积分项需要用抗积分饱和算法否则在给定突变或者母线电压跌落时积分项会累积到很大的值导致恢复时出现大超调。4.3 关键参数的计算与选择过程以一台典型的工业PMSM为例额定功率1kW额定转速3000rpm极对数4相电阻0.5Ω相电感5mH母线电压48VPWM频率16kHz双采样双更新。首先计算电角频率额定转速3000rpm对应机械频率50Hz电频率 50 × 4 200Hz电角速度ωe 2π × 200 ≈ 1256 rad/s。然后计算电流环期望带宽PWM频率16kHz双采样双更新等效采样频率32kHz电流环带宽取采样频率的1/10即3.2kHz对应角频率ωc 2π × 3200 ≈ 20106 rad/s。根据零极点对消法Kp ωc × L 20106 × 0.005 ≈ 100.5Ki ωc × R 20106 × 0.5 ≈ 10053。这个Kp值看起来很大但这是因为电角频率和带宽都用的是rad/s实际代码里如果用的是标幺值或者不同的单位制数值会不一样。关键是理解计算逻辑然后根据实际系统的单位制进行换算。在实际代码中我通常会把PI参数做成可调的通过上位机或者调试接口在线修改这样调试起来方便很多。如果每次改参数都要重新编译下载效率太低了。4.4 调试现场记录从振荡到稳定的过程我第一次调这台电机的电流环时给了一个0.5A的阶跃给定结果电流反馈直接振荡频率大概在2kHz左右幅值越来越大最后触发了过流保护。用示波器看PWM波形发现占空比在剧烈变化。排查过程是这样的先检查ADC采样时刻确认是在PWM中点采样没问题再检查Park变换的角度用编码器读数对比发现角度有大约10度的偏差原因是编码器安装时没有严格对齐。重新校准编码器零位后振荡幅度减小了但还是有。然后检查PI参数发现Kp给得太大把Kp减小到原来的一半Ki也相应减小振荡基本消失。但响应变慢了阶跃给定下电流上升到0.5A需要大约2ms。继续微调把Kp稍微增大Ki保持不变响应时间缩短到1ms左右超调控制在5%以内。最后检查解耦项发现低速时解耦项影响不大但高速时如果不加解耦q轴电流会随着转速升高而偏离给定值。加入前馈解耦后高速下的电流跟踪误差从10%降到了2%以内。整个调试过程花了大概两天时间其中大部分时间花在排查编码器零位和ADC采样时刻上。这两个问题不解决PI参数怎么调都是白费。5. 常见问题与排查技巧实录5.1 电流环常见问题速查表问题现象可能原因排查方法解决方案电流反馈有直流偏置ADC零漂、运放失调电机不转时读取ADC值校准ADC零偏或在代码中减去偏置电流波形毛刺大采样时刻不对、开关噪声示波器观察采样时刻和PWM波形调整采样时刻到PWM中点增加RC滤波电流环振荡PI参数过大、角度偏差减小Kp和Ki检查角度对齐重新整定PI校准编码器零位带载时电流跟踪误差大解耦未做、母线电压不足检查高速时id和iq的跟踪情况加入前馈解耦检查母线电压低速时电流不稳定观测器角度不准对比观测器角度和实际角度改用高频注入或降低电流环带宽过流保护频繁触发电流尖峰、PI饱和示波器观察电流波形增加电流限幅优化PI抗饱和5.2 几个容易被忽略的坑第一个坑ADC采样和PWM更新的时序。如果ADC采样完成中断里直接更新PWM而ADC采样时刻又在PWM周期的起点那么采样到更新之间的延迟就是一个完整的PWM周期。这个延迟会严重限制电流环带宽。正确的做法是在PWM中点采样在下一个周期起点更新这样延迟只有半个PWM周期。第二个坑PI调节器的积分限幅。很多人只对PI输出做限幅不对积分项做限幅。这样在给定突变时积分项会累积到很大的值即使输出被限幅了积分项还在继续累积导致恢复时出现大超调。正确的做法是对积分项也做限幅限幅值通常设置为输出限幅值的一半左右。第三个坑死区补偿。死区时间会导致输出电压畸变尤其是在低速小电流时畸变比例很大。如果不做死区补偿电流波形会出现明显的平顶或者台阶。死区补偿的方法是根据电流方向调整占空比补偿量等于死区时间除以PWM周期。这个补偿量需要根据实际死区时间和开关频率计算不能随便给。第四个坑母线电压波动。SVPWM的输出电压和母线电压成正比如果母线电压波动同样的占空比对应的实际电压会变化。在电流环中如果不对母线电压做归一化母线电压跌落时电流环的增益会下降响应变慢。我通常会在SVPWM之前把ud和uq除以母线电压做归一化处理。5.3 无感FOC下电流环的特殊考虑无感FOC的电流环和有感FOC相比最大的区别在于角度来源。有感FOC的角度来自编码器精度高、延迟小无感FOC的角度来自观测器精度和延迟都取决于观测器的性能。在低速时反电动势很小观测器很难准确估计角度这时候电流环的性能会明显下降。我的经验是无感FOC的电流环带宽要比有感FOC低一些通常取有感FOC的1/2到2/3。这样虽然牺牲了一些动态响应但换来了更好的稳定性。另外在低速时可以考虑切换到开环或者IF控制等转速升高、观测器收敛后再切换到闭环。滑模观测器是无感FOC中常用的一种观测器它的优点是鲁棒性强缺点是存在抖振。为了减小抖振可以用饱和函数代替符号函数或者用锁相环来提取角度。这些细节都会影响电流环的性能需要在实际调试中权衡。6. 从电流环延伸到整个FOC系统的思考电流环调好之后速度环和位置环的整定就相对容易了。速度环的带宽通常是电流环的1/5到1/10位置环的带宽又是速度环的1/5到1/10。这样从内到外带宽逐级降低保证整个系统的稳定性。MTPA控制是在电流环给定上做文章。对于内置式PMSM给定id和iq不再是一个为零、一个为转矩电流而是根据转矩需求在d轴和q轴之间找一个最优分配使得同样的转矩下电流幅值最小。MTPA的公式涉及到Ld、Lq和ψf需要根据电机参数计算。在实际实现中可以用查表法或者在线计算查表法速度快但需要提前标定在线计算灵活但占用算力。SVPWM和FOC是配套使用的。SVPWM的优点是电压利用率高比SPWM高出约15%。在电流环中SVPWM的输入是uα和uβ输出是六路PWM。SVPWM的实现需要注意扇区判断、矢量作用时间计算和比较寄存器更新这些细节如果处理不好会导致输出电压畸变进而影响电流环性能。最后说一个我个人的体会电流环的调试三分靠理论七分靠实测。理论计算能给你一个方向但实际系统的非理想因素太多了——ADC延迟、PWM死区、母线电压波动、电机参数非线性——这些都不是理论公式能完全覆盖的。所以多动手、多观察波形、多记录数据比死磕公式有用得多。我调试过的每一台电机最终稳定的PI参数都和理论计算值有出入但正是这些实测中积累的经验让我在下一次调试时能更快地找到方向。