直流无刷电机的“ax、by、cz”到底怎么划分?六个轴线真的是按垂直关系来的?
我心里一直有个执念:搞直流无刷电机的人,迟早都会撞上一个叫“ax、by、cz”的术语。我第一次见它是在一份FOC控制的开源代码里,当时注释只写了一句话“Vector 1: ax”,我看得一头雾水——a我知道是A相,x又是什么?ax是指两根轴还是一个轴?后来翻了十几份资料、自己搭了一套驱动实验台才彻底搞明白,今天就把这块硬骨头一次性啃透。
直接回应用户最关心的那个问题:直流无刷电机的ax、by、cz不是按“垂直轴线”划分的。物理空间上你找不到一个叫x的绕组,它本质上是三相绕组轴(a、b、c)各自逆时针旋转90°后得到的“等效垂直轴”,而ax、by、cz这三个组合指的是六个扇区边界上的基本电压矢量,对应的是逆变器六种开关状态的切换逻辑。这里面真正在起作用的是“120°空间对称”关系和矢量合成规则,不是简单的欧氏几何垂直。
这么说可能还太抽象,下面我从电机结构讲起,把扇区划分、矢量合成、换相逻辑的来龙去脉全部拆开。
1. 直流无刷电机的三相绕组与“轴线”到底指什么
1.1 先搞清楚a、b、c三相轴线怎么来的
直流无刷电机定子上有三组绕组,分别叫A相、B相、C相,这三组绕组在空间上并不是随意分布的,而是彼此相差120°电角度。你从电机端面看过去,每个绕组都有一条自己的中心线,这条中心线就是该相的“绕组轴线”,也叫“相轴”。
对比一下有刷电机:有刷电机的电枢绕组在一个固定的换向器平面内运动,磁场是静止的,只需要一个励磁轴就可以描述。而无刷电机没有机械换向器,它的磁场位置完全靠电子开关去“追”,所以必须建立一个空间坐标系,把三相绕组各自的轴线定下来,才能知道什么时候该给哪相通电。
于是就有了最基础的三相静止坐标系:A相轴取为0°参考方向,B相轴在A相轴逆时针方向120°处,C相轴在240°处。三个轴合起来就是电机控制里天天挂在嘴边的“三相静止坐标系”。
这里有一个很多人容易懵的地方:120°是空间角度还是电角度?答案是电角度。对于一台极对数为p的电机,机械角要乘以p才是电角度。比如极对数为4的电机,A相轴和B相轴在机械上只隔30°,但电角度仍然隔120°。后面所有矢量分析都用的是电角度,这点不搞清楚,后面扇区对不上号。
1.2 x、y、z轴和a、b、c轴的关系
现在关键的部分来了。我们把三根相轴都逆时针转90°,就得到另外三根轴线,它们分别叫x轴、y轴、z轴。也就是说:
- x轴是a轴逆时针旋转90°后的线
- y轴是b轴逆时针旋转90°后的线
- z轴是c轴逆时针旋转90°后的线
所以x轴与a轴的空间夹角是90°,y轴与b轴夹角90°,z轴与c轴夹角90°。从单根轴来看确实存在垂直关系,但“ax、by、cz”这个说法并不是在描述这种成对的垂直关系,而是指相邻两根轴之间夹出来的60°扇区边界。
举个例子:a轴在0°,x轴在90°,那么a轴和x轴之间夹出来的区域就是0°到90°这个扇区,这个扇区用“ax”来标记。同理,b轴在120°,y轴在210°,两者之间夹出来的是120°到210°的扇区,标记为“by”;c轴在240°,z轴在330°,夹出来的是240°到330°的扇区,标记为“cz”。
剩下的三个扇区——x幅角90°到y幅角120°、y幅角210°到z幅角240°、z幅角330°到a幅角360°——分别对应“xy”“yz”“za”。六个扇区合起来刚好覆盖整个360°电角度平面。
所以“按垂直轴线划分”这个说法只能算说对了一半:x、y、z确实分别是a、b、c的垂直轴,但划分扇区用的不是“每对垂直轴自己玩自己的”,而是“所有六根轴按圆周顺序排列,相邻两根之间的区域就是一个扇区”。这是两个完全不同的逻辑。
1.3 为什么偏偏要弄出x、y、z这三根辅助轴
直接拿a、b、c三根轴也能把平面分成三份,每份120°,为什么非要逆时针转90°,再做x、y、z?
答案藏在逆变器的开关状态里。一个三相全桥逆变器有6个功率管,分上下桥臂,每一相桥臂只有两种状态:上管开下管关(记为1),或者下管开上管关(记为0)。三相组合起来一共有8种开关状态,其中6种是有效的“非零矢量”,2种是“零矢量”。
这6个非零矢量在空间上正好相隔60°排列,而不是相隔120°。要让这6个矢量和三相绕组的空间位置挂上钩,就必须在原本只有3根相轴的坐标系里插入3根辅助轴,让相邻矢量的间隔变成60°。这3根辅助轴就是x、y、z。它们不是物理绕组,纯粹是几何辅助线,但少了它们,SVPWM的扇区划分就讲不清楚。
所以我再强调一次:ax、by、cz不是三条独立的“垂直轴组合”,而是六个开关矢量在空间上划分出来的扇区名称,只是恰好用到了垂直辅助轴的符号来表达。
2. 六个基本电压矢量:ax、by、cz背后的开关状态
2.1 从桥臂状态到电压矢量
逆变器的六个非零开关状态是什么?两电平三相全桥逆变器只有2³=8种组合,去掉000和111这两个全下通/全上通的零矢量,剩下6个有效状态。
以“上管开=1、下管开=0”为约定,6个有效开关状态是:
- 100:A相上管开,B相下管开,C相下管开
- 110:A相上管开,B相上管开,C相下管开
- 010:A相下管开,B相上管开,C相下管开
- 011:A相下管开,B相上管开,C相上管开
- 001:A相下管开,B相下管开,C相上管开
- 101:A相上管开,B相下管开,C相上管开
这6个状态分别对应6个非零电压矢量。把这6个矢量画在复平面上,令A相轴为0°方向,并且把“100”这个状态对应的矢量放在0°位置,就会得到一个等边六边形的6个顶点,相邻矢量间隔60°。
那么这个六边形的六个顶点怎么命名?一种常见的命名方式就是:0°位置写“ax”,60°位置写“by”,120°位置写“cz”,180°位置写“xy”的相反方向、或者从另一侧数。说白了,ax、by、cz指的就是6个顶点中的3个(还有3个是它们的反方向组合)。
这里要特别说明:不同资料对6个矢量的具体名称有不同写法,有些写U1~U6,有些写V1~V6,还有的写“100、110、010、011、001、101”。但无论写法怎么变,“ax、by、cz”永远是彼此间隔120°的那三个方向,而“ax、bx、cx”这种写法反而不存在——因为单相只有一个轴,不会同时又a又x。
2.2 矢量号和扇区号的对应关系
前面说过6个扇区是:
- 扇区1:a轴(0°)到x轴(90°),即“ax”扇区
- 扇区2:x轴(90°)到b轴(120°),即“xb”扇区
- 扇区3:b轴(120°)到y轴(210°),即“by”扇区
- 扇区4:y轴(210°)到c轴(240°),即“yc”扇区
- 扇区5:c轴(240°)到z轴(330°),即“cz”扇区
- 扇区6:z轴(330°)到a轴(360°/0°),即“za”扇区
如果把每个扇区对应的“合成该扇区所需的基本矢量对”列出来,就更有意思了:
| 扇区名 | 角度范围 | 参与合成的基本矢量 |
|---|---|---|
| ax | 0°~90° | 100 和 110 |
| xb | 90°~120° | 110 和 010 |
| by | 120°~210° | 010 和 011 |
| yc | 210°~240° | 011 和 001 |
| cz | 240°~330° | 001 和 101 |
| za | 330°~360° | 101 和 100 |
看出来规律了吗?每个扇区都是由“当前开关状态”和“下一次换相后的开关状态”这两个相邻矢量合成的。扇区的边界正好是开关状态切换的时刻。这就是为什么扇区划分本质上是一个换相逻辑问题,而不是纯粹的几何问题。
2.3 为什么不用“ab、bc、ca”而要绕个弯用“ax、by、cz”
很多人第一次看到ax、by、cz会觉得多此一举:三相绕组明明就是a、b、c,按a到b、b到c、c到a划分不是更直观吗?
问题在于,三相绕组之间的夹角是120°,而六个有效矢量之间的夹角是60°。如果按a、b、c三个相轴来划分,只能得到3个120°的大扇区,无法体现6步换相“每60°切换一次”的实际逻辑。
打个比方:三相绕组像十字路口的三条主干道,彼此夹角120°,但车辆(转子磁场方向)每开过60°就要换一条行车规则,这个60°的“路口”是插在主干道之间的辅助街道,也就是x、y、z。没有这些辅助标记,你没办法把6步换相讲清楚。
更实际的问题是:FOC/SVPWM算法里需要根据转子位置判断当前处于哪个60°扇区,然后选择两个相邻的基本矢量去合成目标电压。如果只分3个扇区,一个扇区覆盖120°,合成精度直接差了一倍,电流谐波、转矩脉动都会明显恶化。所以工程上必须用6扇区,必须引入x、y、z。
2.4 直流无刷电机传统120°导通与矢量扇区的关系
这里要格外提醒一句:上面讲的6扇区、SVPWM是**矢量控制(FOC)**语境下的概念。而传统直流无刷电机的方波控制(120°导通、六步换相)虽然也是6步,但是它的逻辑更简单:任意时刻只有两相导通,第三相悬空,靠反电动势过零点检测来换相。
方波控制也有“换相状态”的概念,开关状态同样是100、110、010、011、001、101这6个,顺序一模一样。所以很多做方波控制的老工程师也习惯把换相表叫做“ax、by、cz表”。本质上,两种控制的“位置分区”都是60°电角度一个区,只是FOC在每个扇区内做矢量合成,方波控制在每个扇区内只输出固定的开关状态。
这解释了为什么网上搜“ax by cz”会出现两种画风:一种是FOC教程里的扇区矢量图,一种是无刷电机换相表的注释。两种说法指向的底层是同一套六状态换相逻辑。
2.5 电角度、机械角度与扇区宽度的换算
再补充一个工程计算的小例子。假设一台无刷电机极对数是4,那么360°电角度对应90°机械角度,每个扇区60°电角度只对应15°机械角度。用编码器测位置时,必须把机械角度乘以极对数p换算成电角度,再除以60°得到扇区号。
计算公式很直接:
- 电角度θe = 机械角度θm × p
- 扇区号 = floor(θe / 60°) + 1(注意角度需归一化到0°~360°)
很多初写FOC的人栽在“电角度没乘极对数”上:电机转起来后扇区判断乱七八糟,电流波形是乱的,力矩忽大忽小,最后查半天发现是编码器角度没换算。我的经验是把极对数写成一个宏定义,初始化时强制检查一遍,这种低级错误能避掉一半。
3. 从扇区划分到SVPWM实现:ax、by、cz怎么被用起来
3.1 SVPWM的核心思路:相邻矢量合成
讲完扇区划分,自然要问:知道当前在哪个扇区之后,到底怎么用“ax、by、cz”这些信息去产生PWM波形?
SVPWM的根本思路是“伏秒平衡”加“相邻矢量合成”:在一个PWM周期Ts内,如果目标电压矢量落在某个扇区,就用这个扇区的两个边界基本矢量分别作用一段时间T1、T2,剩余时间T0用零矢量填充。只要Ts足够短,电流就能近似平滑。
以扇区1(ax扇区,0°~90°)为例,边界矢量是100(对应a轴方向)和110(对应a轴逆时针60°方向)。设目标电压矢量幅值为Vref,角度为γ(0°<γ<90°),则两个矢量的作用时间可以由正弦定理推导出来:
- T1 = √3 × Ts × (Vref/Vdc) × sin(60° - γ)
- T2 = √3 × Ts × (Vref/Vdc) × sin(γ)
- T0 = Ts - T1 - T2
注意Vdc是母线电压,作用时间会受母线电压限制。如果算出来的T1、T2之和超过Ts,说明目标电压已经超出了线性调制范围,需要做过调制处理,否则波形会失真。
有人会问:为什么要用扇区边界矢量做合成,而不是直接用三相占空比算?直接算当然也可以,而且某些实现里确实会用等效的“标幺化三相电压”去算,但SVPWM的优势在于它天然把“两相导通/三相导通”的开关策略和“最大母线电压利用率”绑在了一起。相比之下,直接正弦波PWM的母线电压利用率只有SVPWM的86.6%,也就是直流母线电压利用率差了约15%,对电机出力影响很大。
3.2 扇区判断的工程实现
怎么判断当前电压矢量落在哪个扇区?最直接的办法就是用转子位置(电角度)来判断:θe在0°~90°就是扇区1,90°~120°是扇区2,以此类推。FOC里面目标电压矢量由电流环输出给定,角度和幅值都是已知量,判断起来并不复杂。
更经典的实现是“三值法”或“五值法”:把三相电压的标幺值Ua、Ub、Uc做比较,得到三个布尔量,从而查表得到扇区号。这种方法的好处是不需要计算反正切,适合在定点DSP或低成本MCU上跑。
我自己在STM32上实现FOC时,用的是“电角度查表 + 三值校验”的双保险:先用θe粗判扇区,再用三相电压关系校验一遍。这个方法比纯查表多花十几个周期,但能有效避免角度跳变时的误判,实测在电机高速运行(6万转电转速)时也不会扇区错乱。
3.3 PWM占空比计算与更新时机
确定扇区后,还要把T1、T2、T0映射到三相桥臂的占空比上。每个扇区对应一组特定的桥臂导通模式:扇区1里“110”状态代表A、B上管导通,扇区2里“010”代表B上管导通,以此类推。实际输出时通常采用“七段式”或“五段式”插入零矢量,七段式谐波性能好、开关损耗略高,五段式开关损耗低但谐波稍大。
代码层面最关键的是PWM更新的时机。我踩过最大的坑是在定时器上溢中断里直接修改CCR寄存器,但没等到载波周期结束就更新,导致同一个周期内开关状态跳变,相电流里全是毛刺,噪声大得吓人。正确做法是用单次更新模式:在定时器计数到0的时候预加载新的占空比值,等计数器走完整个周期才生效。
3.4 母线电压利用率与过调制
前面提到过调制比的概念,这直接关系到电机能跑到多高的转速。SVPWM的线性调制比上限是1.1547,也就是说它能输出的最大相电压幅值是正弦PWM的1.1547倍。
如果你的项目需要电机高速运行,比如电动工具的空载转速到2万转以上,母线电压又受限,就必须考虑过调制。工程上常见的做法是:当T1+T2>Ts时,按比例把T1和T2缩回Ts。但过调制会引入低次谐波,电流畸变增大,电机噪声和铁损都会上升。我的建议是在常规应用中尽量避开过调制,优先提高母线电压或者降低绕组反电动势系数Ke。
3.5 零矢量分配的一个容易忽略的细节
很多人写SVPWM时,会把T0平均分给000和111两个零矢量。这样做没毛病,但要注意零矢量的插入位置会影响电流纹波。
七段式发波顺序通常是“000-100-110-111-110-100-000”,这样每个PWM周期内开关动作次数最少。如果零矢量分配不均匀,比如只用了000没分布111,虽然没有致命问题,但电流纹波会略大。工程里我习惯让两个零矢量严格均分,并且在代码里把通道极性配合好,让每次只在桥臂一侧切换,减小功率管的开关损耗。
4. 实操实录:我用手头一套无刷电机验证扇区划分的正确性
4.1 实验平台配置
光讲理论不带实操等于空中楼阁。我手头有一台随便淘来的48V直流无刷电机,额定功率500W,极对数4,配了1024线增量式编码器,控制器是STM32F103加一颗IR2101驱动芯片,两电平三相全桥。这套组合很常见,几乎就是实验室标配。
我在这套平台上跑了三种模式做对比:开环六步换相(方波控制)、带霍尔传感器的FOC、无感FOC(滑模观测器)。三种模式的扇区判断逻辑完全不同,正好用来验证“ax、by、cz”这个概念在真实电机里的表现。
4.2 六步换相的开环验证
先把霍尔传感器接上,用最简单的120°导通方式开环转动。霍尔信号是三相互补的,六个边沿对应六个转子位置区间,每个区间对应一个换相状态。
我在程序里把六个换相状态分别命名为AX、BY、CZ、XY、YZ、ZA,对应霍尔状态表的六个位置。运行后电机正常旋转,用示波器抓三相电流波形,可以看到典型的梯形波——这验证了“每个扇区一个固定开关状态”的方波控制逻辑是正确工作的。
这个阶段最重要的一件事是霍尔信号与开关状态的对应顺序。如果接反了或者顺序错了,电机要么不转,要么反转。可以用一个小技巧:先把电机卡在一个已知机械位置,手动给一个固定开关状态,观察电机是往哪个方向偏转,再逐项核对霍尔表。
4.3 FOC模式下扇区判断与电流波形
接着切到FOC模式。让电流环工作,每40微秒做一次电流采样,把电角度算出来,然后判断目标电压矢量落在哪个扇区,查表得到T1、T2,更新PWM。
我特意把扇区号、T1、T2、电角度这些变量全部通过DAC输出到示波器上,做实时观察。当电机运行在额定转速附近时,扇区号按1、2、3、4、5、6的顺序循环跳变,每个扇区持续时间应该完全相等。实测数据表明在稳态下误差小于1%,说明扇区判断逻辑是准确的。
如果哪个扇区的持续时间明显偏短或者跳号,最常见的两个原因:一是编码器Z脉冲没校准,电角度零点不对;二是电角度换算时极对数搞错。这两类问题在FOC调试中至少占七成概率。
4.4 无感FOC:位置估计与扇区一致性校验
无感FOC不依赖霍尔和编码器,仅通过电流电压反推转子位置。我用的滑模观测器输出的是一个估计电角度,同样用这个角度去查扇区、合成电压矢量。
无感模式的扇区判断误差通常比有感模式大,因为估计角度会有相位延迟。解决办法是做一个滞后补偿:在中高速段,估算角度补偿量等于“角速度乘以延迟时间”。我用开环带霍尔的数据作为基准,对比估计角度和真实角度,把补偿量标定出来后,扇区切换点基本能和实际换相时刻对齐。
无感FOC里最容易出的问题是低速下估算角度抖动,导致扇区号在边界附近来回跳。如果跳得频繁,换相就变得不稳定,电机发出的声音很明显,电流波形跟锯齿似的。我的经验是把扇区判断加一个小的滞回区间:比如在扇区边界附近,只有越过边界2°以上才切换扇区号。这个2°滞回区间能让系统稳定性提升一大截,付出的代价仅仅是控制相位滞后一点点,肉眼和手感完全察觉不到。
4.5 实测数据:不同载波频率下的扇区切换稳定性
我把载波频率分别设为10kHz、16kHz、20kHz,各跑5分钟。10kHz时电流纹波明显偏大,相电流FFT里高频分量多;20kHz时噪声更低,但开关损耗上升,驱动芯片温度升高了大约8℃。
在16kHz载波下,扇区切换抖动频率最低,综合表现最好。这个16kHz的选择不是拍脑袋定出来的,而是结合了驱动器的开关损耗曲线、电流采样时间、以及控制周期三个约束来权衡的。一般商用低压驱动器的载波频率都定在15~20kHz之间,也是这个道理。
顺带一提:如果是电动工具那种高速小电感电机,载波频率反而要更高,否则一个PWM周期里相电流就可能冲到保护值。
5. 常见问题与排查技巧:调试“ax、by、cz”时的避坑实录
5.1 扇区编号错乱,电机抖动严重
现象:电机一转就咔咔响,电流波形杂乱,转速根本稳不住。
排查步骤:
- 先确认电角度零点:用手转动电机,观察电角度从0°到360°是否单调线性递增。如果中间出现跳变,先怀疑编码器A/B信号接反或者Z信号没对准。
- 再用示波器分别抓UVW三相反电动势,和编码器Z脉冲对比相位,确认电角度零点对应的反电动势过零点位置。
- 如果以上都正确但扇区仍然错乱,就把扇区号也通过DAC输出,肉眼对比扇区跳变顺序和换相表逻辑是否一致。
我遇到的极端案例是编码器A/B相都正常,但电机相序标错了——控制器上写的U相其实是电机的W相。这种错位在FOC里表现为“平稳启动不了、一加力就失步”,但在开环六步换相时反而不明显,很容易漏检。所以我的习惯是拿到电机先做一次相序自动辨识再进闭环。
5.2 电流波形在一个扇区内畸变
现象:扇区切换点本身正常,但某个扇区内部电流波形明显比其他扇区差,或者每个扇区内都有一个固定位置的凸起。
大概率是PWM占空比更新时机的问题。我之前踩过:在定时器上溢中断里更新CCR,但中断里又跑了太长的代码,导致部分通道的CCR在重装点之后才写入,波形就在那个位置变形了。
正确做法:把重载对齐到定时器计数归零时刻,并且尽量缩短中断内的代码执行时间。如果ADC采样也占用了PWM同周期,就要仔细设计采样触发点,避免采样窗口跨越开关切换点。
我通常把电流采样触发点放在PWM中心(三角波载波的低点),因为此时零矢量作用、相电压和反电动势的关系最简单,采到的电流最接近基波电流,对矢量控制最友好。
5.3 高速时扇区判断不稳定
现象:低速一切正常,转速跑到2000rpm以上时开始断断续续掉扭矩,电流波形高频毛刺暴增。
这就是典型的“角度获取延迟”问题。机械转速2000rpm、极对数4时,电转速是8000rpm,约133转/秒,电角度每秒变化48000度,每个电角度周期只需要7.5ms。如果编码器脉冲计数或角度滤波延迟了哪怕几十微秒,扇区切换相位就偏了几度到十几度。
对策有两个方向:一是提高角度采样频率,把编码器计数和电流采样在同一时刻完成,尽量不引入时延;二是做速度前馈补偿,把转速乘以延迟时间加到角度估计值里面。我实测下来,加上补偿之后高速扇区判断抖动量下降了至少一半。
5.4 电机能转但力矩特别小
最后说一个“症状轻但特别讨厌”的问题:电机转得挺顺,但输出力矩明显不足,感觉像有几相只是凑数。
这个状态往往是扇区判断正确但矢量合成方向错了,或者电流环的矢量坐标变换方向不对。具体来说,如果目标电压矢量的角度方向是顺时针而电机实际需要逆时针旋转,那电流环会一直处于“反向限幅”状态。
排查时给一个固定方向的电流指令,然后手动缓慢旋转转子,观察目标电压矢量是否按预期方向移动。如果移动方向反了,把两相相序互换即可。这个方法比翻代码快得多,而且绝对有效。
5.5 常见问题速查表
| 故障现象 | 最可能原因 | 快速检查方法 |
|---|---|---|
| 电机抖动、噪声大 | 电角度零点不对或相序接反 | 看电角度曲线是否单调递增、对比反电动势相位 |
| 启动失败或倒转 | 霍尔接线顺序错、编码器方向反 | 手动状态逐项核对换相表、交换任意两相线 |
| 高速掉扭矩 | 角度延迟补偿不足 | 加转速前馈补偿、提高采样率 |
| 单扇区电流畸变 | PWM更新点不对齐 | 检查CCR预装载配置、缩短中断执行时间 |
| 直流母线电压利用率低 | 调制方式错误(用了SPWM而非SVPWM) | 检查扇区合成逻辑是否启用、对比母线电压至相电压增益 |
6. 从扇区划分到项目落地:两种控制策略的选型建议
6.1 方波控制和FOC各自的“ax、by、cz”用法
同一个“ax、by、cz”概念,在不同控制模式下使用方式完全不同,这是我做项目时特别想强调的一点:
方波控制:每个扇区只输出一个固定的开关状态,也就是常说的“六步换相”。它的控制量是离散的,通常只需要霍尔传感器测位置。优点是算法极简、对MCU要求低、成本低;缺点是换相瞬间存在转矩脉动,噪音大,效率也不如FOC。
FOC/SVPWM:每个扇区内不是固定开关状态,而是用两个相邻基本矢量去合成任意方向、任意大小的目标电压矢量。控制量是连续的,需要精确的转子位置和电流闭环。优点是转矩平稳、噪音低、效率高;缺点是算法复杂、调速范围受电流环带宽限制。
6.2 高效选型:按应用场景选控制策略和传感器组合
直流无刷电机的应用场景五花八门,但基本可以分三类:
消费电子类(无人机、风扇、吸尘器):更看重噪音和效率之间的平衡,FOC是主流方向,但很多低成本场景用方波控制也足够。比如风扇,方波控制的噪音已经能控制在比较低的水平,没必要上FOC。
电动工具类(电钻、角磨机、园林机):更看重过载能力和转速范围,FOC的优势非常明显,尤其是低转速大扭矩的工况下,方波控制表现就差很多。电动工具的高转速对角度估算延迟很敏感,这也是无感FOC在电动工具上大面积落地的原因。
工业伺服类(机器人关节、自动化设备):必须用FOC甚至高性能伺服算法。它要求极低的转矩脉动、极高的动态响应,而且通常配高分辨率编码器,扇区判断精度可以达到0.1°以内,远超霍尔传感器的分辨率上限。
6.3 低成本无感FOC的扇区估算方法
既然提到无感FOC,给新手补一个最常见的低成本方案:反电动势过零检测。它不用High Frequency Injection,只在中高速段使用滑模观测器估算转子位置,低速段靠开环强拖启动,等估算角度足够收敛后再切闭环。
这种方案在低速段的扇区判断不是靠角度闭环,而是靠“预设的换相序列表”强拖。换相指令按“ax、by、cz、xy、yz、za”的顺序周期发送,电机像一个步进电机一样被硬拖着转起来。等转速超过阈值后,滑模观测器开始接管位置估算,控制权平稳移交。
关键在于切换瞬间的角度差不能太大。如果强拖阶段的换相周期和闭环阶段估算角度对不上,切换时就会出现剧烈抖动甚至失步。我通常的做法是:在强拖阶段就实时计算滑模观测器的角度,但只在角度误差小于30°时允许切换。这个30°的经验值是我调出来的,再大一点切换冲击明显,再小一点切换成功率会降低。
6.4 谈谈霍尔传感器与扇区定位的关系
有些资料会把霍尔传感器和三相互差120°的霍尔信号直接等同于三个扇区边界。这种说法不够严谨,但确实体现了霍尔信号是扇区判断的最廉价实现。
位置传感器有三种常见方案:霍尔开关、增量式编码器、磁编码器。
- 霍尔开关:虽然只有6个离散位置,但对大多数方波控制来说完全够用。它不产生多余的延时,信号处理极为简单,在电动工具和部分家电里依然占据主流。
- 增量式编码器:位置分辨率高,适合FOC,但需要校准Z脉冲作为绝对位置零点。如果设备开机后没有绝对的机械零点,DSP在上电后需要执行一次“带霍尔找零”的初始化流程。
- 磁编码器(比如AS5600、MT6816):位置绝对、体积小、成本可控,是近两年无刷电机行业里增长非常快的一个方向。它通过SPI或者ABZ输出绝对角度,省去了增量式编码器的找零麻烦,非常推荐在有条件的项目里替代增量式编码器。
需要补充的是:霍尔传感器通常放置位置是电角度间隔60°或120°,但配置霍尔时角度要和三相绕组的实际空间位置严格对应。差一点点都会导致换相点偏移,表现为某一相的电流比其他两相大,电机发热异常。
6.5 控制器算力与实时性考量
FOC的实时性要求决定了扇区判断必须在每个电流环周期内完成。我常用STM32F103跑5kHz的电流环,一个周期内要完成ADC采样、坐标变换、PI调节、SVPWM扇区计算,全部代码走一遍大约是20~30微秒,不到一个控制周期的一半,所以还有余量做故障保护。
如果你的项目用的是更低成本的MCU,比如8位机加上内部比较器,跑方波控制可能更合适。硬要上FOC也不是不行,但电流环频率上不去,动态响应会很差。我见过有人在STM8上硬跑FOC,电流环只有1kHz,电机低速时还好,转速一高就直接失控,这就是算力配比不合理。
7. 结个尾,说点实在的
根据我个人的项目经验,“ax、by、cz”这类术语的迷惑性不在数学本身,而在它把几种不同维度的概念压缩在几个缩写里:既有空间轴线的几何含义,又有开关状态组合的代数含义,还有控制时序的工程含义。初学者如果只看命名,很容易被“垂直”“轴线”这些词带偏,忘掉了背后真正的主线——三相绕组的对称空间关系和无刷电机六步换相的底层逻辑。
我的建议是:当你真的在调一套无刷电机驱动,遇到扇区相关的疑难问题时,先回到“电机端面”“逆变器开关状态”“电角度”这三个基本层面上重新画一遍图。把a、b、c轴画出来,再把x、y、z轴补上,然后把六个开关状态标到对应位置,90%的扇区混淆问题当场就能解决。
最后分享一个小技巧:调试FOC时,我在代码里保留了一个“手动扇区测试模式”——通过串口命令把目标电压矢量锁定在某个固定扇区,再手动旋转电机观察电流响应。这个模式帮我定位过不止一次相序、编码器方向、PWM更新时机的问题。如果你也在调无刷驱动,强烈建议留一个类似的调试后门,往往比加日志管用得多。
下次再有人问“ax、by、cz是不是按垂直轴线划分的”,你可以直接告诉他:这六个字母标记的本质是六个60°扇区,是三相绕组空间对称和逆变器开关逻辑共同决定的,和“垂直轴线”只有半毛钱关系,那半毛钱还是因为x、y、z本身是由相轴旋转90°而得名的。仅此而已。