1. 先聊透:FOC到底在解决什么问题
做电机控制这些年,我见过太多人一上来就啃FOC算法,翻了一堆书、跑了一堆仿真,结果面对一块真实的电机驱动板,还是不知道从哪里下手。问题往往不在数学,而在“FOC到底要干一件什么事”这件事本身没有想清楚。
FOC的全称是Field Oriented Control,磁场定向控制。这个名字起得挺学术,但说白了,它的核心目标就一个:让电机像直流电机一样好控制。你可能要问,直流电机控制不是很简单吗?给电压就转,反接就反转,调压就调速,天生就是线性关系。而三相交流电机、永磁同步电机(PMSM)、无刷直流电机(BLDC)这类电机,它们的三相绕组是空间上相差120度分布的,通入的是三相交流电,定子产生的磁场是旋转的,转子跟着磁场跑。问题在于,这个磁场和转子磁场的角度关系,直接决定了电机的转矩输出效率,角度不对,电流再大也是白烧功率。
直流电机为什么好控制?因为它的电枢磁场和励磁磁场天然正交,你控制电流大小,转矩就线性变化。而三相电机如果直接控制三相电压或三相电流,每一相的电流都在随时间交变,你看到的是一堆三角函数,完全没法直观地建立“给定一个量来控制转矩”的模型。FOC的思路就是,把三相静止坐标系下的交流量,通过坐标变换,变成两相旋转坐标系下的直流量,然后像控制直流电机一样,分别控制“励磁分量”和“转矩分量”。
这个变换的过程,本质上就是把视角“旋转”起来,站在转子的角度去看定子电流。你站到转子上去看,定子电流就不再是交变的了,而是两个直流量:一个沿转子磁场方向,叫d轴电流(励磁电流),一个垂直转子磁场方向,叫q轴电流(转矩电流)。控制的目标就变成了:把d轴电流控制到0(对表贴式PMSM而言),把q轴电流控制到你想要的值,转矩就按比例输出。这就是FOC最核心的本质。
很多人刚接触FOC,容易陷入“算法细节迷宫”,我建议先把这条主线记住:采样电流 -> Clarke变换 -> Park变换 -> PI调节 -> 逆Park变换 -> 生成PWM。这条链路的所有环节,都是围绕“把交流变成直流来控”这个核心思想服务的。理解了这一点,后面无论你是看STM32的官方电机库,还是读VESC的开源代码,都会有一种“原来是这么回事”的通透感。对于刚入门的朋友,我强烈建议先把这一层想明白,再往下走,否则每一步都是在背公式,调试时遇到问题根本没法定位。
2. 坐标变换里的门道:Clarke变换为什么只需要两相电流
FOC整个算法的第一步,是要拿到电机的三相电流。但板子上的采样电阻就那么多,常规做法是采样两相电流,第三相电流通过基尔霍夫电流定律算出来。这就是网上那个高频问题:Clarke变换为什么只需要两相电流,具体是哪两相有没有要求?
先回答为什么是两相。电机三相绕组是星形连接,中性点没有引出的话,三相电流的矢量和恒等于零,也就是说ia + ib + ic = 0在任意时刻都成立(不考虑漏电流和测量误差)。所以只要知道任意两相,第三相就是负的这两相之和。那具体采哪两相有要求吗?从数学上没有任何要求,你采样ia和ib也行,采样ia和ic也行,甚至采样ib和ic也行,公式里把剩下那相算出来就行。但从工程上讲,有两点偏好。
第一,采样电阻和下桥MOS管的连接位置相关。你的采样电路放在哪一相的下桥,就采哪一相。第二,更隐蔽的一点是,在空间矢量调制(SVPWM)的某些扇区,某一相的下桥PWM占空比可能非常小,甚至接近0,这时候在下桥采样电阻上采到的电流非常弱,或者干脆采不到。业内把这个现象叫做“采样窗口不够”或者“电流重构盲区”。如果恰好采样的那两相中有一相处于这个盲区,电流重构就会出错。所以某些高级方案会做“三电阻采样 + 根据扇区切换采样相”的处理,用两相采样去重构三相反馈。对于学习阶段而言,你不用纠结具体采哪两相,但要明白软件上用的是哪两相,并且在调试时验证第三相电流的重构精度。
再说Clarke变换本身。它的数学本质是把三相静止坐标系(abc)映射到两相静止坐标系(αβ)。这里的α轴通常与a相轴线重合,β轴超前α轴90度。变换矩阵分等幅值和等功率两种形式,区别只是一个系数,工程上电机控制大多用等幅值变换,因为后续Park变换和PI调节器的系数设计更直观。变换公式如下:
iα = ia - 0.5 * ib - 0.5 * ic iβ = (√3/2) * ib - (√3/2) * ic把ic = -ia - ib代进去,就整理成只用ia和ib的表达式:
iα = 1.5 * ia iβ = (√3/2) * ia + √3 * ib注意,等幅值变换下,iα在数值上等于1.5倍的ia,这会让不少初学者困惑。其实这是因为三相绕组的合成磁动势矢量分配到两相绕组上时,等效匝数不同导致的,系数1.5和√3倍是“匝数补偿”的体现。你不需要深究推导,但要记住:如果你的采样、反馈链路其他地方用了不同的变换系数,整个环路增益就会差1.5倍,调PI时参数会特别别扭。
实际上,坐标变换这一块还有一个容易踩的坑:角度对齐。α轴和a相对齐是约定俗成的,但如果你的电机编码器零点没有和a相轴线对齐,Park变换里用的电角度θ就有一个固定偏差,会导致d轴和q轴电流耦合,表现为“给了q轴电流,d轴电流却不听话地波动”。这也是为什么后面要专门做转子初始位置检测和角度对齐的原因。
3. 坐标系旋转:Park变换里的转子角度从哪来
Clarke变换做完,电流从三相交流变成了两相交流,波形还是正弦波,还没有变成直流。要让它们变成直流,就要把坐标系转到转子上,这就是Park变换干的事。
Park变换的公式看起来也很简单:
id = iα * cosθ + iβ * sinθ iq = -iα * sinθ + iβ * cosθ这里的θ是转子电角度。问题来了,这个θ怎么来?这恰恰是整个FOC里最容易出错、也最影响控制效果的地方。没有准确的转子角度,Park变换就是瞎转,d轴和q轴压根分不开,控制就成了乱控。
转子角度的获取分两类:有传感器和无传感器(无感)。有传感器就是编码器、旋转变压器、磁编码器等,直接量出机械角度,再乘以电机极对数得到电角度。这里有个工程细节:电角度一定是机械角度乘以极对数,但极对数不能搞错,4极对电机就是机械角度的4倍。实际调试时,很多人电机能转,但控制性能差,最后发现是极对数填错,比如4极对填成2极对,角度跑得慢一半,整个dq轴完全乱套。
无感方案就是通过电压、电流、反电动势等观测器来估算转子位置和速度,比如大家常听到的滑模观测器(SMO)、扩展卡尔曼滤波(EKF)、龙伯格观测器、还有近期比较流行的高频注入法(用于低速和零速)。其中滑模观测器因为实现相对简单,是入门无感FOC最常用的方案。它的基本思路是:dq坐标下的电机模型里包含反电动势项,而反电动势的方向和转子位置直接相关,通过对电流观测值进行滑模校正,把反电动势估算出来,再用反正切或者锁相环提取转子角度。它是一个闭环观测系统,参数设计有一定门槛,但比EKF友好得多。
我个人的建议是,学习阶段老老实实从有感FOC开始,哪怕用一个便宜的磁编码器(比如AS5600)把位置量出来,先把电流环、速度环、位置环跑通,理解每个环节的调参逻辑。等工作原理完全通了,再上无感。无感FOC真正麻烦的地方不仅仅在于角度估算的精度,还在于启动阶段的反电动势太弱,低速和零速下没法通过反电动势提取位置,所以需要“开环强拖”或者高频注入。很多人在网上问“无感FOC堵转检测怎么做”,就是因为无感方案在低速下位置本来就是估算的,堵转时反电动势消失,观测器很容易发散,必须额外做状态检测和故障保护。
对于转子初始位置检测,这也是一个专门的话题。有感方案很简单,编码器上电就能读绝对位置(前提是绝对值编码器)或者通过找零位的方式确定。如果是增量编码器,上电时不知道转子在哪个位置,就需要通过预定位(给一个固定方向的电压矢量,把转子强行拉到一个已知位置)或者高频脉冲检测等方法。预定位最简单,但会带着电机动一下,某些不允许上电转动的场合就不能用,那就得用高频注入或者特殊的脉冲序列判断初始角度。这个话题展开又是一大篇,我在这里先给你一个结论:如果做的是关节模组、云台这种要求上电不突动的场景,直接上绝对值编码器,省去一大半麻烦;如果要求不高,就预定位,简单粗暴,但每次上电电机会“抖”一下,要在上位机层面接受这个动作。
4. d轴和q轴电流环:PI参数到底应该怎么调
电流环是FOC的最内环,也是最关键的环。电压外环和速度外环再花哨,电流环不稳,一切等于零。电流环的作用,就是让实际的id和iq快速跟踪上给定值,响应时间通常在毫秒甚至微秒级别。
电流环的被控对象是什么?是电机定子绕组的电气方程。在dq坐标系下,PMSM的电压方程可以写成:
ud = R * id + Ld * did/dt - ωe * Lq * iq uq = R * iq + Lq * diq/dt + ωe * (Ld * id + ψf)这个方程里有个很关键的东西:耦合项。ud方程里出现了“-ωe * Lq * iq”,uq方程里出现了“+ωe * (Ld * id + ψf)”。这意味着当电机高速旋转时,d轴和q轴会互相影响。如果你只管各自做PI,高速时电流环可能出现奇怪的振荡,这就是因为耦合项没有解耦。所以成熟的FOC实现里一般会加“前馈解耦”,也就是在PI输出上补偿掉这两项,公式里对应:
ud_ref = ud_PI - ωe * Lq * iq uq_ref = uq_PI + ωe * (Ld * id + ψf)这样一来,d轴和q轴就近似变成两个独立的一阶惯性环节,PI参数设计就回到经典自控理论了。你可以根据电机参数(电阻R、电感Ld/Lq)用齐格勒-尼科尔斯法整定,也可以根据期望的电流环带宽直接计算PI增益。工程上常用的一种方式是:先根据电感和电阻算出电气时间常数τ = L/R,然后设PI控制器的零点来对消被控对象的极点,即Ti = L/R,Kp则根据期望带宽决定。
我自己调试时的习惯是:空载情况下,把给定q轴电流设成例如1A的阶跃,观察iq的响应波形,看有没有超调、有没有振荡、有没有稳态误差。先调Kp让响应变快,但Kp太大会有高频噪声放大和振荡;再调Ki消除稳态误差。d轴给定设置成0,观察它在电机旋转时是否还能稳定在0附近,如果抖动厉害,就要检查角度对齐和采样噪声。电流环的PI输出是电压,要限幅,限幅值取决于母线电压和PWM调制方式,SVPWM的线性调制范围能输出到约等于母线电压的0.577倍相电压峰值,超过这个范围就进入过调制区,波形会失真,电流环也会跟着失控。
还有一点很关键,就是电流采样的时序。FOC的电流采样不是随时都能采的,要在PWM的特定时刻进行。最常见的做法是在下桥导通、PWM计数器周期中点时采样,因为这时电流刚好是相电流的平均值附近,也是同步整流噪声最小的时候。所以你会看到很多FOC代码把ADC触发设置为PWM的center-aligned模式,定时器上溢或中央对齐时触发采样。如果触发时刻不对,采到的电流带毛刺,电流环跑不起来的。有些人调试时发现电流波形乱七八糟,第一反应是PI问题,折腾半天才发现是采样点不对,这个坑我踩过不止一次。
5. 电流采样电路:为什么采样电阻要放在下桥
电机控制热词里有个很典型的工程问题:“FOC电流采集为什么要设置在下桥?”这个问题虽然朴素,但背后包含了从硬件到算法的全套考虑。
先说拓扑。三相逆变桥上下桥臂各有一个MOS管,下桥MOS管的源极通常是接地或经过采样电阻接地。当电流从电机绕组流回下桥MOS管时,会经过这个采样电阻,电阻两端产生的压降经过放大和ADC采样,就能得到母线到该相桥臂的电流信息。
放在下桥主要有三个原因。
第一,下桥采样更容易实现低端共地。下桥采样电阻一端接功率地,一端接MOS管源极,放大电路的地和ADC的地是同一个地,信号参考明确,抗干扰容易处理。相比之下,上桥采样要检测悬浮的高边电压,要么用隔离放大器,要么用高共模电压的电流传感器,成本立刻上升。
第二,电流采样只在对应下桥MOS管导通的区间内有效。PWM调制过程中,一相桥臂的输出电压由上下MOS管占空比决定,只有在恰恰对应下桥导通的区间,电流才从采样电阻流过,才能采到这一相的相电流。所以采样时刻必须和PWM调制波对齐,通常在下桥导通区间的中点附近采样,这样采到的是该相平均电流。如果你把采样点放在死区附近或者开关切换瞬间,会采到振铃和尖峰,电流值完全不可用。
第三,成本与通用性。下桥电阻方案只需要几个精密电阻加一到两个运放,比如ACS712这类霍尔电流传感器虽然隔离方便,但带宽和精度在某些高频PWM场合不如电阻直接采样,而且价格高得多。所以绝大多数低成本电机驱动板都把采样电阻放在下桥。
这里也顺便回答另一个热词:“FOC电调会开同步整流吗?”同步整流指的是在续流阶段让另一只MOS管导通而不是靠体二极管续流,以减小损耗。对于电机FOC电调而言,SVPWM在每个扇区的调制策略里,本身就存在上桥或下桥长通、另一桥臂互补PWM的模式,这种情况下某一相的电流续流路径自然走的是MOS管的沟道,可以说FOC在某种程度上天然就利用了同步整流的机制。但需要注意,电调在低速轻载时,如果同步整流控制不好,可能产生负电流倒灌,反而影响电流采样精度和效率,所以不少电调在特定工况下会关闭同步整流或采用异步整流模式。如果你在看某个电调的原理图或源码,可以留意它的PWM死区时间和续流策略。
回到采样电路设计,下桥电阻选值要兼顾功耗与信噪比。电阻太小,压降微伏级,运放放大倍数要很大,噪声问题突出;电阻太大,功耗和发热增加,尤其在电流大的场合,采样电阻压降还会降低逆变器的电压利用率。一般取几十毫欧到几毫欧之间。放大电路要用差动或仪表放大器结构,滤除共模干扰,并在ADC输入端加一阶RC低通滤波,截止频率要高于电流环带宽但低于开关频率,别把有效信号全滤掉了。
6. SVPWM调制:从两个电压矢量到六步扇区
电流环PI的输出是dq轴电压指令ud_ref、uq_ref,经过逆Park变换得到αβ轴的电压指令uα、uβ,接下来要把它变成三个开关管的PWM占空比。这一步在经典FOC里通常用SVPWM(空间矢量脉宽调制)实现。
SVPWM的思想是:逆变器有六个开关管,组合起来有8种开关状态,其中6个非零矢量和2个零矢量。这些矢量在αβ平面里画出来是一个正六边形,把平面分成六个扇区。任何一个给定的目标电压矢量都可以由所在扇区相邻的两个基本电压矢量按时间比例合成得出,这就是“伏秒平衡”。具体计算步骤如下:
- 根据uα和uβ判断目标矢量所在的扇区
- 计算相邻两个基本矢量的作用时间T1、T2
- 分配零矢量的时间,生成各相桥臂的占空比
这里判断扇区通常会把坐标归一化到母线电压相关的基本值上,老手用一堆条件判断,新手用公式查表也行,反正结果一致。生成PWM时,比较多采用七段式SVPWM,也就是在整个PWM周期里,零矢量对称分配在首尾和中间,这样每相开关次数均匀,谐波含量低,死区影响也相对对称。当然还有五段式等不连续调制方式,开关损耗更低,但谐波稍大,高频场合看需求取舍。
SVPWM相比最原始的SPWM,直流母线电压利用率更高,能输出更大的相电压幅值,同样的母线电压下电机可以跑更高转速。这也是为什么FOC基本都配SVPWM而不是普通正弦PWM的原因之一。如果你用的是STM32等高端MCU,硬件上有高级定时器的中心对齐PWM模式和互补输出通道,SVPWM就能直接用定时器产生,配合刹车功能和死区控制,非常方便。
工程上调试SVPWM有个常用手段:开环给一个固定的电压矢量(给定uα和uβ为常数),听电机有没有“吱吱”的高频噪声,看相线上的电压波形是否是马鞍形。如果波形不对,多半是扇区计算或占空比映射出了问题。这种开环测试不接电机也能看波形,但最好还是带个小电机,低电压供电,避免炸管。
SVPWM里还有一个容易忽略的细节:过调制。当你要求的目标电压幅值超过了六边形的内切圆半径,就进入了过调制区。这时SVPWM的合成会出现非线性,电压相位会失真,电流波形变差。FOC高速运行时,随着反电动势上升,电压逐渐饱和,就会出现这种情况。解决办法就是弱磁控制:在高速区让id给出负值,削弱转子磁场,以降低反电动势,让电机能在更高转速下继续输出转矩。弱磁控制也是热词“FOC弱磁控制”的来源,后面会再展开。
7. 三环架构:电流环、速度环、位置环怎么配合
电机控制里天天提“三环控制”,指的是电流环、速度环、位置环。这件事被说得神乎其神,其实结构特别清晰:外环的输出是内环的给定,层层嵌套。
位置环在最外层,给定一个目标位置,位置环根据当前位置误差计算出目标速度。速度环接收目标速度,再根据实际速度计算出目标转矩,也就是目标iq电流(如果id给定为0的话,基本就等价于目标扭矩)。电流环接收iq给定,快速控制实际iq跟随。所以你会看到,如果你只是想控制电流(比如做电机的力矩模式),只用电流环就够了;要控制速度,就要在电流环外面加速度环;要控制位置,就再加位置环。这就是达妙电机或者各种关节模组能在CAN总线上直接实现精准关节控制的原因,本质上就是这三个环在内部串联工作。
三环的带宽设计原则是:内环带宽必须远大于外环带宽,通常相差5到10倍以上。原因很简单,每个环都会引入延迟和相位滞后,如果外环比内环还快,整个环路反馈就会产生振荡。一个典型的带宽配比可能是:电流环1kHz,速度环200Hz,位置环50Hz。这样每一级都能“看清”下一级的动态,系统才会稳定。
位置环的P(比例)一多,会产生明显的超调;位置环的D(微分)要慎用,因为位置信号一般来自编码器,微分后会把编码器的量化噪声放大。许多关节模组的位置环就是纯P控制,配合速度前馈来提高跟随性,而不是一味加D。速度环则常用PI,积分项用来消除稳态误差和静摩擦力矩的影响。调试顺序一定是从内到外:先调电流环,再调速度环,最后调位置环。别问怎么电流环还没稳就急着看位置响应,那是给自己挖坑。
如果你做的是协作机械臂关节,还会涉及“力矩前馈”“重力补偿”这些概念。其实它们就是在速度环或位置环给定上叠加一个额外的力矩补偿量,让控制器提前出力去抵消外负载,而不是等到位置偏差变大才通过反馈去纠正。这个思路在FOC控制里非常重要,因为单靠反馈环去抵抗负载突变,总会有滞后和偏差。
8. 有感FOC从零开始:一个可复现的最小调试流程
前面把原理讲了一大堆,接下来我分享一个我自己常用的、从零开始跑通有感FOC的调试流程。这个流程不依赖特定板子,MCU用STM32F4系列或G4系列都行,电机用常见的云台电机或3508电机,编码器用AS5600磁编码器或G4板载的增量编码器,驱动板用DRV8301、DRV8323或类似的集成三相栅极驱动芯片。流程分六步。
第一步,硬件自检。上电前用万用表量一遍电源正负极之间有没有短路,驱动板的母线电容有没有焊反,PWM输出的上下桥是否存在直通风险。带上电机之前,先用示波器看三个PWM通道有没有正常输出,频率一般设在20kHz左右,死区时间设在几百纳秒到一微秒之间,根据MOS管的关断延迟设置。
第二步,编码器角度读取。写一个最简单的程序,手动转电机,串口打印编码器的角度值,确认角度连续变化且和转子实际角度对应。如果是增量编码器,还要做零位标定,记录机械零位对应的计数值。
第三步,开环电流测试。不开电流环,给定一个固定的电角度θ和固定q轴电压,开环输出SVPWM,电机应该能转起来。这一步的目的是把从“电压指令到PWM输出”这一条链路验证通。如果电机不转,检查PWM极性和编码器方向;如果电机转但电流巨大,多半是占空比给太大,或者相序不对,会把板子烧掉,所以请把电源限流在安全值内。
第四步,电流采样校准。给电机一个固定方向的电压,让它静止锁死,然后用读数观察三相电流,确认id和iq的计算值和实际电路一致。校准采样放大系数,确保反馈波形没有明显毛刺。这一步特别重要,很多人第一步卡在这里,采样出来的电流数值和万用表对不上,后面PI怎么调都没用。
第五步,电流环闭环。给定iq_ref一个阶跃,id_ref设为0,慢慢加Kp和Ki,观察电流是否快速跟随且无振荡。带一点电机轴转动,看iq是否稳定。这一步做完,你的FOC电流环就正式工作了。
第六步,速度环和位置环。在电流环外面叠加速度环,调速度环PI;再叠位置环,调位置环P或加前馈。到这里,一个完整的FOC三环控制就跑通了。
这个流程里,每一步都有一个明确的验证目标,不会出现“代码都写完但是不知道问题在哪”的情况。我自己带新手都是用这个路线,基本能在半天到一天内跑通一个能转、能稳速、能定位的FOC控制项目。
9. 无感FOC的启动与堵转检测:经典难题的实用解法
无感FOC是目前热词里关注度最高的领域之一,毕竟不是每个项目都装得起编码器,也不是所有场合都能塞得下编码器。无感方案的核心难题有三个:启动、带载能力、堵转检测。这里逐一讲。
无感方案在零速时反电动势为零,电磁学上就没有可用于位置观测的信号,所以必须用其他手段先建立磁场。主流做法有两种。一是“开环强拖”,就是不给电流环位置,直接给定一个旋转频率从0慢慢升到某阈值的电压矢量,让电机跟着这个同步旋转的磁场转起来,等转速升高到反电动势足够大的时候,再切换到闭环观测器。这个方法实现简单,但开环阶段没有转矩反馈,带不动大负载,而且切换过程处理不好会有速度突变。二是“高频注入法”,对表贴式PMSM常做旋转高频电压注入,对凸极电机做脉振高频注入,通过高频电流响应来识别转子位置。这个方法在零速和低速下都有观测能力,但算法复杂,对采样精度和带宽要求高,一般用于伺服级的高性能无感应用。
工程上很多电调产品用的是开环强拖加切换,因为大多数电动工具、风扇、水泵这种负载启动阻力不大,强拖能应付。但如果你做的是类似割草机、吹风机这种启动带载场景,开环强拖会堵转,这时就得做更细致的启动策略,比如“初始位置检测 + 短时脉冲定位 + 加速曲线优化”。
堵转检测这个问题,很多时候是“测电流”和“测速度”两方面的逻辑。无感FOC里位置和速度都是估算的,堵转时电机转不动,转速为零,但电流却很大。检测逻辑可以设两类阈值:一是电流阈值法,当iq持续超过某个值且持续时间超过设定时间,判定堵转;二是速度偏差法,当估算转速持续远低于目标转速且电流较大时,判定堵转。但不能只看瞬时值,因为电机正常加速时电流也很大,所以要有时间窗口和滞回逻辑。
还有一种工程上容易忽略的情况:堵转时无感观测器很容易发散,因为电机没有反电动势了,估算角度会乱飘。这时候你看到的电流可能是失控的。所以做堵转检测,我建议在观测器输出侧也加一个合理性判断,比如角度变化率(即观测速度)是否和指令速度一致,如果不一致且持续一定时间,直接进入故障状态,关断PWM,而不是傻等电流超限再反应。烧MOS管往往就发生在“角度已经丢失但电流还没超过阈值”的那一小段时间里。
10. 弱磁控制:高速区怎么榨干电机的性能
FOC高速区有一个天然的“天花板”:反电动势会随着转速升高而不断增大,当反电动势接近母线电压能够提供的最大电压时,电流环就没办法再控制电流了,电压都用来对抗反电动势了,转矩输出能力急剧下降。为了突破这个极限,弱磁控制就登场了。
永磁同步电机的磁链来源有两个,一个是转子永磁体产生的ψf,一个是定子电流产生的磁链。如果你让id不为0,而是一个负值,定子电流产生的磁场方向和转子磁场方向相反,就会抵消一部分转子磁场,等效于降低了永磁体磁链。磁场减弱之后,同一转速下的反电动势变小,于是可以在更高转速下继续输出电压控制电流,实现了转速拓展。
对于表贴式PMSM,Ld约等于Lq,弱磁公式相对简单,一般用电压外环或查表方式产生id_ref。对于内置式PMSM,Ld和Lq差异大,不仅有弱磁效果,还可能产生磁阻转矩,这时候弱磁和MTPA(最大转矩电流比)控制是耦合的,参数辨识和标定工作量非常大。如果你只是做入门级FOC,可以先不碰弱磁;但如果你做电动工具或电动车类产品,弱磁几乎是必选项,否则最高转速上不去。
实现弱磁的工程方法有两类。一是基于电压环的自动弱磁,检测电流环输出电压是否接近限幅值,如果接近就自动增大负的id_ref,形成一个外环调整回路,这种方案参数少、不需要精确的电机电感参数,但动态响应一般。二是基于模型的弱磁查表,事先标定出不同转速和负载下的最优id、iq分配表,运行时查表,效果更细腻,但标定工作量大。两者也不是互斥的,很多产品是“查表为主 + 电压环微调为辅”。
需要注意,弱磁并不是无限有效的。转速拉得越高,需要的负id就越大,但id过大也有退磁风险——转子永磁体真的可能被强制去磁,导致电机性能永久下降。所以做弱磁控制时,一定要加id的最小限幅值,并实时监测电机温度,这是安全性问题。
11. 多电机协同与CAN总线控制:关节模组的实现思路
热词里有一条很具体:“达妙电机怎么通过CAN总线实现精准关节控制?”这类关节模组电机(比如达妙、宇树用的关节电机、还有大量开源云台电机)本质上是把FOC控制板、编码器、减速器集成在电机壳体内的一个伺服系统。上位机并不直接跑FOC,而是通过CAN总线向电机发送位置/速度/力矩指令,电机内部的三环控制器去执行。
CAN总线在这里的核心价值是实时性和确定性。CAN协议有优先级仲裁机制,每个报文带ID,通过ID大小决定竞争时的优先级,这在多电机同步控制中非常有利。与UART相比,CAN是差分信号,抗干扰强,支持多节点远距离组网;与以太网相比,CAN的帧开销小、延迟可预测,更适合周期性的实时控制指令分发。
在软件层面,关节控制指令一般分两类:同步指令和异步指令。同步指令由一个主控制器周期性广播给所有电机,比如以1kHz周期发送“目标位置+速度”,各个电机同时开始执行;异步指令用于参数配置和状态读取。CAN帧ID安排建议按模块划分,比如低字节表示电机ID,高字节表示指令类型,这样可以利用CAN的优先级实现快速响应控制类报文。
多电机协同位置控制,最核心的问题是同步性和一致性。即便每条CAN指令延迟很低,每个电机内部的电流环、速度环、位置环响应也不完全一致,如果机械结构耦合比较强,还会出现“打架”现象。这就需要在上级控制器做协调规划,比如同步启动指令、规划S形速度曲线、做主轴同步误差补偿。你不能指望每个电机都尽善尽美,而是要在系统层面把误差抵消掉。
如果你自己想做一套多电机CAN控制,最小系统可以这样搭:一块主控板(STM32F4以上,带CAN外设或外接CAN收发器)、多个支持CAN的关节模组、一个CAN转USB调试卡。主控板通过RTOS以1kHz或更高频率调度控制任务,每个周期发布一次目标指令,同时接收各电机的反馈状态。调试时先用CAN卡抓包,确认报文ID和数据映射无误,再逐步加大指令频率和电机数量。
12. 开源代码怎么读:从电机库到VESC源码的阅读理解
最后聊聊很多新手卡住的地方:开源FOC代码看不进去。我建议分三个层次去读。
第一层,读API。不用每个函数实现都看懂,先弄清接口:初始化函数、设置目标函数、使能函数、回调函数。比如VESC的代码,入口很复杂,但你先找到控制周期是怎么被调用的、从哪里读电流、从哪里写PWM、状态机怎么切换,框架就清楚了。
第二层,读数据流。拿一份FOC代码,把从电流采样到PWM输出的完整数据链捋一遍,每个环节输入输出变量的单位、范围、坐标系标注清楚。这一层你重点看Clarke变换、Park变换、PI调节器、SVPWM这几个模块。很多代码里的坐标系名称千奇百怪,比如有的叫alpha/beta,有的叫x/y,你要能辨认。
第三层,读异常处理。开源代码里往往有大量的状态判断、故障处理、限幅逻辑,这些是实际运行稳定的关键。单独的算法demo没有这些也能跑,但产品级代码必须考虑过压、欠压、过流、过温、堵转、失速、通信超时等。把这些坑全部识别一遍,你对电机控制的理解会上一个大台阶。
以STM32官方电机控制SDK为例,里面提供了基于G4的完整工程,包含MCSDK(Motor Control SDK),支持霍尔、编码器、无感等不同传感器,可在Motor Control Workbench里配置参数自动生成代码。我建议入门时打开它的调试波形功能,看一下实际的id、iq、转子角度波形,和自己的实现对比,很快能发现差异。
还有一个学习技巧:把开源代码里的PI参数故意改得极端(比如Kp很大或很小),观察波形变化。这个过程虽然会产生一些“炸管”风险,但在低电压、限流条件下是安全的,能让你直观感受每个参数对系统的影响,比我在这里用文字描述一百遍都有用。
VESC的固件源码也是极好的学习素材,里面不仅有FOC,还有电流采样校准、ADC调零、角度观测器、弱磁、堵转检测等工程细节。读的时候建议从最新稳定版开始,旧版本有些模块设计已经过时了。
读代码之外,我还推荐一个小习惯:在纸上把你要做的系统的框图画出来,从系统输入到PWM输出,标注所有反馈量和给定量的符号与单位,然后把开源代码里对应的函数名都填到框图上。这样做完,你对代码的掌控力会瞬间提升。框架烂熟于心之后,再谈定制化改进,比如换一种观测器、改一种调制策略、调一套滤波参数,都不再是盲人摸象了。