1. 把ax by cz这个问题先聊透先说说这个标题。说实话ax两个字单独摆出来正常人第一反应都是懵的是数学里的坐标轴是某个软件的命令还是一种电机型号但它配上直流无刷电机和按垂直轴线划分这些热词之后思路一下就清楚了——大家真正想问的是运动控制里那套绕来绕去的坐标系划分规则尤其是无刷电机控制中轴这个概念到底怎么定义、怎么划分。我先给一个直接的结论如果你在某个文档、测试题或者厂家手册里看到ax by cz这种写法它通常描述的是在空间直角坐标系中沿x轴、y轴、z轴三条互相垂直的轴线分别施加运动量a、b、c。这个划分确实是基于垂直轴线来理解的因为x、y、z三条轴两两垂直构成一个标准的右手笛卡尔坐标系。比如ax 10 by 20 cz 30意思就是x轴方向走10、y轴方向走20、z轴方向走30这在机器人位姿描述和数控G代码里非常常见。但这里有个容易混淆的地方无刷电机控制中说的轴和空间几何里的x/y/z轴线并不是一回事。直流无刷电机BLDC和永磁同步电机PMSM的控制系统里有abc三相坐标系、αβ两相静止坐标系、dq同步旋转坐标系。这些坐标系也是轴但它们的划分依据不是空间几何里的垂直关系而是电机内部磁场的电气角度关系和绕组的空间分布。那为什么大家会把ax by cz和电机控制联系到一起一种可能是在某些教学场景或运动控制平台里电机作为执行器最终输出的运动就是沿x、y、z三条轴线的位移或力矩。你要控制一个三轴运动平台电机驱动丝杆x轴电机、y轴电机、z轴电机各自出力这种按垂直轴线划分完全说得通。另一种可能是在讲矢量控制时有人用a轴、b轴、c轴代表三相绕组轴线而这三相轴线在空间上确实是相隔120度布置的并不是垂直的。这就是最典型的认知冲突点。先把这层关系理顺空间运动学里的按垂直轴线划分指的是笛卡尔坐标系下三个自由度电机控制里的坐标变换指的是从三相静止绕组坐标系变换到两相旋转坐标系。两者都叫轴但讨论的层面完全不同。搞混了这个再看任何坐标系公式都会觉得拧巴。2. 无刷电机控制绕不开的三套坐标系2.1 abc三相静止坐标系——最接近物理实物的轴系如果你拆开一台直流无刷电机看到的就是三组绕组分别用A、B、C命名。这三相绕组在定子圆周上相隔120度电角度放置通上电流之后每一相都会产生一个磁动势。abc三相静止坐标系就是直接按照这三套绕组的空间轴线来定义的所以它是最接近电机物理结构的坐标系。在这个坐标系里每一相的电流ia、ib、ic是独立变量吗从物理上讲是但有一个约束如果没有中性线引出三相电流的瞬时值之和恒等于零也就是ia ib ic 0。这个约束非常关键因为你在做坐标变换的时候可以利用它把三相变量简化成两相变量少算一路。实际项目里采集abc三相电流一般是采样两相就够了第三相用负两相之和算出来。这算不算按垂直轴线划分当然不算abc三轴互相之间只差120度不是垂直。但在电机控制的概念里它们就是天然的参考轴线——所有变换都是从这三根轴出发的。2.2 αβ两相静止坐标系——把三根轴化成一横一竖abc坐标系的缺点很明显三个变量之间存在耦合而且磁场方向跟着转子转分析和控制起来麻烦。这时候就需要做一个数学上的降维处理把三相相隔120度的轴线等效变换成两相相隔90度的轴线这就是αβ坐标系也叫两相静止坐标系。你可能想问凭什么三相能变成两相原因是三相电流产生的合成磁动势是一个旋转的圆形磁场而这个合成磁动势用两个互相垂直的分量就能完整描述。α轴通常和A轴重合β轴超前α轴90度电角度。这里出现了垂直——α和β确实是垂直的。所以严格来说无刷电机坐标系里的第一处按垂直轴线划分发生在Clarke变换之后而不是三相本身。Clarke变换的公式不复杂。保持幅值不变的前提下变换矩阵是[ \begin{bmatrix} i_\alpha \ i_\beta \end{bmatrix}\frac{2}{3} \begin{bmatrix} 1 -\frac{1}{2} -\frac{1}{2} \ 0 \frac{\sqrt{3}}{2} -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_a \ i_b \ i_c \end{bmatrix} ]这个2/3因子是很多新手最容易忘记的东西。如果不乘2/3变换前后电流幅值不一致你在电流环里算出来的PI输出就会系统性偏大或偏小表现出来的症状就是电流环静态误差消不掉。另一个选择是用等功率变换系数变成√(2/3)两种变换各有用途——电流环建议用等幅值变换功率计算建议用等功率变换千万别混用。2.3 dq同步旋转坐标系——让交流电机看起来像直流电机αβ坐标系还是静止的里面的电流分量依然是交流量PI控制器在交流量上工作性能并不好因为PI天然擅长跟踪直流给定对正弦参考的跟踪总有稳态误差。这时候就引入了dq旋转坐标系让坐标轴跟着转子磁场一起转d轴对齐转子磁极方向q轴超前d轴90度电角度。dq坐标系之后电机的电流模型变成了直流模型id是励磁分量iq是转矩分量。你控制iq就等于直接控制转矩控制id就可以调节磁场强弱。这才是矢量控制FOC的核心思想——把一个交流电机在数学上等效成直流电机来控。回到垂直轴线这一点d轴和q轴在空间上相差90度电角度这又是垂直的。所以无刷电机坐标系里确实有两条垂直关系αβ静止坐标系的α/β垂直dq旋转坐标系的d/q垂直。而abc三相绕组轴线彼此相差120度反而不是垂直的。如果有人笼统地问直流无刷电机的轴是不是按垂直划分的答案要看在哪个坐标系里讨论。3. 坐标变换到底怎么算代码长什么样3.1 从abc到αβClarke变换的工程写法实际写代码的时候Clarke变换通常不用矩阵形式而是直接用标量表达式。因为有了ia ib ic 0这个约束可以化简。假设你采集了ia和ib那么ic -ia - ib代入Clarke变换式并化简可以得到i_alpha ia; i_beta (ia 2.0f * ib) * 0.57735027f; // 1/sqrt(3)等一下这个式子和上面的矩阵形式不一样对这就是利用三相平衡消去ic之后的简化结果注意这里的系数是1/√3而不是√3/2的再组合。很多老工程师手写的代码里这么干速度最快但前提是电机三相绕组对称、无中性线。如果电机有中性线或者三相不平衡明显就不能这么做了还得老实按矩阵算。实际操作中我建议先按完整矩阵写版本调试通过、确认三相电流对称之后再简化。不要上来就用简化版否则出了问题你很难判断是变换错了还是电机本身有问题。3.2 从αβ到dqPark变换的角度到底取哪个Park变换是坐标变换中最容易翻车的地方因为它涉及到角度。[ \begin{bmatrix} i_d \ i_q \end{bmatrix}\begin{bmatrix} \cos\theta_e \sin\theta_e \ -\sin\theta_e \cos\theta_e \end{bmatrix} \begin{bmatrix} i_\alpha \ i_\beta \end{bmatrix} ]这里的θe是转子电角度这个角度的零点定义直接决定了d轴和转子磁极的对齐关系。不同的电机、不同的编码器安装方式甚至不同的软件库θe的零点定义都可能不一样。你用别人的代码时如果电机不转或者电流失控第一个怀疑对象就应该是这个角度零点。从工程实现角度θe一般由位置传感器算出增量式编码器通过Z脉冲校零并累计脉冲数换算电角度绝对式编码器直接读出机械角度再乘以极对数。换算公式是θe 机械角度 × 极对数但要注意机械角度的零点是否与电机磁极对齐。如果编码器安装时没有对齐你需要做一个角度校准把偏移量记录并补偿。3.3 电机控制的灵魂转子角度对齐我见过太多硬件没问题、代码逻辑也没错的FOC项目唯独电机就是转不起来或者一加负载就过流。排查到最后十有八九是转子的初始角度没对齐。角度校准的最土办法是开环强拖给q轴电流一个固定值比如额定电流的5%~10%让电机转子转到d轴对齐的位置停止然后把此时编码器的读数记为角度零点。这个过程说起来容易做起来有几个注意事项第一给定电流不能太大否则转子冲过头或者发热。第二电机轴上最好不带负载尤其不能带那种有阻力矩的减速箱。第三如果电机带了绝对式编码器校完零之后要把偏移量写进EEPROM或Flash程序启动时主动读取而不是每次上电都重新校准。否则下次上电机械位置一变角度全部乱掉。这个校准动作的本质就是把坐标系怎么划分这个问题落到硬件上——你在软件里定义的d轴必须和电机转子真实的磁极方向重合这样id、iq的物理意义才成立。任何坐标变换公式本身没有错错只错在你给变换器喂的角度不准确。4. 落地过程中最常踩的坑4.1 上电转不转、反转、尖叫——先分情况现象一给电流命令但电机纹丝不动。这时先检查角度是否在变化——如果编码器读数不变说明位置传感器没接对或者供电有问题。现象二电机反方向转通常是电机相序和编码器方向不匹配。说白了就是你的Clarke变换假设的A/B/C顺序和实际电机绕组通电产生的磁场旋转方向不一致。解决方法是交换任意两相电机线或者翻转编码器计数方向二选一千万别两个同时改那等于原地踏步。现象三电机发出高频尖叫多半是电流环带宽太高或者PI参数太激进还有可能是载波频率与电机的电气频率产生了可听噪声共振。4.2 编码器零位漂移这个隐形杀手增量式编码器只有相对位置每次上电要找Z脉冲才能确定绝对位置。如果你的程序在上电之后、电机转动之前没有正确等待Z脉冲而是在一个随机角度就开始做闭环那电机一定会抽搐。正确的启动流程应该是上电 → 读取或等待Z信号 → 确定绝对角度 → 执行角度校准 → 使能闭环。磁编码器比如AS5600这类不存在Z脉冲问题直接输出绝对角度但要注意它的安装同心度——偏心太大会导致角度误差周期性波动表现在电流上就是转矩脉动。还有温度因素。磁编码器对温度漂移比较敏感有些廉价磁编码器在温度变化20摄氏度之后角度误差能到两三度电角度。对于低速高精度的应用两三度误差已经是不可接受了。遇到这种情况要么换更高精度的编码器方案要么在软件里做温度补偿没有第三条捷径。4.3 过零处理与坐标变换的数值跳变角度从359度回到0度这个瞬间三角函数算出来的正弦余弦值虽然连续但如果你在软件里用了查表法而且表格分辨率不够这个跳变点附近会出现明显的电流波动。解决思路有两个用浮点库直接算三角函数省掉查表的分辨率问题或者把角度范围映射到0到2π再查表但表格点数至少1024以上才够用。另一个容易被忽视的过零问题是速度计算。用M法单位时间计数测速时如果编码器分辨率不够高低速区间会出现测速为零的情况导致速度环输出跳变。我的习惯是在低速段用T法单位脉冲计时高速段用M法切换点设在脉冲频率10kHz附近。这个切换点的计算很简单编码器每圈脉冲数 × 当前转速rps 脉冲频率Hz。低于10kHz用T法高于10kHz用M法工程上够用。5. 把坐标系划分用到实际工程里5.1 多轴运动平台的轴映射现在回到ax by cz的实际场景。三轴平台或者雕刻机里每一路电机都有一个自己的FOC轴系但用户发出的运动指令是笛卡尔坐标系下的x/y/z位移。这时候你需要做的就是把用户的空间坐标指令映射到电机的运动学模型上。如果是三个丝杆分别对应x、y、z映射就是一一对应如果是龙门架结构x方向可能需要两个电机同步运动这时候只做简单映射就不够了还要加入同步力矩补偿。5.2 双电机同步中的最小轴系差我做龙门轴同步的时候踩过一次坑两个电机各自都做了dq变换但编码器安装零位差了几度电角度结果同样给1000rpm的转速指令一个电机实际跑了1005rpm另一个跑了998rpm。当时速度环输出根本看不出问题因为每一路单独看都在正常范围内。后来把两路编码器角度差分打出来发现静态角度差就有7度电角度换算到同步位置差直接是几十毫米。这里面最值得注意的教训是不要只监控最终位置差要同时监控两路电机的角度差和电流差才能判断是机械问题还是轴系定义问题。5.3 弱磁控制里的轴系思想延伸当电机转速超过额定转速之后反电动势接近母线电压你没法再通过加大iq提升转矩了这时候要靠负id去削弱磁场也就是弱磁控制。弱磁的本质其实还是在dq坐标系里调整id和iq的分配。你看不管电机转得多快只要你依然牢牢锁定d轴对齐转子磁极那么id、iq的划分就永远成立。坐标系划分不光是一个数学工具它是一个从物理结构到控制策略都贯穿始终的支点。理解了abc、αβ、dq为什么存在、为什么如此定义再看弱磁、MTPA、死区补偿这些高级话题都会顺很多。5.4 个人实际调试中的一点体会最后说一个我在现场经常和工程师同事讲的判断技巧当一套无刷电机系统出了问题先别急着调PI参数把电流波形、编码器角度、坐标变换后的id和iq这三个量同时打出来看。如果电流波形乱但id和iq波形正常说明问题在电流采样之前如果id和iq都波动说明角度不对或者变换有bug如果id、iq都很干净但转速不稳再去碰速度环和机械负载。这个排查顺序帮我省了无数个小时也让我养成了一个习惯——坐标系变换不是写完就完事的代码它是整个电机控制系统的地基地基歪了上面的豪华装修全白搭。
阅读完成 · 觉得有帮助?