1. 从三相到两相:FOC 到底在解决什么问题
搞电机控制的人,迟早都会撞上 FOC 这堵墙。有人觉得它玄乎,有人觉得它不过是几个坐标变换公式,但真正在项目里调过电流环、被转子初始位置坑过、被 PWM 死区搞到半夜的人,对它的理解会完全不一样。磁场定向控制(Field-Oriented Control,简称 FOC)说白了就干一件事:把三相交流电机那套互相耦合、随时间乱转的电流,通过坐标变换拆成两个"老实"的直流量,一个管励磁,一个管转矩,然后像控制直流电机一样分别去控制它们。三相电流、dq 坐标系、转矩控制,这三个词基本就是 FOC 的骨架——三相电流是物理世界的输入,dq 坐标系是数学上的手术刀,转矩控制是最终目的。
这套东西能解决的核心痛点是:交流电机天生耦合严重,直接对三相电流做闭环,你会得到一个非线性、强耦合、随转子位置变化的系统,PID 参数根本没法整定。FOC 的价值就在于解耦,把"难控"变成"好控"。它适合谁?适合所有做电机驱动的人——从做无刷云台的、做电动工具的、做伺服驱动的,到做新能源汽车电驱的,底层逻辑都是这一套。哪怕你用的是峰岹这类集成 FOC 的专用芯片,或者跑在 STM32 上的自研算法,理解了三相到 dq 的这条链路,调试时才知道自己在拧哪个旋钮。
我写这篇东西,不是要复述教科书上的 Clarke 和 Park 变换矩阵——那些公式网上到处都是。我想做的是把这条链路里真正会卡人的地方讲透:为什么是 dq 而不是别的坐标系、电流环带宽到底怎么理解、无感 FOC 的滑膜观测器为什么总在低速翻车、转子初始位置检测为什么是个绕不开的坎。这些是文档里不会写、但项目里一定会遇到的东西。
2. 三相电流与坐标变换的底层逻辑
2.1 为什么三相电流不能直接拿来控制
三相电机的定子绕组在空间上互差 120 度电角度,通入三相正弦电流后合成一个旋转的磁场。问题在于,这个合成磁场的方向和大小,跟三相电流的瞬时值之间是一个时变、非线性的关系。你在 A 相上加大电流,合成磁场的幅值和方向都会变,B、C 两相也会跟着受影响。这就是耦合。
更麻烦的是,电机转起来之后,转子位置一直在变,定子电流产生的磁场和转子磁场之间的夹角也在变。如果你直接对三相电流做 PID,那你的被控对象参数是随转子位置周期性变化的,PID 参数今天调好了,明天换个转速就震荡。这不是调参水平的问题,是控制对象本身的性质决定的。
所以 FOC 的第一步,就是想办法把"随转子转动的坐标系"变成"跟着转子一起转的坐标系"。在跟着转子转的坐标系里看,定子电流相对转子的关系就固定了,耦合被消掉了,剩下的就是两个独立的直流分量。这就是坐标变换的动机——不是为了数学好看,是为了让控制器面对一个不随时间变化的被控对象。
2.2 Clarke 变换:三相到两相静止坐标系
Clarke 变换干的事,是把三相电流 ia、ib、ic 投影到一个两相静止坐标系 α-β 上。因为三相电流满足 ia+ib+ic=0(星形连接、无中线),所以实际上只有两个独立变量,第三个是冗余的。Clarke 变换就是把这个三维约束下的两维信息,用 α-β 两个正交轴表示出来。
常用的等幅值 Clarke 变换公式是这样的:
# 等幅值 Clarke 变换(保持幅值不变) i_alpha = ia i_beta = (ia + 2 * ib) / sqrt(3)或者用更对称的写法:
i_alpha = (2/3) * (ia - 0.5*ib - 0.5*ic) i_beta = (2/3) * (sqrt(3)/2*ib - sqrt(3)/2*ic)这里有个坑,很多人第一次做的时候会纠结"等幅值"还是"等功率"变换。等幅值变换保持电流矢量的幅值不变,方便你直接看电流大小;等功率变换则让变换前后的功率相等,矩阵是正交的,数学上更漂亮。实际工程里用等幅值的多,因为调试时看波形直观——你设定 iq 是 1A,示波器上相电流峰值就是 1A,不用再乘系数。但要注意,如果你用的是等功率变换,那后面的转矩公式里系数会不一样,别混用。
Clarke 变换之后,α-β 坐标系还是静止的,它只是把三相的冗余去掉了,耦合问题没解决。因为转子还在转,α-β 轴和转子磁场的夹角还是时变的。所以还得再来一步。
2.3 Park 变换:静止到旋转坐标系的临门一脚
Park 变换是把 α-β 静止坐标系,旋转到跟着转子磁场一起转的 d-q 坐标系。d 轴(direct axis)对准转子磁场方向,q 轴(quadrature axis)超前 d 轴 90 度电角度。变换需要知道转子位置角 θ,这也是为什么 FOC 离不开转子位置信息——有感的用编码器/霍尔,无感的靠观测器估算。
Park 变换公式:
# Park 变换:α-β 到 d-q i_d = i_alpha * cos(theta) + i_beta * sin(theta) i_q = -i_alpha * sin(theta) + i_beta * cos(theta)反 Park 变换(d-q 到 α-β)在输出侧用:
v_alpha = v_d * cos(theta) - v_q * sin(theta) v_beta = v_d * sin(theta) + v_q * cos(theta)变换完之后,i_d 和 i_q 在稳态下就是两个直流量。i_d 控制励磁,i_q 控制转矩。对于表贴式永磁同步电机(SPMSM),d 轴和 q 轴电感基本相等,磁阻转矩为零,所以通常把 i_d 控制为 0,让所有电流都去产生转矩,效率最高。对于内置式永磁同步电机(IPMSM),d、q 轴电感不等,存在磁阻转矩,这时候可以故意给一点负的 i_d(弱磁或最大转矩电流比控制 MTPA),用磁阻转矩帮忙出力。
注意:Park 变换里的 θ 必须是转子磁场的电角度,不是机械角度。电角度 = 机械角度 × 极对数。这个搞错了,电机要么不转,要么乱转,要么直接过流保护。我见过不止一个新手把机械角直接喂进去,然后对着波形怀疑人生。
2.4 dq 坐标系下转矩控制的本质
到了 dq 坐标系,转矩公式就变得非常清爽。对于永磁同步电机:
Te = (3/2) * p * [ψf * i_q + (Ld - Lq) * i_d * i_q]其中 p 是极对数,ψf 是永磁体磁链,Ld、Lq 是 d、q 轴电感。第一项是永磁转矩,第二项是磁阻转矩。表贴式电机 Ld≈Lq,第二项为零,转矩正比于 i_q,这就是为什么表贴式电机控制起来简单——转矩和 i_q 是线性关系,跟直流电机一模一样。
这就是 FOC 的精髓:在 dq 坐标系下,转矩控制退化成了一个线性问题。你给 i_q 参考值,电流环去跟踪,转矩就跟着走。i_d 给 0(表贴式),励磁不变,不会弱磁也不会增磁。整个系统被解耦成了两个独立的电流环,一个管 d 轴,一个管 q 轴,各自用 PI 控制器就能搞定。
但这里有个容易被忽略的点:dq 坐标系是跟着转子转的,所以 dq 轴上的电压方程里会出现交叉耦合项——ωe * Lq * i_q 和 ωe * Ld * i_d(ωe 是电角速度)。转速越高,耦合越强。如果你只做纯 PI 不加前馈解耦,高速时 d、q 轴会互相干扰,电流跟踪变差。工程上常见的做法是在 PI 输出上叠加前馈项:
v_d_ref = PI_d(i_d_err) - ωe * Lq * i_q v_q_ref = PI_q(i_q_err) + ωe * Ld * i_d + ωe * ψf这个前馈项就是把已知的耦合和反电动势提前补偿掉,让 PI 只需要处理模型误差和扰动。加不加前馈,低速区别不大,高速区别明显。我一般建议一开始就加上,反正计算量不大,省得后面高速出问题再回头改。
3. 电流环、带宽与 PWM:FOC 的实时性骨架
3.1 电流环带宽到底在说什么
"foc控制中带宽的理解"是个高频搜索词,说明很多人对这个概念是模糊的。电流环带宽,简单说就是电流环能有效跟踪的参考信号频率上限。带宽越高,电流响应越快,转矩响应越猛,但同时对采样、计算、PWM 更新的实时性要求也越高。
从控制理论看,一个典型的一阶闭环系统,带宽约等于闭环截止频率。对于 PI 控制的电流环,带宽大致和 PI 的比例增益 Kp 成正比,和电感 L 成反比。工程上有个经验公式:
带宽 ≈ Kp / (2 * π * L)所以你想提高带宽,要么加大 Kp,要么减小电感。电感是电机固有的,改不了,那就只能加 Kp。但 Kp 不能无限加,因为采样和 PWM 有延迟,Kp 太大系统会震荡甚至发散。
这里有个硬约束:电流环带宽一般取开关频率的 1/10 到 1/20。比如 PWM 开关频率 10kHz,电流环带宽取 500Hz 到 1kHz 比较稳妥。取太高,采样噪声和 PWM 延迟会让你痛不欲生;取太低,转矩响应慢,动态性能差。我个人的习惯是取开关频率的 1/15 左右,然后根据实际波形微调。
实操心得:调电流环的时候,先给一个阶跃的 i_q 参考,用示波器看实际 i_q 的响应。如果超调大、震荡,降 Kp;如果响应慢、爬升缓,加 Kp。积分增益 Ki 主要消稳态误差,一般取 Kp * R / L 附近(R 是相电阻),让 PI 的零点对消电机的电气极点。这个对消思路能让电流环变成一个标准的一阶系统,调起来有章可循。
3.2 PWM 波形与定时器的配合
FOC 的实时性最终落在 PWM 和定时器上。典型的 FOC 实现里,PWM 定时器负责三件事:产生六路互补带死区的 PWM 驱动信号、触发 ADC 采样、作为整个控制循环的时基。
采样时机非常关键。MOSFET 开关瞬间会有电流尖峰和振铃,这时候采样会采到噪声。所以 ADC 采样一般安排在 PWM 周期的中点,也就是下桥臂全开、电流流过采样电阻的时候。对于中心对齐的 PWM,中点触发采样是最干净的。很多 MCU 的定时器支持在计数器等于周期值时触发 ADC,或者用比较事件触发,目的就是让采样点落在电流平稳的窗口里。
死区时间是另一个坑。上下桥臂不能同时导通,否则直通炸管,所以必须插入死区。但死区会导致输出电压和占空比之间出现非线性偏差,尤其在电流过零附近,波形会畸变。这个偏差在低速小电流时影响特别大,会造成转矩脉动和电流谐波。补偿方法有几种:基于电流极性的死区补偿、基于平均电压误差的补偿,或者用更高的开关频率把死区影响相对减小。我一般先用电流极性补偿,简单有效,电流方向已知时直接给占空比加一个修正量。
// 死区补偿示意(基于电流极性) if (ia > 0) { duty_a += deadtime_comp; } else { duty_a -= deadtime_comp; } // b、c 相同理注意:电流过零附近极性判断会抖动,补偿量来回跳,反而引入新的畸变。所以很多实现会在电流绝对值小于某个阈值时,把补偿量线性过渡到零,避免过零抖动。这个阈值一般取额定电流的 5% 到 10%。
3.3 采样、计算、更新的时序闭环
一个完整的 FOC 控制周期是这样的:PWM 中点触发 ADC 采样三相电流和母线电压,ADC 转换完成后触发中断,在中断里做 Clarke、Park 变换,跑 d、q 轴 PI,做反 Park,算出新的占空比,然后在下一个 PWM 周期更新比较寄存器。整个过程必须在半个 PWM 周期内完成,否则就错过了更新窗口。
以 10kHz 开关频率为例,PWM 周期 100μs,半周期 50μs。你的 ADC 采样加转换、坐标变换、两个 PI、SVPWM 计算,全部要在 50μs 内跑完。对于 100MHz 级别的 MCU,这个时间很充裕;但如果主频只有 48MHz 或者算法里用了浮点除法、三角函数,就可能吃紧。优化手段包括:用查表代替三角函数、用定点数代替浮点、把 Park 变换的 sin/cos 提前算好、用 SVPWM 代替 SPWM 提高电压利用率同时减少计算。
我实测过,在 72MHz 的 Cortex-M3 上,用定点 Q15 格式,整个 FOC 中断跑下来大概 8 到 12μs,10kHz 完全没压力。但如果换成浮点加实时 sin/cos,可能就到 30μs 以上了,这时候要么降开关频率,要么上带 FPU 的 M4/M7。
4. 无感 FOC 与转子位置:最难的永远是"不知道转子在哪"
4.1 有感与无感的取舍
有感 FOC 用编码器、旋变或霍尔传感器直接测转子位置,简单可靠,低速性能好,但增加了成本和接线,而且在一些恶劣环境(高温、油污、振动)里传感器容易出问题。无感 FOC 靠观测器从电压电流里估算转子位置,省掉了传感器,成本低、可靠性高,但低速和零速时反电动势太小,估算困难,启动是个大难题。
选有感还是无感,本质是成本和性能的权衡。风机、水泵这类对低速性能要求不高的场合,无感是主流;伺服、机器人关节这类要求高精度、高动态的,有感更稳。我个人的经验是:如果项目允许装霍尔,哪怕只装三个霍尔做低速和启动,高速再切无感,也比纯无感从零启动要省心得多。混合方案在很多产品里是性价比最高的。
4.2 滑膜观测器的原理与翻车点
"无感foc滑膜观测器"是搜索热词,说明这是无感 FOC 里最常用的方法之一。滑膜观测器的思路是:构造一个基于电机模型的电流观测器,让观测电流和实际电流的误差在一个滑膜面上滑动,通过开关函数(通常是 sign 或 saturation)强迫误差趋零,然后从等效控制量里提取反电动势,再反正切算出转子角度。
它的优点是鲁棒性强,对参数变化不敏感,实现也不算复杂。但翻车点很集中:
第一,低速时反电动势幅值小,信噪比低,观测出来的角度抖动大,甚至完全不可用。一般滑膜观测器在额定转速 10% 到 15% 以下就不太靠谱了。
第二,滑膜开关函数会引入高频抖振,虽然经过低通滤波能压下去,但滤波又带来相位延迟,角度估算滞后,高速时影响控制精度。抖振和延迟是一对矛盾,参数得折中。
第三,纯滑膜观测器无法在零速启动,因为零速没有反电动势,观测器没有信息可用。所以无感 FOC 的启动通常分三段:预定位(强制给一个角度把转子拉到已知位置)、开环强拖(按固定斜率升频升压,把电机拖到一定转速)、切换到闭环观测器。这个切换点选不好,电机会失步或者震荡。
启动流程: 1. 预定位:d 轴给固定电流,持续几百毫秒,转子对齐到 d 轴 2. 开环强拖:按设定加速度升频,iq 给固定值,角度由开环积分得到 3. 切换闭环:当转速达到观测器可用阈值,切换到观测器角度,同时把电流环接管实操心得:开环强拖的加速度不能太快,否则电机跟不上,直接失步。一般取电机能在额定转矩下达到的加速度的一半左右。切换闭环的瞬间,观测器角度和开环角度可能有偏差,直接切会抖一下。我通常做一个角度平滑过渡,在几十毫秒内把角度从开环值渐变到观测器值,切换就平顺多了。
4.3 转子初始位置检测:零速下的盲区
"foc 转子初始位置检测"是另一个高频痛点。有感系统直接读传感器就完事了,无感系统在零速时没有任何反电动势信息,怎么知道转子在哪?常用方法有两种:高频注入法和脉冲电压注入法。
高频注入法是往 d 轴注入一个高频小电压信号,利用电机的凸极效应(Ld≠Lq),从高频电流响应里提取转子位置。它对 IPMSM 效果好,因为凸极明显;对表贴式 SPMSM,Ld≈Lq,凸极效应弱,效果就差。而且高频注入会带来噪声和额外损耗,低速时能听到明显的啸叫。
脉冲电压注入法是依次给不同方向的短时电压脉冲,比较各方向的电流响应幅值,电流最大的方向就是转子 d 轴方向(因为 d 轴电感通常最小,电流上升最快)。这个方法简单,但会有一点转矩抖动,而且对电感差异小的电机分辨力有限。
实际工程里,如果电机凸极明显,优先高频注入;如果凸极不明显,脉冲注入凑合用,或者干脆加霍尔做初始位置检测。我见过最省事的方案是:装三个霍尔,零速和低速用霍尔,高速切无感观测器,既解决了启动和初始位置,又保留了无感的高速性能。
5. 常见问题排查与实战避坑清单
5.1 电流波形畸变与转矩脉动
电流波形畸变是 FOC 调试里最常见的现象。表现是相电流不是干净的正弦,有明显的平顶、毛刺或者六步换相的痕迹。原因通常有几个:死区补偿不当、电流采样时机不对、PI 参数不合适、或者 SVPWM 扇区判断错误。
排查顺序我一般这样走:先看电流采样点是否在 PWM 中点,采样电阻和运放带宽够不够;再看死区补偿有没有加、极性判断对不对;然后看 PI 输出有没有饱和、积分有没有限幅;最后检查 SVPWM 的扇区和作用时间计算。用示波器同时看相电流和 PWM 驱动波形,能快速定位是驱动侧还是控制侧的问题。
转矩脉动往往和电流畸变是伴生的。除了上面这些,还要考虑电机的反电动势谐波、齿槽转矩、以及电流环带宽是否足够。齿槽转矩是电机本体的问题,控制上很难完全消除,但可以通过电流谐波注入部分抵消。这个属于进阶操作,先把基础问题解决了再考虑。
5.2 无感启动失败与失步
无感启动失败的表现是电机嗡嗡响但不转,或者转一下就停,或者直接过流。排查要点:预定位电流够不够(太小拉不动,太大发热)、预定位时间够不够(太短转子没对齐)、开环加速度是不是太快、切换阈值是不是太低(观测器还没准备好就切)。
我踩过的一个坑是:预定位时 d 轴电流给得挺大,但持续时间只有 50ms,转子还没完全对齐就进开环了,结果开环一开始角度就是错的,直接失步。后来把预定位时间加到 300ms,问题解决。另一个坑是开环升频的斜率,我一开始按理论值算,结果实际电机带载后跟不上,改成理论值的一半就稳了。
5.3 常见问题速查表
| 现象 | 可能原因 | 排查方向 | 解决手段 |
|---|---|---|---|
| 电流波形毛刺大 | 采样噪声、死区 | 采样时机、死区补偿 | 中点采样、加死区补偿 |
| 电流平顶 | PI 饱和、电压不够 | 母线电压、PI 限幅 | 提高母线电压、检查限幅 |
| 低速抖动 | 观测器信噪比低 | 观测器带宽、滤波 | 降带宽、加高频注入 |
| 高速失步 | 观测器延迟、前馈缺失 | 角度滞后、耦合补偿 | 加前馈解耦、相位补偿 |
| 启动嗡嗡响 | 预定位不足、开环太快 | 预定位电流/时间、加速度 | 加大电流、延长时间、降加速度 |
| 转矩脉动大 | 电流畸变、齿槽转矩 | 电流谐波、电机本体 | 谐波补偿、优化电机 |
| 过流保护 | 角度错误、PI 震荡 | 角度来源、PI 参数 | 检查角度、降 Kp |
| 切换闭环抖动 | 角度跳变 | 切换瞬间角度差 | 角度平滑过渡 |
5.4 几个文档里不会写的经验
第一,电流环的 PI 参数不要照搬公式算完就用。公式给的是起点,实际电机的电感会随电流饱和而变化,电阻会随温度漂移,所以最终参数一定要在真实工况下微调。我一般先用公式算个初值,然后上电看阶跃响应,手动调两三轮。
第二,无感 FOC 的观测器参数和电机参数强相关。定子电阻、电感、磁链这几个参数,datasheet 上的值和实际值可能有 10% 到 20% 的偏差。如果观测器效果不好,先别急着改观测器结构,把电机参数重新测一遍,往往有奇效。电阻用电桥测,电感用 LCR 表测,磁链可以通过反电动势常数反推。
第三,调试时一定要有限流和过流保护。FOC 调参过程中,PI 震荡、角度错误都可能导致电流失控,没有保护的话功率管和电机都保不住。我习惯在母线串一个功率电阻做限流,或者用可调电源设一个保守的电流上限,确认稳定后再放开。
第四,示波器是 FOC 调试的半条命。至少要看三路信号:相电流、PWM 驱动、以及一个 DAC 输出的内部变量(比如 i_q 实际值或观测角度)。很多 MCU 支持把内部变量通过 DAC 或者 PWM 占空比输出出来,配合示波器看,比盯着 IDE 里的变量窗口有用得多。
6. 从理论到落地:一套可复现的 FOC 实现路径
6.1 硬件与工具选型
如果你要从零搭一套 FOC,硬件上需要:一块带 FPU 或足够算力的 MCU(STM32F4/G4、TI C2000、峰岹专用 FOC 芯片都可以)、三相逆变桥(集成驱动或分立 MOS)、电流采样(双电阻或三电阻,单电阻对算法要求高)、以及转子位置传感器(编码器/霍尔,或者纯无感)。
工具上,示波器必备,最好四通道;可调直流电源带限流;LCR 表和电桥用于测电机参数;如果做无感,还需要一个能测反电动势的设备或者方法。软件上,STM32 可以用 ST-MC-SDK 或者自己写,TI 有 InstaSPIN,峰岹有配套的 IDE 和库。自己写的话,建议从有感 FOC 开始,把坐标变换、PI、SVPWM 跑通,再加无感观测器。
6.2 分阶段实现路线
第一阶段:开环 V/F 或者开环电流控制。不接位置反馈,按固定角度旋转,验证 PWM、ADC、坐标变换、SVPWM 都正常。这一步能看到电机转起来,电流波形大致正弦,就说明底层通了。
第二阶段:有感闭环电流环。接上编码器或霍尔,跑通 Park 变换的角度来源,调好 d、q 轴 PI,看阶跃响应。这一步的目标是电流环带宽达标、波形干净。
第三阶段:速度环和位置环。在电流环外面套速度 PI,再外面套位置 P,逐级调试。速度环带宽一般是电流环的 1/5 到 1/10,位置环再低一个数量级。
第四阶段:无感观测器。在电流环稳定的基础上,加入滑膜观测器或龙伯格观测器,先在中高速验证角度估算精度,再解决启动和低速问题。
这个路线的好处是每一步都有明确的验证目标,出问题容易定位。我见过有人一上来就搞无感全闭环,结果底层 PWM 都有问题,调了半个月没进展,回头从开环查起,两天就通了。
6.3 参数计算实例
假设一台表贴式永磁同步电机,额定电流 5A,相电阻 0.5Ω,相电感 1mH,极对数 4,额定转速 3000rpm,母线电压 48V,PWM 频率 10kHz。
电流环带宽取 1kHz,则 Kp ≈ 2 * π * 1000 * 0.001 = 6.28 V/A。Ki 取 Kp * R / L = 6.28 * 0.5 / 0.001 = 3140 V/(A·s)。这个 Ki 数值看起来大,但在离散实现里要乘以采样周期,实际积分系数是 Ki * Ts = 3140 * 0.0001 = 0.314,就正常了。
额定转速 3000rpm,电角速度 ωe = 3000 / 60 * 2 * π * 4 = 1256.6 rad/s。反电动势常数如果按磁链算,ψf 可以通过额定电压和转速反推。这些参数算出来是初值,实际还要调。
注意:不同 MCU 的 PI 实现方式不一样,有的用位置式,有的用增量式,有的积分项带抗饱和。系数换算别搞错,否则一上电就满输出。我习惯先把 Kp 设得很小,Ki 设零,确认方向对了再逐步加。
6.4 代码结构建议
一个清晰的 FOC 代码结构应该分层:底层驱动(PWM、ADC、定时器)、坐标变换层(Clarke、Park、反变换)、控制层(电流 PI、速度 PI)、以及应用层(启动逻辑、状态机、保护)。中断里只跑最内层的电流环,速度环和状态机放在慢速任务里。
// 电流环中断伪代码 void FOC_ISR(void) { // 1. 读采样 ia = ADC_Read(IA_CH); ib = ADC_Read(IB_CH); // 2. Clarke i_alpha = ia; i_beta = (ia + 2*ib) * ONE_BY_SQRT3; // 3. Park i_d = i_alpha * cos_t + i_beta * sin_t; i_q = -i_alpha * sin_t + i_beta * cos_t; // 4. PI v_d = PI_Calc(&pi_d, i_d_ref - i_d); v_q = PI_Calc(&pi_q, i_q_ref - i_q); // 5. 反 Park v_alpha = v_d * cos_t - v_q * sin_t; v_beta = v_d * sin_t + v_q * cos_t; // 6. SVPWM SVPWM_Calc(v_alpha, v_beta, &duty_a, &duty_b, &duty_c); // 7. 更新 PWM_Update(duty_a, duty_b, duty_c); }sin_t 和 cos_t 由角度更新任务提前算好,中断里只查表或读全局变量,避免在中断里跑三角函数。
7. 写在最后:FOC 调试是门手艺活
FOC 的理论框架其实不复杂,Clarke、Park、PI、SVPWM,几页纸就能推完。但真正把它调好,靠的是对细节的把握和对现象的敏感。同样一套算法,有人调出来电流干净、转矩平顺、启动干脆,有人调出来波形毛糙、低速抖、启动靠运气,差别就在这些细节里。
我个人在实际操作中的体会是:FOC 调试最忌讳"想当然"。你觉得角度没问题,可能极对数就搞错了;你觉得 PI 参数算得对,可能采样延迟没补偿;你觉得观测器能用,可能电机参数差了 20%。每一个环节都要用示波器和数据去验证,不能靠猜。
最后再分享一个小技巧:如果你在调无感 FOC 的低速性能,先别急着上复杂的高频注入。把电机的凸极率测准,把电流采样精度提上去,把死区补偿做干净,很多时候低速性能自然就好了。观测器的上限,往往取决于你给它的信号质量,而不是算法本身有多花哨。