☰
从六步换向到无感FOC:三相无刷电机控制进阶指南
2026/9/28 23:45:56 网站建设 项目流程

先说个真实的经历。我之前用STM32做无刷电机驱动,最开始走的是很多入门玩家都会走的路:装上霍尔传感器,写六步换向程序,NPN三极管或者MOS管驱动,电机“嗡”一声转起来,感觉特别有成就感。但等我把它装到带负载的场景里,问题就全出来了——中高速段噪声大,转矩忽大忽小,相线上用示波器看全是尖峰,电机发烫严重。后来被一个做伺服驱动的前辈点了一句:“你这是在用方波驱动一个正弦反电动势的电机,为什么不试试FOC?”这句话让我从一个“会转就行”的玩家,正式踏进了磁场定向控制的大门。

这篇文章我想写给那些已经能跑通六步换向、但想进一步搞懂FOC无传感器控制的朋友。核心关键词很明确:三相无刷电机、六步换向、FOC、无传感器实现,再带上PID控制、电流采样、STM32F103RCT6这些绕不开的细节。我不会从“什么是无刷电机”开始讲,而是直接对比两种控制方式的本质差异,再把无感FOC的硬件准备、坐标变换、滑模观测器和调参流程串成一条完整的路线。如果你手里正好有个电机项目,或者想搞懂网上那些FOC代码到底在算什么,这篇文章应该能帮上忙。

1. 六步换向的局限:相电流突变的本质与真正痛点

1.1 六步换向的导通逻辑

先回顾一下六步换向(也叫方波驱动、120°导通型驱动)的基本逻辑。三相全桥一共6个开关管,六步换向每次只导通上下桥臂中的两个管子,一个桥臂上管导通,另一个桥臂下管导通,第三个桥臂悬空。每60°电角度切换一次导通状态,换6次就是一个完整的电气周期。霍尔传感器通常提供60°或120°的相位信号,MCU根据这三个霍尔信号的高低电平组合,就知道当前应该往哪两相通电。

比如常用的六步导通顺序是:AB→AC→BC→BA→CA→CB(这里的AB表示A相上管和B相下管导通),对应不同的霍尔编码。每一步持续60°电角度,电流在定子绕组中形成的合成磁场方向也按60°步进跳跃。这种控制方式的优点是逻辑简单,对MCU算力要求低,一个定时器加几个GPIO口就能搞,所以大量用在电动工具、风机、水泵这些对噪声和转矩平顺性要求不高的场合。

但是“简单”不等于“好用”。只要你在示波器上挂过相电流波形就会知道,每次换向瞬间,相电流都会出现一个明显的尖峰,同时伴随扭矩的瞬间跌落。这个现象才是六步换向最核心的软肋。

1.2 相电流突变:六步换向最大的软肋

为什么相电流会突变?关键在电感电流不能突变。假设当前状态是A+B-导通,A相电流从母线流向电机,B相电流从电机流回母线,C相悬空。下一个瞬间换到A+C-导通,B相要由“参与导通”变成“悬空”,但B相绕组里的电流不可能瞬间变成0,它就只好通过MOS管的反并联二极管继续续流,把多余的能量回馈到直流母线或者另一相回路里。

这一续流过程会带来两个直接后果:一是相电流波形出现尖峰和畸变,产生电磁噪声和机械噪声;二是换向瞬间的电磁转矩会有明显的脉动,表现出来就是电机运转不平顺,尤其是在低速带载的时候更明显。电感越小、电机转速越高、母线电压越高,这个问题越严重。我实测过一台小型航模电机,在高速端挂上负载后,换向电流尖峰能到正常工作电流的3倍左右,发热量非常可观。

还有一点容易被忽略:六步换向的合成磁场方向是跳跃式变化的,而转子永磁体的磁场方向是连续旋转的,两者之间不可能始终保持90°的最优夹角。这就意味着在整个电气周期中,很大一部分时间里电机并没有工作在最大转矩输出状态,效率自然打折。

1.3 什么时候该从六步换向转向FOC

很多项目其实没必要上FOC。如果你做的是电钻、打草机、小风扇,六步换向足够,成本还低。但如果你要做的是机器人关节、压缩机、无人机、电动滑板车,或者任何对噪声、震动、低速性能、动态响应速度有要求的场景,六步换向就有心无力了。

FOC也并不是高不可攀,它的思路本质上是“把交流电机当成直流电机来控制”。通过坐标变换,把定子三相电流分解成一个与转子磁场垂直的转矩分量和一个与转子磁场平行的励磁分量,然后分别对这两个分量做PID控制,最终得到的是连续正弦变化的相电流,而不是方波。这样转矩脉动小、噪声低、动态响应快,而且高速区的效率明显更高。

至于“无传感器实现”,主要是为了去掉霍尔传感器。霍尔传感器虽然便宜,但它在高温、密闭、强振动的场合可靠性会下降,而且安装位置一旦有偏差,换相时序就会跟着偏移,直接影响性能。所以压缩机这类密封系统、或者电机本身在很恶劣环境里的项目,无感控制几乎是刚需。我的建议是:如果你正在六步换向和FOC之间犹豫,优先把FOC学起来,因为现在FOC方案的硬件成本并不比六步换向高多少,收益却大得多。

2. 从方波到正弦:FOC的坐标变换和电角度理解

2.1 先从直流电机说起

FOC的核心思想,一句话就能说清楚:把三相交流电机的控制问题,变换成类似直流电机的控制问题。直流电机为什么好控制?因为当电枢电流方向和磁场方向垂直时,电磁转矩和电枢电流成正比,你只需要控制电流大小,转矩就跟着变。而且直流电机的磁场方向和电枢电流方向在结构上是天然确定的,不需要实时跟踪。

三相永磁同步电机(PMSM)就不一样了。定子绕组产生的是旋转磁场,转子是永磁体也在旋转,如果你想让转矩始终最大,就得保证定子电流产生的磁场始终和转子磁场保持合适的角度。这时候直接控制三相电流的瞬时值是很麻烦的,因为三个相电流全都是随时间正弦变化的交流量,而且频率还随转速变。

怎么把交流量变成直流量?靠坐标变换。这就是FOC算法里最核心的两步:Clark变换和Park变换。

2.2 Clark变换和Park变换

Clark变换把三相静止坐标系(a、b、c轴)下的电流,变换到两相静止坐标系(α、β轴)下。公式也不复杂:

iα = 2/3 × (ia - 1/2 × ib - 1/2 × ic) iβ = 2/3 × (√3/2 × ib - √3/2 × ic)

这里的2/3是等幅值变换系数,也有人用等功率变换的√(2/3),两种约定都有人用,但后续SVPWM和观测器公式里系数要对得上才行。

经过Clark变换后,三相耦合的交流电流变成了αβ轴上的两个正交交流量。然后再做Park变换,把αβ轴旋转到以转子磁场方向为基准的dq坐标系:

id = iα × cosθ + iβ × sinθ iq = -iα × sinθ + iβ × cosθ

这个θ就是转子电角度。变换做完之后,id是励磁电流分量,iq是转矩电流分量。对于表贴式永磁同步电机,让id=0,只用PID控制iq一个量就能线性地控制转矩。这个“旋转坐标系下看静止量”的思路,本质上就是坐在旋转的转子上看定子电流,看到的就是一个直流。

所以FOC的灵魂不是那个SVPWM,而是“坐标变换+两个电流PI控制器”。你真正要控制好的,不是三相电流本身,而是dq坐标系下的两个直流分量。

2.3 电角度和转子角度:这两个角度到底差在哪

初学者最搞不定的就是这个角度问题。电角度和机械角度不是一回事,之间差一个极对数p:

θe = p × θm

如果你用了一个4对极的电机,转子每转一圈,电角度会跑4圈。也就是说,电气周期和机械周期性不同步。FOC里所有坐标变换用到的都是电角度,如果你把这个参数搞错了,哪怕霍尔信号、编码器位置都对,电流环也是完全乱的。

另一个更难理解的点是:电角度的零点在哪?坐标变换里的θ必须和转子磁极位置有一个明确的对应关系。如果你装了编码器,通常需要在电机通电后做一次转子预定位,让转子转到某个已知位置,然后把编码器位置清零,这样电角度的起点才确定。如果没有做过零位对齐,后面算出来的id、iq也都是错的,电流环根本收敛不了。很多无感FOC启动失败,其实就失败在初始电角度没对准。

关于角度还有个常见误解:有人觉得无感控制里反正切求出来的角度可以直接用,不需要补偿。实际上任何观测器出来的角度都有相位延迟,尤其在电机高速运转时,角度滞后会导致电流环解耦不彻底、转矩下降甚至失步。这部分到后面讲滑模观测器的时候再展开。

3. 无感FOC的硬件准备:电流采样、定时器与CubeMX配置思路

3.1 电流采样方案的取舍

FOC控制再漂亮,没有准确的相电流数据就是空中楼阁。电流采样方案大致分三种:三电阻采样、双电阻采样、单电阻采样。

最推荐入门用的是三电阻采样:在逆变器下桥臂的三个MOS管源极分别接一个采样电阻,通过三个运放放大采样电压送给ADC。三电阻方案可以直接得到两相电流,第三相用基尔霍夫电流定律算出来就行。它的优点是电流重建简单、精度高,缺点是成本略高、需要三个运放通道,而且当某一相的PWM占空比接近0或100%时,下桥臂导通时间太短,采样窗口不足,电流重建会失真。

双电阻方案省掉一个采样电阻,但需要依赖重构算法在占空比合适的时刻采样第三相,低调制区误差会比较明显。单电阻方案最省成本,只在母线正端或负端接一个采样电阻,但三相电流要从不同PWM开关状态下的母线电流里重构出来,算法最复杂,对时序的要求也最高。

我的建议是:如果是自学习阶段,直接上三电阻方案,调试难度最低。下表是三种方案的核心差异:

方案采样电阻数量相电流重建难度典型限制适合场景
三电阻3低高/低占空比采样窗口不足学习、中高端驱动
双电阻2中重构误差与占空比强相关成本敏感产品
单电阻1高开关状态组合限制多极小体积驱动

3.2 采样窗口和ADC触发时机

电流采样的时机比采样电路本身更容易翻车。六个MOS管在换流瞬间会有死区,死区时间里上下桥臂都处于关断状态,电流只通过二极管续流,此时采样电阻上的电压不能真实代表绕组电流。另外MOS管开通和关断瞬间还有振铃,采样点如果正好落在这个区域,得到的电流值会有很大的毛刺。

正确做法是:在PWM周期中间采样。如果PWM用的是中心对齐模式(三角波计数),计数器的上溢或下溢时刻正好对应PWM周期的中心点,此时三相下桥臂通常都在导通,电流续流回路稳定,是ADC触发采样的最佳时机。实际做法是用高级定时器的TRGO事件去触发ADC注入组转换,同时把ADC采样时间设置得足够长,尽量避开开关振铃。

还有一个容易踩的坑:三电阻采样里,如果某个下桥臂的占空比过低,它的导通时间小于ADC采样保持时间,那一路的值就是不准的。软件上要有最小采样占空比保护,或者采用重构算法从另外两相推算。很多人在FOC电流环刚启动的时候看到电流波动巨大,查来查去才发现是高占空比/低占空比下采样窗口不足。

3.3 基于STM32F103RCT6的硬件资源分配

STM32F103RCT6这块芯片算是无感FOC入门最常见的型号之一,72MHz主频,带高级定时器TIM1,适合做电机控制。需要注意它没有硬件浮点单元,做FOC运算时如果是C语言里直接写float,DSP库优化不够好的话20kHz电流环会吃紧,但优化得好也能跑,很多开源项目就是在这个芯片上跑出来的。

硬件资源分配建议:

  • TIM1作为PWM主定时器,输出中心对齐模式的6路PWM,别忘开互补输出和死区插入,初始极性也要根据前驱电路设对。
  • ADC用ADC1的注入组,由TIM1的TRGO事件触发,同时在PWM中心的时刻启动采样转换。
  • 电流环中断用TIM1的上溢/下溢事件触发,中断频率等于PWM频率,比如20kHz。
  • 如果你要用编码器做有感调试,TIM2-TIM4留一个做编码器模式输入,但后续切无感时这个定时器可以空出来。

在CubeMX里的配置思路是先建立PWM定时器和ADC,再把两者的触发关系连起来。很多人会忽略的是PWM死区寄存器,尤其是驱动板用的光耦隔离方案或非隔离方案,死区设置不合适时,上下管直通烧管子是分分钟的事。我习惯把死区先设成2μs左右验证驱动板安全,再根据实际MOS管关断延迟逐步调小。

4. 无传感器转子位置观测:滑模观测器实现与启动策略

4.1 主流的无感位置观测方案对比

去掉霍尔和编码器之后,转子位置要靠算法“猜”。常用的办法有反电动势过零检测、滑模观测器、磁链观测器、高频注入法,每一种都有自己的适用区间。

方案基本原理优点缺点适用速度段
反电动势过零检测检测悬空相的反电动势过零点实现简单、成本低零速和低速无信号中高速
滑模观测器(SMO)基于电机电压方程,利用滑模等效控制提取反电动势鲁棒性强、对参数不敏感存在抖振,需滤波和角度补偿中高速
磁链观测器观测定子磁链估计反电动势相对平滑对电机参数精确度要求高中高速
高频注入法注入高频电压信号,利用转子凸极性探测位置支持零低速只适用于凸极率高的电机,算法复杂零速/低速

对入门和大多数中小功率表贴式永磁同步电机来说,滑模观测器是最常用的选择,网上很多开源项目、ST和TI的参考设计里也是这个路线。它不依赖复杂的电机参数,控制律简单,配合低通滤波器就能得到可用的转子角度。

4.2 滑模观测器的原理和角度补偿

滑模观测器的出发点,是电机在αβ坐标系下的定子电压方程。以表贴式永磁同步电机为例,αβ轴下可以写成:

diα/dt = (-Rs × iα - eα + uα) / Ls diβ/dt = (-Rs × iβ - eβ + uβ) / Ls

其中eα、eβ是反电动势分量。反电动势里包含了转子角度和转速的信息,所以只要能把eα、eβ估计出来,就能算角度。

滑模观测器的思路是:构造一个电流观测器,让观测电流和实际电流的误差作为滑模面s。当系统进入滑模运动状态时,s=0,此时滑模控制律的等效输入中包含了反电动势信息。实际工程里通常的做法是:

  1. 采样得到实际电流iα、iβ;
  2. 用当前角度估计值算出观测电流îα、îβ;
  3. 电流误差经过一个开关函数(或者饱和函数)得到滑模控制律;
  4. 把滑模控制律经过低通滤波器,就得到估计的反电动势êα、êβ;
  5. 反正切运算得到电角度: θ̂e = atan2(-êα, êβ)。

上面这个角度里面有一个必须处理的滞后问题。低通滤波器会给反电动势带来相位延迟,延迟量和滤波器的截止频率、当前电机电频率都有关系。如果不补偿,高速时角度误差可能超过十几度甚至几十度,直接表现为电流环解耦不彻底、输出转矩下降、电机噪音大。

补偿的方法通常是:反电动势的频率近似等于电频率,所以可以根据低通滤波器的相位特性做一个查表或者公式补偿。比如一阶低通滤波器的滞后角是atan(fe/fcutoff),把计算出的这个角度加到估计角上。我实际调试的时候,会用编码器先同时采集真实角度和观测器角度,直接看二者差值的趋势,再把补偿曲线调准,这种方式最直观。

4.3 转子初始位置检测和开环启动策略

无感FOC绕不开的问题就是:零速时反电动势为零,任何反电动势类观测器都不工作,怎么启动?

行业里最稳妥的工程方案是预定位+开环强拖+切换闭环。先给一个固定的电压矢量,让转子转到一个已知位置,完成“初始位置对齐”。这里对表贴式电机不需要太精确,能大致对齐就行。然后开环按给定的角度斜率强拖电机同步,角度按固定速度增长,电流幅值也给定,等转子转速超过某个阈值、反电动势足够大之后,再把控制从开环切换成闭环观测器模式。

切换那一下是最容易过流的。如果开环角度和观测器角度之间存在相位差,切换瞬间电流环会看到一个巨大的误差,输出突然饱和,轻则电流冲击,重则过流保护甚至烧管子。我的做法是在切换之前的几个电周期里,不断比较开环给的角度和观测器算出来的角度,等到两者误差小到设定范围之后,再把控制权交给闭环。同时切换时的给定电流不要突变成0,要让目标值平滑过渡,比如做一个斜坡函数。

如果项目对启动要求比较高,比如要零速满载启动、甚至带负载直接启动,就要考虑高频注入法,或者先用启动标定做初始位置检测。高频注入利用的是转子磁路凸极性,注入高频信号之后根据电流响应解调位置,能实现真正的零低速闭环启动,但算法复杂度高不少。我个人的路线是:先把预定位+强拖方案吃透,再根据项目需求决定要不要上高频注入。

5. 调试全流程与参数整定:从能转到好用

5.1 先解决“能不能转”:开环强拖与初始位置对齐

很多人的无感FOC代码是从网上或者Github下载的,刷进去之后发现电机要么不转,要么震动几下就报过流。这时候不要急着调PID,应该先用最基础的方式验证硬件和软件闭环是否正常。

第一步,断开电机,只给PWM输出,检查六路波形和死区是否正常。第二步,接一个很小的电流限制,把母线电压调低,比如串一个限流电阻或者用隔离电源限制到12V,这样就算逻辑有错也不至于烧板子。第三步,用预定位方式给固定电压矢量,看转子是否能转到对应位置,如果转子纹丝不动或者方向不对,说明SVPWM极性和相序配置有问题,这个查清楚之前不要往下调。

想快速确认SVPWM和采样链路是否正常,还有一种很实用的方式:先用编码器把角度作为真实电角度输入,让电流环闭合运行,如果带编码器能平稳转起来,就证明Clark变换、Park变换、SVPWM和死区全部正确,问题只出在无感观测器上。这比直接盲调无感要快得多。

5.2 电流环的级联PID设计与参数整定顺序

FOC的电流环本质是两个PI控制器,一个控制id,一个控制iq。id的给定值通常是0(表贴式电机),iq的给定值来自速度环PID的输出。两个电流环都运行在电流环中断里,我这里用20kHz。

参数整定顺序要严格遵守先内环后外环:先把电流环调好,再调速度环。电流环PI里P的作用是快速响应,I的作用是消除稳态误差。调试时可以先设I很小或者为0,只加大P,观察iq跟随给定值的动态响应,当出现明显的比例增益足够快但还有静态误差时,再加I。I加得太大容易振荡,表现为电流高频啸叫、震荡波形明显。

电流环调好后,速度环就简单很多。速度环的输出作为iq的给定,一般用PI就可以,P决定了速度响应快慢,I消除稳态转速误差。注意速度环的响应带宽必须远远低于电流环带宽,否则整个级联系统容易不稳定。经验上电流环带宽做到速度环的5到10倍以上比较安全。如果你在调速度环的时候发现电流环输出一直饱和、速度超调很大,多半是速度环P太激进,先降下来再试。

5.3 位置观测器与速度环的配合,以及我踩过的几个典型坑

无感控制跑到后面,你会发现最难的不是算法本身,而是各种边界条件和干扰。下面列几个我实际操作中踩过、也最常见到的坑:

第一个坑是角度滞后引起的高速带载失步。电机高速转起来之后,低通滤波器的相位滞后会让观测器角度严重落后于真实角度,此时电流环解耦不彻底,输出转矩下降,再硬加大负载就直接失步。解决办法:必须做角度补偿,并且用编码器实测验证补偿量是否正确。不要想当然地给一个固定值,补偿量和电频率相关,最好做动态补偿。

第二个坑是电流采样毛刺导致观测器抖动。很多人把采样触发放到PWM末端,结果采到的电流叠加了开关振铃,观测器输入噪声很大,反电动势估计出来全是锯齿。解决办法是把采样点挪到PWM中心,同时调长ADC采样时间,必要时做软件滤波,比如中值滤波或者多重采样取平均。

第三个坑是零速启动时先反转一下。预定位阶段给固定电压矢量,转子会转到最近的零位,但这个零位和你想对齐的那个方向可能差180°,看起来就像电机反转了一小段。如果机构不允许反转,就要改用短脉冲法测初始位置,或者用高频注入。对于大多数风机、轮毂电机,反转很小一段通常可以接受。

第四个坑是极对数写错了。这个听着低级但真的很常见。把极对数填错之后,坐标变换的角度频率和实际电气频率对不上,电机肯定转不好。判断方法很简单:用示波器测一下电机线电压的电气频率,再结合转速换算一下极对数,直接就能确认。

最后一个坑是母线电压前馈没做好。SVPWM能输出的最大电压受限于母线电压,如果母线电压波动,峰值占空比会突然进入过调制区,电流环输出饱和失真。很多参考实现里没有母线电压前馈,导致电池供电的设备在电压跌落时失控。加一个简单的母线电压补偿项,把SVPWM最大调制比限制到0.9左右,能显著提高稳定性。

最后说点个人体会

无感FOC这个方向,上手难度确实比六步换向高一个台阶,坐标变换、电流采样、观测器、启动策略、PID调参,任何一个环节出问题电机都转不顺。但换个角度看,它的收益也非常直接:噪声小、转矩平顺、效率高、还能去掉霍尔传感器,这是六步换向给不了的。

以我自己的经验,最稳妥的学习路径是:先用带霍尔或者编码器的方式把FOC的电流环跑通,理解Clark变换、Park变换和SVPWM,再去掉位置传感器换观测器。不建议一上来就直接盲调无感,不然你很难判断问题到底出在采样、坐标变换还是观测器上。调试的时候尽量全程挂示波器看相电流和观测器角度,在开发板上留几个DAC输出口把内部变量引出来,会比在串口里看一堆数字高效得多。

后面可以扩展的方向也不少:弱磁控制让电机跑得更快、MTPA让低速大扭矩更高效、参数在线辨识应对不同电机,还有模型预测控制这类更前卫的电流环方案。先把六步换向到无感FOC这一条线走通,后面这些都是自然而然的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询