资讯中心

电机控制进阶:从直流电机到FOC的完整学习路径

📅 2026/9/29 2:00:21
电机控制进阶:从直流电机到FOC的完整学习路径
做电机控制这几年我最深的体会是难的不是写 PWM 那几行代码也不是把 STM32 的外设配置通而是脑子里缺一条线——一条能把直流电机、无刷电机、FOC 全部串起来的线。直到朋友推荐了一本《电机控制从入门到实战》我才算把散落的知识点真正焊成了一张网。这篇文章就聊聊这本把电机控制知识串起来的书以及我结合项目代码反复对照后理出的学习路径适合刚接触电机控制、被各种术语绕晕的新手也适合已经调过几个电机但总觉得“差点意思”的工程师。市面上讲电机控制的书不少有的纯讲数学推导翻开就是坐标变换矩阵让人直接想合上有的又全是接线图和寄存器配置看完会调但换个电机就不会了。这本书最打动我的是它的主线逻辑从最简单的直流电机入手先讲清楚“电机为什么转、力矩怎么来、怎么调转速”再一步步过渡到无刷直流电机、永磁同步电机最后把 FOC 的坐标变换、SVPWM、电流采样、无感观测器全部挂到这条主线上。整个读下来你会发现之前背过的公式全都有了物理含义。1. 内容整体设计与思路拆解一条主线把电机控制串成体系1.1 从一块磁铁、一圈铜线讲起把“电机为什么转”彻底聊透大部分初学者学电机控制上来就怼 FOC、SVPWM结果 d 轴、q 轴还没搞明白就先被 Clarke 变换和 Park 变换劝退了。这本书的聪明之处在于它花了整整两章讲直流电机而且讲得非常接地气。直流电机的核心就三个东西永磁体提供磁场电枢绕组通电流换向器负责让电流方向在合适的位置翻转。通电导线在磁场中受力F BIL这就是电磁转矩的来源。但这个力不是一直朝一个方向因为线圈转到某个位置后如果不换向力矩就会反向电机就会卡在中间抖。换向器整流子就是这个“自动换向开关”它让电枢绕组里的电流方向始终和磁场配合保证转子持续朝一个方向转。接下来它讲了反电动势。电机一转起来电枢绕组切割磁力线会产生一个和电源电压相反的电动势大小和转速成正比E Ke·n。这个反电动势特别关键它解释了很多日常现象为什么电机堵转时电流巨大因为转速为零反电动势为零电枢电阻又很小电流全由电源电压和绕组电阻决定。为什么电机空载转速不会无限高因为转速越高反电动势越大最后反电动势接近电源电压电流和力矩就趋近于零了。这一章还梳理了直流电机的电压平衡方程U E Ia·Ra L·dIa/dt。这个方程太重要了它是后面 FOC 电流环控制的物理原型。你想想FOC 里 q 轴电流环在做的事本质上就是在动态补偿这个方程里的电阻压降和电感感生电压让实际电流快速跟随给定值。所以直流电机的电压方程对你理解 FOC 的电流环直接就是降维打击。1.2 无刷电机和直流电机的本质关系把换向器从机械搬到电子很多教材把无刷电机和直流电机分开讲实际上它们是完全一脉相承的。这本书在第三章做了个特别清晰的对比有刷直流电机的换向器在转子上是机械换向无刷电机的“换向器”在控制器里是电子换向。无刷直流电机BLDC的定子是三相绕组转子上贴永磁体。要让转子转起来需要按顺序给三相绕组通电让定子磁场“追”着转子磁极跑。而这个通电顺序就是“六步换相”。霍尔传感器检测转子位置控制器根据位置信号决定哪两相导通、哪一相悬空。书里给了一个非常实用的霍尔状态到换相状态的映射表照着写不出来代码的人几乎没有。从有刷到无刷看似只是把换向器从机械换成电子但引入了一个新问题定子磁场是分步跳跃的不是连续旋转的。所以 BLDC 的转矩脉动比较大高速运行噪音也明显。这时候就需要引入 FOC让定子磁场连续旋转起来。注意FOC 并不是凭空冒出来的东西它解决的问题就是把“六步跳跃”变成“连续旋转”让力矩波动降到最低。这本书就是通过这种“发现问题—引出解决方案”的编排方式让读者很自然地理解为什么需要 FOC。可以看下面这张对比表它基本概括了三种电机控制方式的演进逻辑控制维度有刷直流电机无刷方波控制六步换相FOC 矢量控制换向方式机械换向器电子换相霍尔检测位置电子换相软件实时算角度定子磁场相对固定电枢反应复杂跳跃式旋转60°一个台阶连续旋转角度分辨率极高转矩脉动大低速明显中等尤其换相时刻明显很小低速表现平滑电流波形直流脉动方波/梯形波正弦波控制复杂度最简单中等较复杂需要坐标变换适用场景玩具、电动工具、低成本调速风扇、泵类、无人机无感方波机器人关节、电动汽车、伺服系统1.3 坐标变换不是数学炫技而是把交流电机“降维”成直流电机来控FOC 劝退绝大多数人的就是坐标变换。这本书在第六章做了一个非常精彩的类比想象你在操场上推一个旋转木马你每时每刻都得调整推力的方向让推力和旋转木马当前的线速度方向一致才能最高效地加速。这种“始终跟着转”的控制方式很累。但如果站在旋转木马上看你看到的是一个静止的物体只需要朝一个方向推就行。FOC 的 Park 变换就是要把站在地面上的静止坐标系αβ轴转换到跟着转子转的旋转坐标系dq轴。经过这个变换交流电机在 dq 坐标系下看起来就像是直流电机id 对应励磁分量iq 对应转矩分量。于是控制一个复杂的交流电机变成了控制两个独立的直流电流——一个管磁场一个管转矩这就简单太多了。至于 Clarke 变换它的作用是把三相 ABC 静止坐标系变成两相 αβ 静止坐标系因为三相电流 iA、iB、iC 不是独立的满足 iA iB iC 0所以只需要两个电流传感器就能重构三相电流。这一串逻辑书里都用图解的方式一步步推出来了跟着画一遍坐标投影比死记矩阵公式强十倍。2. 核心细节解析与实操要点那些把项目调炸的细节书里其实都写了2.1 直流电机调速背后藏着 PWM 和反电动势吸收电路的大学问做直流电机调速第一反应就是 PWM 控制占空比。但 PWM 信号加到电机上电流不是理想的直流。电机是感性负载电流会随着 PWM 的开关呈现锯齿状波动波动幅度取决于电源电压、电感值和 PWM 频率。如果 PWM 频率太低比如 100Hz电流波动大到一定程度电机低速运行时就会一顿一顿地爬这是因为电磁转矩和电流成正比电流波动大转矩就波动大。这本书给出的经验值是PWM 频率至少要比电机电气时间常数的倒数高 5~10 倍。比如直流电机的电枢电感是几毫亨、电阻是几欧姆电气时间常数 τ L/R 大约是几毫秒量级对应的带宽才几百赫兹。实际工程中一般用 10kHz~20kHz 的 PWM一方面电流纹波足够小另一方面也避开了 20kHz 以下的人耳可听范围不会让电机啸叫刺耳。另一个直流电机很容易忽略的问题是续流/反电动势吸收电路。电机是感性负载当 MOS 管关断时电感里的电流不能突变必须有一个续流路径否则会在 MOS 管漏极上产生高压尖峰直接把管子击穿。常见的做法是在电机两端反并联一个快恢复二极管或者用 TVS 管、RC 吸收电路。我刚开始做的时候图省事没加续流二极管PWM 频率一拉高MOS 管就烧了好几个。后来查了半天才发现是反电动势的尖峰把我的管子打穿了。这本书里虽然没有大篇幅讲功率电路但至少在“工程实现”那一章里强调了续流回路的重要性还给了二极管选型的经验值额定电流至少是电机峰值电流两倍反向恢复时间要短一般选肖特基二极管就够。提到反电动势吸收电路还有一个常见应用场景直流电机继电器正反转控制。用继电器切换电机电源极性实现正反转比用 H 桥便宜但继电器触点切换瞬间电机电感会产生很高的反电动势容易拉弧烧蚀触点。正确做法是在电机两端并联续流二极管但要注意二极管的极性——断电时给电机电流提供通路而不能短路电源。2.2 无刷电机的霍尔换相表60° 和 120° 相位怎么对应从有刷切到无刷最直观的变化就是需要根据转子位置换相。霍尔传感器是常用的位置传感器三颗霍尔在定子上空间相差 120° 电角度输出是三路 0/1 信号一共 8 种组合。其中 6 种是有效位置2 种000 和 111是非法组合。这本书给了两种霍尔安装方式下的换相逻辑60° 相位和 120° 相位。这两种相位下的换相顺序不同代码里的换相表也就不同。很多人在网上抄一个换相表就跑结果电机要么反转要么卡死。根本原因就是没有搞清楚自己的霍尔到底是什么相位。自己写代码的话可以用电机开环强制换相一个一个试出霍尔状态和反电动势的对应关系然后重新建表。我就是用书里教的方法把电机悬空用开环六步强制拖动记录每一拍的霍尔状态几分钟就把换相表校正过来了。这里也顺带讲一下无感方波控制。书里提到无感 BLDC 的核心是检测反电动势过零点来推断换相时刻最常用的方法是比较法和虚拟中性点法——把三相反电动势经过分压和滤波后与虚拟中性点比较当某相反电动势过零时切换换相状态。注意反电动势过零点并不是换相点真实换相点要滞后 30° 电角度。这个滞后量的补偿在高速时特别重要因为反电动势幅值会随转速升高而增大过零检测的响应延迟带来的角度误差会变大。实测下来给过零检测加一个与速度相关的移相补偿能明显改善高速换相稳定性。2.3 FOC 电流环的物理基础电感、电阻、反电动势、耦合项FOC 并不是把电流限幅再给 PWM它根本上是先建立一个电机的精确数学模型然后算出一个合适的电压指令让电流快速跟踪目标值。这本书把 dq 轴电压方程写得特别清楚Ud Rs·id Ld·did/dt - ωe·Lq·iq Uq Rs·iq Lq·diq/dt ωe·(Ld·id ψf)如果你第一次看到这个方程会觉得它长得挺丑。但你把它拆开看第一项是电阻压降第二项是电感上电流变化的压降第三项是交叉耦合项d 轴电流会感应到 q 轴上反之亦然。电流环 PI 控制器的任务就是让实际电流跟随目标电流因此它输出的电压指令必须包含这几部分的补偿。尤其是交叉耦合项 ωe·Lq·iq转速一高这一项的值非常大如果不加解耦高速时电流环就会失控或者振荡。书里在“电流环带宽设计”一节给了个很务实的结论先用前馈把电阻压降和反电动势补偿掉再用 PI 去处理剩余偏差这样 PI 的压力小很多参数也更好调。再说说电流采样时刻的问题这是 FOC 调不通的最常见原因之一。SVPWM 在大部分情况下的调制波是中心对称的也就是每个开关周期中点三相桥臂都处于零矢量状态母线电流中正好能反射出某一相电流的数值。所以 ADC 采样点应该放在 PWM 定时器的计数中心也就是三角波载波的谷底或顶点。如果采样时刻不对采到的电流可能是续流阶段的高频振荡算出来的 iα、iβ 就是错的然后坐标变换后 iq 的反馈值根本不对电流环自然调不好。我最初就是直接在任意时刻采样电流波形乱得没法看后来把 ADC 触发同步到 PWM 中心对齐中断波形才正常起来。这本书虽然没有直接写“采样点要放在 PWM 中心”但在电流采样章节里说了“采样窗口应避开开关边沿选取电流稳定窗口”实际上就是在说这个事。2.4 PID 控制电机转速的经验顺序先内环后外环先 P 后 IPID 调速是老话题但怎么调得又快又稳书里的顺序是先调电流内环再调速度外环内环先给 PI 一个保守值然后用“先 P 后 IP 从零往上加I 从零往上加遇到振荡就退回去”的方法来调。很多人一上来就调速度环不调内环。这种做法的结果就是响应极慢因为电机的电流没有得到有效的动态控制需要的转矩没能及时建立。正确顺序一定是电流环先行。电流环的带宽一般做到 1kHz~2kHz速度环带宽做到 50Hz~100Hz 就足够了。物理直觉是只有内环响应快外环给一个力矩指令时内环能快速跟踪速度才不会滞后太多。调 P 的时候有个特征值得注意当 P 过大电流波形会出现 1kHz 左右的高频振荡听起来像蚊子叫同时 MOS 管温度快速上升。调 I 的时候如果过大电流会出现低频的“呼吸式”波动用示波器看电流包络呈正弦状。我实测调电流环时P 的值从 0.5 逐步加到 2.0I 从 0.01 加到 0.05就已经在振荡边缘了。参数整定全过程实时盯着电流波形和电流给定一步一确认不能盲调。3. 实操过程与核心环节实现按书里的主线走一遍实际项目3.1 直流有刷电机 PWM 调速完整的接线与控制代码这本书的价值在于每个控制理论章节后面都带一个硬件实操演示。我照着第一个项目做了直流有刷电机的 PWM 调速用的主控是 STM32F103C8T6驱动用的是最简单的 N-MOS 管低边驱动加续流二极管。接线其实很直接单片机 TIM2 输出 PWM 到 MOS 管的栅极电机一端接电源正极另一端接 MOS 管漏极源极接地电机两端反并联一个 1N5819 肖特基二极管做续流。编码器接在电机输出轴上用定时器编码器模式读取转速。PWM 频率设 20kHz这是常规电机调速比较合适的频率。代码层面需要做三件事初始化定时器输出 PWM初始化编码器接口然后在主循环里做 PID 调速。核心代码大概长这样// STM32 HAL 库下的直流电机 PWM 调速核心配置 TIM_HandleTypeDef htim2; TIM_OC_InitTypeDef sConfigOC; // 定时器 2 输出 PWM频率 20kHz周期 72MHz / (72 * 1000) 1000 htim2.Instance TIM2; htim2.Init.Prescaler 72 - 1; // 72 分频得到 1MHz htim2.Init.Period 1000 - 1; // 1MHz / 1000 20kHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(htim2); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; // 初始占空比 0% sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1); // 启动 PWM HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); // 占空比映射目标转速通过 PID 计算输出限制在 0~1000 __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, duty_cycle);用 STM32F407ZGT6 在 HAL 库下做同样的事情本质是一样的只是定时器时钟源不同F407 的主频更高定时器挂在 APB1 上最高到 84MHz预分频和自动重装载值要重新算一遍。核心思想不变定时器分频得到 PWM 频率比较寄存器值控制占空比。实测下来的经验是占空比和转速并不是线性关系。由于电枢电阻的非线性和摩擦力影响占空比 30% 到 50% 之间转速变化最快超过 70% 几乎不再增加多少转速。所以做调速系统闭环 PID 比开环占空比映射可靠得多。3.2 无刷电机六步换相霍尔换相表怎么推换相提前角怎么补第二个项目是无刷直流电机的方波控制。我用了一块功率驱动板三个半桥驱动三相全桥输出霍尔信号接单片机的外部中断引脚。最关键的部分是换相表。书里的方法是把换相表需要的信息从电机本体上测出来。具体做法是先用开环强制时序给电机的任意两相通电把转子拉到一个确定的机械位置然后读霍尔状态。依次做六次就能得到霍尔状态和转子位置的对应关系。测完数据后整理出来的换相表大致长这样霍尔状态Hc Hb Ha转子所在扇区应导通相电流流入相电流流出相000非法---001扇区 1ABAB011扇区 2ACAC010扇区 3BCBC110扇区 4BABA111非法---101扇区 5CACA100扇区 6CBCB实际测试时发现如果严格按照霍尔状态切换高速时电机会有明显转矩跌落。这是因为换相动作完成后电流需要一定时间建立尤其在电感较大的电机上这个延迟导致了实际换相滞后。解决方案是提前换相在霍尔状态还没变化之前就根据上一次霍尔变化的速度估算出下一次换相时刻提前几十微秒执行。这个方法在无感方波控制里也适用区别只是提前量来源不同有感用霍尔速度外推无感用反电动势过零检测加角度补偿。书里给的参考值是提前角度约 15°~30° 电角度具体需要通过实验确定。3.3 从六步换相到 FOCSVPWM 和坐标变换的落地实现做完六步换相就可以尝试 FOC 了。FOC 的主循环是一个 10kHz~20kHz 的电流环中断服务函数每一步都按固定顺序执行读取相电流 ADC 采样值重构三相电流执行 Clarke 变换得到 iα、iβ读取编码器角度得到电角度 θe执行 Park 变换得到 id、iq分别对 id、iq 做 PI 控制得到 Ud、Uq执行逆 Park 变换得到 Uα、Uβ执行 SVPWM得到三个桥臂的占空比SVPWM 相比六步换相最大的优势是母线电压利用率高。六步换相在任意时刻只有两相通电母线电压利用率只有 0.866 倍。SVPWM 通过在一个开关周期内交替使用两个相邻的非零矢量和零矢量可以让合成的电压矢量幅值最大达到 2/3 倍母线电压换算到相电压就是 Udc/√3比 SPWM 整整多出 15%。这意味着同样的电机改成 FOC 之后最高转速会更高。SVPWM 的代码实现里没有复杂的数学公式实际上就是判断参考电压矢量落在哪个扇区然后计算相邻两个矢量的作用时间 T1、T2最后映射到三路比较寄存器。初学者建议先用查表法做扇区判断和矢量作用时间计算调通了再优化。这本书在 FOC 章节里很贴心地配了一个 cartesian to polar 变换的小模块专门讲怎么把 Uα、Uβ 从直角坐标转换成极坐标下的幅值和角度再根据角度查扇区这比直接比较 Uα、Uβ 的符号更容易理解。我后来把书里的正弦表扩展到 3600 个点也就是 0.1° 电角度分辨率发现转子低速运行时的噪音明显降低了波形也更接近正弦。4. 常见问题与排查技巧实录照着这本书调电机我踩过的几个坑4.1 电机抖动、反转、堵转的根源诊断电机抖动原因有很多种最常见的几个都在这本书里有提示霍尔换相表错误。现象是电机卡在某个位置不动或者轻微抖动但完全起步不了。排查方法是开环强制六步换相逐相测试霍尔输出确认换相表与实际的映射关系。另一种可能三相相序接反或者霍尔线序接反导致换相逻辑错乱。FOC 初始阶段编码器零位不一致。如果编码器 Z 脉冲位置和电机 d 轴零位没有校准上电后 FOC 给出的初始角度就是错的转子会被拉到一个错误位置然后再弹回来表现为“上电抖一下但转不起来”。解决方法是做一次编码器零位自学习——开环给 q 轴一个固定电流把转子拉到 d 轴方向然后记录编码器角度偏移量存到 Flash 里。这个步骤也叫转子初始位置检测在无感 FOC 中特别麻烦因为无感系统没有编码器只能通过高频注入或者电感变化检测来做但在有感 FOC 里做一次零位校准就一劳永逸了。电流采样错误。如果 id 反馈始终有一个固定偏差低速时会表现为电流环输出静差速度环一直补不够。用示波器同时看三相电流采样波形确认 ADC 采样窗口是否对齐到 PWM 中心以及三路采样增益是否一致。如果两路采样电阻有 5% 的差异电流环的 d 轴电流会凭空出现一个负的偏置电机效率明显下降系统发热。4.2 电流环高频啸叫和振荡的调试记录我调 FOC 时遇到最崩溃的问题就是电流环振荡。现象是母线电流巨大、MOS 管发热、电机发出刺耳的高频啸叫频率大概在几千赫兹声音非常明显而且转速越高越严重。排查过程先怀疑电流采样噪声用示波器看电流波形发现 PWM 开关边沿确实有严重的开关噪声尖峰但 ADC 采样时刻已经对齐到 PWM 中心理论上应该采不到这个尖峰。实际一看是 ADC 没有加采样保持时间采样窗口太短恰好采到了振铃。解决方案是增加 ADC 采样时间从 1.5 个周期加到 15 个周期以上。采样没问题之后振荡依然存在。检查 PI 参数发现之前调参数时因为采样波形看起来“还行”就没有重新整定实际上 P 值偏大导致增益过高。把 P 值降了一半I 值保持不变振荡立刻消失。还有一个隐蔽问题d 轴和 q 轴的 PI 参数我没有分开。由于 Ld 和 Lq 的值不同有些表贴式电机 Ld≈Lq问题不大但对于内置式永磁电机两个轴的电感差异达到 30% 以上q 轴需要的 PI 增益比 d 轴高如果共用一个参数就会一个轴稳、另一个轴振荡。书中特别提醒了这个点我遇到类似问题时按它的方法分开整定问题就解决了。4.3 无感 FOC 启动困难和高速失步的处理经验无感 FOC 比有感 FOC 多了一个状态观测器的环节。这本书在无感 FOC 部分用了滑膜观测器SMO作为示例这也是当前比较主流的无感控制方案。SMO 的核心思路是反电动势是一个和位置、速度相关的量通过构造一个滑模观测器来估计反电动势再从反电动势里提取转子角度和速度。实际调 SMO 最大的坑在启动阶段。由于反电动势在低速时幅值极小几乎淹没在噪声里如果直接靠反电动势观测器启动电机根本起不来。工程上通用的做法是“三段式启动”预定位阶段给一个固定方向的电流矢量把转子拉到一个已知位置。强制拖动阶段不依赖观测器直接按固定频率开环换相让电机逐步加速。切换阶段当转速升到足够高、反电动势观测器输出可靠之后平滑切换到闭环 FOC。切换时刻的选择非常关键。太早切换观测器还没收敛电机剧烈抖动太晚切换电机可能已经失步。书里给的经验是当反电动势估算的角度误差在 10° 电角度以内时就可以切换。我在 STM32F407 上实测的切换点是 600~800 RPM具体要看电机的极对数和反电动势常数。切换到闭环后还要用一个速度前馈来减轻观测器的负担先加一个与开环频率同步的速度量再逐步过渡到由观测器独立算出的速度这样切换冲击几乎感觉不到。4.4 常见问题速查表现象可能原因排查思路电机完全不动无电流声音使能信号未打开 / PWM 频率过低被看成直流查使能引脚电平、查占空比信号是否正常输出电机卡在某位置抖动霍尔换相表错误 / 相序接反开环强制换相逐相测试霍尔映射关系上电瞬间电流巨大编码器零位未校准上电先执行转子预定位保存角度偏移量电流环高频振荡PI 参数过大 / ADC 采样时刻不对用示波器看电流波形降低 P 值增大 ADC 采样时间电流换相一瞬间转矩跌落换相提前角不足在高速时增加提前换相的电角度补偿高速运行时噪音明显载波频率过低 / 死区时间不够提高 PWM 频率到 20kHz 以上检查死区设置无感 FOC 低速启动失败反电动势观测器尚未收敛用三段式启动在中速范围切换至闭环电机能转但效率低、发热大id 偏置不为零 / 电流采样增益不一致校准三路电流采样增益检查 id 目标值是否为零最后再分享一个实用小习惯把这本书从头到尾读完再回头做项目最大的收获是“再也不会被术语吓住”。FOC、SVPWM、MTPA、id0这些本质上都是在解决同一个问题怎么让电机在合适的磁场下输出目标力矩同时损耗最小、响应最快。就拿 MPTA最大转矩电流比来说在表贴式电机里 LdLqid0 就是最优但在内置式永磁电机里LdLq利用磁阻转矩可以获得更高转矩效率这时需要给 id 注入一个负的值通过查询 MTPA 曲线来确定当前最优工作点。这些高级话题在书里也是从电机基础一步步推出来的不会让人觉得是天上掉下来的公式。如果你也想入电机控制这个方向我的建议是别只看书一定要配一块开发板和一个电机实物动手实践。这本书的前半部分可以通读建立知识框架后半部分当作工程手册用调试卡壳时翻开对应的章节往往能找到答案。至少以我自己的项目经验来说从摸不清 FOC 到能独立调通有感 FOC 和无感 FOC靠的就是“读书建立理论模型动手检验每一个环节”。把知识串起来之后你会发现电机控制本质上就是高中学过的电磁感应、力与运动加上一点点线性代数和自动控制原理并没有想象中那么高不可攀。

看完文章,想为自己的企业也做一次专业网站诊断?

尧图顾问免费为您评估现有网站,并给出建站/改版建议与报价方案。

免费获取方案