先说明一句这篇文章是理论和实践的过渡篇定位在“理论一”。所以不写代码不抄工程配置把 FOC 的底子捋清楚。我自己做电机驱动这些年发现很多人卡住的位置不是代码而是坐标变换和电流环那两座大山。这篇文章把这两座大山拆开揉碎再带出几个工程里必然踩到的坑。看完你再去碰 STM32 那套工程会顺很多。1. FOC控制算法整体设计思路为什么非它不可1.1 方波驱动和FOC的本质差异直流无刷电机BLDC最常见的驱动方式是六步换相法也叫方波驱动。霍尔传感器给六个扇区的位置信号控制器按顺序导通上下桥臂让三相绕组中产生一个跳跃式的旋转磁场。这种驱动方式简单、粗暴、成本低几十块钱的云台电机、散热风扇用的基本都是它。但它的缺点很明显转矩波动大高速时噪音刺耳低速时几乎无法做到平稳控制。FOCField Oriented Control磁场定向控制走的是另一条路。它不靠换相而是通过精确控制三相电流的合成矢量让定子磁场始终与转子磁场保持一个“理想夹角”从而实现对转矩的线性化控制。这个理想夹角通常是90°电角度也就是常说的大 id0 控制。FOC 换来的好处是实打实的转矩波动小、动态响应快、效率高、噪音低甚至可以实现零速满载启动。代价也很直观运算量大需要坐标变换、PI调节器、SVPWM调制还对 ADC 采样时机和控制周期有苛刻要求。放到 STM32F103 这种 72MHz 的 Cortex-M3 上需要用一点技巧才能跑得游刃有余。1.2 FOC的核心思想磁场定向与解耦把FOC的核心思想压缩成一句话就是把交流问题变成直流问题把耦合问题变成解耦问题。交流电机的三相绕组在空间上相差120°通上三相交流电之后产生的磁场是旋转的。要控制这个旋转磁场的幅度和方向直接在三相坐标系下算很难受因为三相量是强耦合的。所以FOC做了两步数学变换第一步把三相静止坐标系abc变换到两相静止坐标系αβ这叫Clark变换。第二步把两相静止坐标系旋转到随转子同步旋转的两相旋转坐标系dq这叫Park变换。经过这两步原来幅值变化的交流量变成了静止的直流量。这时候你再去看那些方程id 和 iq 已经解耦了。id 控制励磁分量iq 控制转矩分量。你不再需要跟三相正弦波较劲只需要对着两个直流分量做PI控制输出经过反Park变换和SVPWM还原成三相占空比指令。这种“先解耦再控制”的思路是整个FOC理论的地基。后续所有高级玩法——弱磁控制、MTPA最大转矩电流比、无感FOC、滑模观测器、模型预测控制——都是在这个地基上盖楼的。能用一句话总结FOC的设计精髓让电流环面对的是一个干净的直流对象让电机在任意工况下都像一个有良好线性特性的执行器。2. 理论基础FOC坐标变换与电机数学模型2.1 Clark变换从abc到αβ先明确一个前提电机的三相电流是120°对称的且有 Ia Ib Ic 0。利用这个约束我们只需要采样两相电流就够了第三相用公式算出节省一路ADC通道也省了一点采样处理时间。等幅值变换的Clark公式如下Iα Ia Iβ (Ia 2*Ib) / √3这个形式很常用也有完整的三相版本Iα 2/3 * (Ia - 1/2 * Ib - 1/2 * Ic) Iβ 2/3 * (√3/2 * Ib - √3/2 * Ic)两个版本差一个系数本质是等幅值变换与等功率变换的区别。做FOC一般都用等幅值变换因为后面接空间矢量调制时母线电压利用率的概念用等幅值更好解释。Clark 变换的物理含义三相绕组在空间上的合成磁动势完全可以用两相正交绕组α和β的磁动势来等效替代。三相变两相不是丢掉一相而是把信息重新组合。就像三根绳子以不同角度拉同一个点你把它们合成为两个垂直方向上的分力力的效果完全一样计算反而简单了。实际工程中Clark变换只是矩阵乘法和加减法在STM32F103上哪怕用浮点数运算也就几十个周期的事代价几乎可以忽略。真正的开销大头是后面SVPWM和坐标变换一起算的时候要在中断里卡着周期完成所有步骤必须一个不落地走完。2.2 Park变换从αβ到dqClark变换之后电流仍然是交流量幅值在变化。要让PI控制器舒服地工作还需要一步旋转变换。Park变换做的就是这件事把静止的αβ坐标系旋转到和转子磁极同步的dq坐标系旋转角度就是转子位置θ。Id Iα * cosθ Iβ * sinθ Iq -Iα * sinθ Iβ * cosθ从物理角度理解dq坐标系是“跟着转子转”的坐标系。d轴方向指向转子磁极中心q轴与d轴垂直。这样id和iq就分别描述了电流矢量在转子磁场方向的投影和垂直方向的投影。id励磁电流分量它产生的磁场要么帮助转子磁铁加强磁场要么削弱它。iq转矩电流分量它和转子磁场的相互作用产生实际转矩。表贴式永磁同步电机SPMSM的磁路是对称的Ld ≈ Lq转矩方程可以简化为Te 1.5 * p * ψf * iq看到了没有转矩和iq是纯线性关系。转子永磁体磁链ψf是常数极对数p是常数要控制转矩大小只剩一个iq。这就是FOC最诱人的地方把复杂的电磁转矩控制化解为一个单输入单输出的线性控制问题。你不需要跟非线性打交道老老实实控好iq就行。内置式永磁同步电机IPMSM多了一个磁阻转矩项 (Ld-Lq)idiq这时候id0就不再是最优策略MTPA最大转矩电流比控制会在id上注入负电流来利用磁阻转矩。这块放在后面进阶篇再展开。2.3 电机数学模型与电压方程电机本体在dq坐标系下的电压方程是FOC电流环设计的出发点Vd Rs*Id Ld * dId/dt - ωe * Lq * Iq Vq Rs*Iq Lq * dIq/dt ωe * (Ld*Id ψf)看着复杂拆开看就清晰了。每一项都有明确物理含义RsId 和 RsIq定子电阻产生的阻性压降和电流成正比。LddId/dt 和 LqdIq/dt电感产生的感性压降对应电流的变化率。-ωeLqIqd轴和q轴之间的交叉耦合项。q轴电流会在d轴上感应出一个旋转电压。ωe*(Ld*Id ψf)反电动势项也就是电机转起来之后产生的电压转子转得越快这一项越大。这两个方程说明了两件非常重要的事第一dq轴之间不是完全解耦的存在交叉耦合电压项。电机高速转起来之后ωe很大交叉耦合项甚至会超过阻性压降。如果电流环不管它表现出来就是id和iq互相干扰一个通道调好了另一个又飘了。工程上有一种做法叫前馈解耦在PI输出上主动补偿这两项电压让两个电流环真正独立。第二高速时反电动势会逼近母线电压。如果母线电压不够高PI控制器输出达到饱和也无法驱动足够电流这就触及了电压极限圆的问题。弱磁控制的本质就是注入负id用d轴去磁来压低反电动势从而换取更高的转速范围。这些在理论二里再细说。3. SVPWM与电流采样理论到硅片的桥3.1 SVPWM的空间矢量合成逻辑坐标变换算出了Vd和Vq的指令值反Park变换之后得到Vα和Vβ这两个电压只是数学上的参考值。真正要做的是把这两相静止坐标系的电压矢量用逆变器的六个开关管状态合成出来。这就是SVPWM空间矢量脉宽调制的任务。三相全桥逆变器有六个开关管上下桥臂互补导通一共8种开关组合状态。其中6个是非零电压矢量V1~V62个是零矢量V0和V7分别为下三管全通和上三管全通。这6个非零矢量在空间上把360°分成了6个扇区每个扇区60°。SVPWM的做法很直观给定一个参考电压矢量看它落在哪个扇区就用这个扇区相邻的两个非零矢量以及零矢量按照伏秒平衡原则分配作用时间。一个开关周期内三个矢量的作用时间总和等于PWM周期矢量合成的平均值就等于参考电压矢量。T1 比例系数 * sin(60° - θ) * |Vref| / Vdc T2 比例系数 * sin(θ) * |Vref| / Vdc T0 Ts - T1 - T2其中θ是参考矢量在当前扇区内的角度偏移。这一套用三角公式就能推出来网上有大量现成推导我不赘述。关键是理解它的一个核心特性SVPWM的母线电压利用率比SPWM正弦脉宽调制高15%左右最高可达 1/√3 ≈ 0.577相电压幅值除以母线电压。这意味着同样的12V电源FOC能跑出的电机最高转速比方波驱动和SPWM更高。3.2 ADC电流采样时机一个被反复问的问题热搜词里有“foc adc采样应该在什么时刻”这个问题问得很有水平也是很多新手第一块绊脚石。STM32的电流采样通常用采样电阻加运放放大再把放大信号送进ADC。采样电阻放在下桥臂低端采样或电机线路上。下桥臂采样有个天然问题PWM开关动作的那段时间里感性负载续流导致电流并不流经采样电阻采样值根本不代表相电流。所以一定要在PWM周期的特定时间窗口内触发采样。工程上通行的做法是把ADC触发信号接到定时器的某个事件上在PWM计数值为0或者TRGO事件触发的时刻启动采样。为什么是计数器为0因为此时上一周期的占空比已经结束新的占空比刚开始上下桥臂正在切换但通常SVPWM采用七段式中心对齐模式下这个时刻是对称点电流流经下桥臂采样电阻且状态稳定。为保证可靠还可以把ADC采样窗口配置成多次采样取平均值来滤掉噪声。我自己的经验是采样时刻放在PWM周期中间点、计数方向向下时触发最好。也就是定时器从中心值往下减到达周期值时触发ADC。这个点离所有开关切换动作最远三项电流都处于续流稳定期采到的值最干净。如果你用的是注入式采样把采样窗口插到PWM周期的特定位置务必保证采样窗口不要跨越桥臂动作点否则采出来的电流毛刺大到PI输出直接抖动。3.3 转子初始位置的确定FOC做Park变换需要转子角度θ。有霍尔传感器或者编码器时这个角度直接读出来就行。但很多低成本应用只装一块小板子连霍尔都省了角度估计完全靠软件这就是“无感FOC”名字的来历。无感FOC的第一步也是最容易被低估的一步转子初始位置检测。电机上电时转子磁极朝哪个方向软件并不知道。如果你随便给一个电角度就开始跑闭环转子会先被拉偏然后再修正严重时直接起动失败。常用的初始定位方法有几种I/f强拉法给定一个固定方向的电流矢量让转子被磁拉力拖到已知位置。简单、可靠、有噪音和轻微转动适合对定位时间没要求的场合。脉冲电压注入法交替向不同方向施加短时电压脉冲根据电流响应的幅值判断磁极方向。响应对应电感大小而电感随磁极位置变化所以能估算角度。高频注入法注入高频旋转电压或脉振电压从高频电流响应中提取转子位置信息。适合零速和低速场合也是无感FOC低速段的主力方案。这些方法的详细公式推导放在后续实践篇里讲。这里先记住结论转子初始位置搞不准后面一切白搭。4. 电流环与PI控制器的设计4.1 电流环PI参数的整定方法FOC的控制系统是级联结构内环是电流环外环是速度环再往外还可以套位置环。电流环是性能和稳定性的基石电流环带宽直接决定了系统能跑多快、抗扰多强。电流环PI参数整定也是高频问题之一。工程上常用零极点对消法来初算PI参数。思路是让PI控制器的零点抵消电机电气时间常数对应的极点。电机电枢回路的传递函数是一个一阶惯性环节G(s) 1 / (Rs Ls·s)电气时间常数 τe Ls / Rs。PI控制器的传递函数写成Gc(s) Kp Ki/s Kp·(s Ki/Kp) / s令 Ki/Kp Rs/Ls即用PI零点对消电机极点系统变为一阶积分加比例增益开环传函 ≈ Kp / (Ls·s)此时闭环带宽可以做近似估算工程常用公式是Kp ≈ Ls * 2π * f_bw Ki ≈ Rs * 2π * f_bw电流环带宽f_bw一般取1~2kHz。为什么是这个量级开关频率通常10~20kHz电流环采样频率和PWM频率一致带宽太高会把开关噪声带进来带宽太低又跟不上电流变化。这个范围是经过大量工程验证的折中。需要提醒的是这个公式只是初值。真正上板子还要根据响应波形调节Kp和Ki。我自己的调法很朴素先给一个小的阶跃指令看电流响应。振荡了降Kp稳态误差大加Ki如果响应慢并且有超调考虑是否前馈没加到位。纯理论算出来的参数永远要结合现场调试不要迷信公式。4.2 电压前馈与去耦项让电流环更干净前面2.3里提过dq轴之间存在交叉耦合项。低速时这个项很小PI控制器可以自己扛住。但转速一旦拉高耦合项和反电动势项会明显造成动态扰动。典型的工程做法是在PI输出上直接叠加前馈电压Vd_ref Vd_pi - ωe * Lq * iq Vq_ref Vq_pi ωe * (Ld * id ψf)Vd_pi和Vq_pi是PI输出后面加的就是解耦项和反电动势补偿项。这一步做完高速段的电流响应会明显干净。如何确定ψf和Ld、Lq可以从电机手册查也可以自己测。测ψf的方法是把电机用外力拖到恒定转速用示波器看相电压的梯形波再根据转速换算反电动势系数。测电感可以用LCR表测量两相之间的电感经过公式换算得到相电感。这些测量方法我在实践篇里会写一个完整的操作流程理论篇先把参数的意义和重要性立住。4.3 级联控制结构速度环与位置环电流环之上加速度环速度环之上加位置环这是FOC的经典级联结构。速度环的输出作为电流环的iq指令速度环的PI参数设计思路和电流环类似但带宽要留出足够余量。工程经验速度环带宽取电流环带宽的1/5到1/10这样内环动态可以视为理想的外环设计不纠结。速度反馈不要直接用微分后的位置信号因为微分会把噪声放大得没法看。更好的做法是用测速发电机、编码器的速度输出M法/T法测速或者观测器估算速度。STM32上常用定时器编码器模式直接输出速度和方向这也是工程上省事又可靠的做法。三轴云台控制算法里位置环通常再加一个姿态解算的前馈那是另一个故事了。单说电机控制本体位置环PI或者PID就够了。位置环带宽进一步降低一般取20~50Hz保证级联系统稳定。5. 理论阶段最容易踩的五个坑5.1 坐标系方向搞反电流环正反馈这是新手最容易犯的错。反Park变换的方向错了或者电角度方向定义反了整个电流环就变成了正反馈一上电电流就往顶格跑瞬间烧管。排查方式特别简单电机悬空、限流、给小占空比手动转动电机转子同时打印Vd和Vq的响应方向。如果方向对了转动转子时反馈电流会往相反方向变化这是负反馈该有的样子。如果方向反了把Park变换的角度取负或者交换两相电机线问题就解决了。5.2 电流采样噪声导致PI输出毛毛躁躁FOC的电流环对采样质量非常敏感。运放没调零、采样时刻不对、地线布局不好都会让采样电流叠加大量毛刺。这些毛刺经过PI控制器会被放大表现为电机噪音、电流波形粗糙、烧功率管前先听到滋滋声。排查电流采样噪声的方法断开功率管驱动让电机静止打印三相电流的采样值。正常情况下应该是一个很干净的值叠加极其微小的白噪声。如果你看到明显的高低跳变先查采样时刻再查运放输出波形最后检查PCB地线铺铜。5.3 母线电压低导致PI饱和FOC高速运行的时候反电动势越来越接近母线电压PI输出到达限幅电流环失控。这个现象在低压系统比如两节锂电池7.4V供电特别明显。如果你的电机在高速段突然“没劲”或者电流出现明显畸变多半是PI输出撞到电压限幅了。处理办法有两个方向。一个是降低转速需求调整PI输出限幅值另一个是上弱磁控制允许负id去磁压低反电动势。弱磁是进阶话题但至少你要先学会看PI输出的饱和状态不要蒙在鼓里调了一夜参数。5.4 电角度标定不准转矩输出打折电机轴和编码器的零位如果和电动机的电角度零位对不上实际输出的转矩不等于iq指令对应的值。最典型的表现是同样的iq下电机输出转矩变小电流和转矩线性关系被破坏。解决办法是做电角度标定给电机一个固定方向的电流矢量把转子拉到已知位置记录此时编码器的读数然后把这个偏移量放到角度解算里。一台电机只要标定一次就行但前提是编码器安装完成后不要松动否则就得重新标定。针对表贴电机如果你用的编码器带零位信号也可以通过转子对齐法自动标定这个方法在量产的伺服驱动器里已经很成熟。5.5 控制频率、PWM频率、采样频率三者关系混乱FOC一个控制周期里至少包含ADC采样、坐标变换、电流环PI、速度环PI、反Park变换、SVPWM输出。这一整套必须在一个固定的时间基准里完成。如果控制周期和PWM频率没有对齐或者SVPWM更新时刻和ADC采样时刻错开电流环的性能会大打折扣。工程上最常见的配置是PWM频率20kHzFOC中断频率20kHz一个PWM周期对应一个FOC控制周期ADC触发信号由定时器在PWM周期的中心位置发出。先保证这个时序了再谈更高深的预测控制或者滑模观测器。结语从理论到实践先把为什么刻在脑子里我自己带过好几个新入行的工程师说实话大部分人卡住的位置不是不会写代码而是理论链条中有两三个环节没打通。其中最常见的就是坐标系还没玩明白就开始调电流环调了半天反馈方向都是反的。这个阶段急不得建议你先在仿真工具MATLAB/Simulink或PLECS里把坐标变换和电流环路跑通再动手碰实物。仿真里你可以把每一步的中间量打印出来看能看到角度变化时id和iq到底怎么变这个感觉建立起来比盲目调参有用得多。理论一就先到这儿。下次我写实践篇重点讲STM32F103上如何搭建一个能跑通的FOC工程以及电机参数离线辨识的具体操作流程。到时候照着抄作业就行。
阅读完成 · 觉得有帮助?