
简介这份PDF笔记面向正在学习或准备实现FOC磁场定向控制的电机控制初学者与嵌入式开发者系统梳理从理论推导到算法落地的关键环节。内容围绕FOC核心思想与超前角控制展开依次讲解Clark变换的等幅值与恒功率系数推导、Park变换及逆变换的数学过程与程序实现并深入SVPWM的扇区判断、矢量作用时间计算、过调制处理与切换点确定还涉及马鞍波成因及零序分量注入SPWM。PID部分覆盖离散化、位置式与增量式算法区别、参数整定及积分抗饱和方法磁链圆限制则说明MAX_MODULE与START_INDEX的确定思路。资源包为1个PDF文件约7.34MB结构按知识点分节编排便于对照公式与代码逐项理解。已有1926人学习适合希望把数学推导、Simulink仿真与算法实现串联起来、查漏补缺的读者参考。1. FOC 知识地图从“生成超前 90 度磁场”倒推整条链路学 FOC 最容易翻车的地方不是某个公式记不住而是把 Clark、Park、SVPWM、PID 当成四个孤立模块去背结果一到调参就不知道问题出在哪一环。其实整条链路只有一个目标让定子磁场始终超前转子 d 轴 90 度从而拿到最大转矩。围绕这个目标坐标变换负责“把三相交流量搬到能直流量控制的两相旋转坐标系”SVPWM 负责“把想要的电压矢量用开关状态合成出来”PID 与积分抗饱和负责“让电流稳稳跟住给定”磁链圆限制负责“别让合成矢量冲出线性区”。这份笔记把数学推导、程序实现、参数整定和易错点串成一张地图适合正在系统学电机控制、准备考试或动手写驱动器代码的人拿来就能按图索骥地复习。2. 坐标变换三件套Clark、Park 与反 Park 的推导和落地坐标变换是 FOC 的“翻译层”。三相电流在物理上互相耦合、随时间正弦变化直接控制几乎无从下手变换的目的就是降维、解耦、线性化把难辨明的三相波形变成两个直流量。这一章把三个变换的数学来源、系数选择、程序写法和常见坑一次讲清。2.1 Clark 变换降维解耦与等幅值系数的取舍Clark 变换把三相 120 度分布的电流投影到静止的 α-β 两轴。推导起点是基尔霍夫电流定律任一时刻流入节点的电流之和为零即 Ia Ib Ic 0。利用这个约束可以把三变量压成两变量得到# Clark 变换三相 abc - 静止两相 alpha-beta # 采用等幅值变换系数 2/3I_beta 用 (Ia 2Ib)/sqrt(3) 等价形式 def clark(ia, ib, ic): i_alpha ia i_beta (ia 2 * ib) * 0.577350269 # 1/sqrt(3) return i_alpha, i_beta这段代码里 i_alpha 直接取 Ia是因为等幅值变换下 α 轴与 a 轴重合i_beta 的系数 0.57735 就是 1/√3。注意代码里没有出现 Ic因为由 KCL 可消去采样电路只需采 A、B 两相电流成本和复杂度都降下来。系数选择是第一个分水岭等幅值变换系数为 2/3变换前后幅值相等恒功率变换系数为 √(2/3)保证功率不变。实际 FOC 设计一般用等幅值变换原因是若用等功率变换SVPWM 中得到的矢量会是相电压峰值的 1.5 倍容易冲出空间矢量圆直接进入过调制。这个取舍不是数学偏好而是和后面的 SVPWM 线性区强绑定的。2.2 Park 变换与反 Park把旋转坐标系“钉”在转子上Clark 之后仍是交流量Park 变换把 α-β 轴投影到随转子旋转的 d-q 轴。关键在于把旋转的 d 轴当作参考坐标系对转子而言这个坐标系是静止的d、q 幅值固定于是原本正弦变化的量在 d-q 下呈现为直线完成线性化。θ 就是转子当前的电角度。数学上# Park 变换alpha-beta - d-qtheta 为电角度 def park(i_alpha, i_beta, theta): cos_t, sin_t cos(theta), sin(theta) i_d i_alpha * cos_t i_beta * sin_t i_q -i_alpha * sin_t i_beta * cos_t return i_d, i_q # 反 Parkd-q - alpha-beta把 PI 输出送回静止坐标系 def rev_park(i_d, i_q, theta): cos_t, sin_t cos(theta), sin(theta) i_alpha i_d * cos_t - i_q * sin_t i_beta i_d * sin_t i_q * cos_t return i_alpha, i_betaPark 矩阵是正方形矩阵逆矩阵就是转置形式所以反 Park 的符号规律正好相反i_alpha 是“cos 减 sin”i_beta 是“sin 加 cos”。程序实现里常把 sin/cos 用查表或 Q15 定点表示例如把 0~32768 映射到 0~1再做乘法。这里最容易忽略的是 θ 的来源与单位电角度不是机械角需要乘以极对数查表得到的定点值要除以 32768 还原成浮点否则幅值整体缩放PI 参数会莫名其妙地整定不出来。2.3 电角度定义为什么可以“随便”又为什么常取 d 轴夹角笔记里有一个很值得反复咀嚼的观点电角度可以定义为 α 轴与 d 轴的夹角也可以定义为 α 轴与 q 轴的夹角甚至取角平分线因为电角度存在的意义只是指示转子当前在什么方向从而生成超前转子 90 度的磁场。之所以常见定义取 d 轴或 q 轴与 α 轴的夹角纯粹是为了 Park 和反 Park 投影方便——此时只需在两根轴之间相互投影投影系数就是 sin/cos。理解这一点就不会在“θ 到底该减 90 度还是加 90 度”上反复纠结定义变了公式里的符号跟着变但物理目标不变。超前角控制的本质也在这里当磁铁磁场相位比绕组磁场滞后 90 度时转矩最大因为 T Fr·sinθθ 取 90 度时取等号。3. SVPWM 全流程扇区判断、作用时间与七段式切换SVPWM 是 FOC 里公式最密、也最容易“看着懂、写起来错”的一块。它的理论基础是平均值等效原理在一个开关周期内用相邻两个非零矢量和零矢量在时间上的不同组合使平均值等于给定电压矢量让实际磁通逼近理想磁通圆。六个基本电压矢量把空间分成六个扇区每个扇区内用相邻两个非零矢量加零矢量做伏秒平衡。3.1 扇区判断三个中间变量与 N 的编码先由 α-β 轴分量构造三个参考量// 扇区判断Uref1/2/3 与 N 的编码 Uref1 U_beta; Uref2 (sqrt(3) * U_alpha - U_beta) / 2; Uref3 (-sqrt(3) * U_alpha - U_beta) / 2; A (Uref1 0) ? 1 : 0; B (Uref2 0) ? 1 : 0; C (Uref3 0) ? 1 : 0; N A * 1 B * 2 C * 4; // 注意权重是 1、2、4N 与扇区的对应关系是固定表N3 对应扇区 IN1 对应 IIN5 对应 IIIN4 对应 IVN6 对应 VN2 对应 VI。这里翻车最多的是权重顺序A 乘 1、B 乘 2、C 乘 4写成 A×4 就会整张表错位现象是电机抖动或直接不转。另一个易错点是三个参考量的符号Uref2 和 Uref3 里 √3/2 的系数与减号位置必须和推导一致建议写完先用几个已知角度代入验证扇区号。3.2 作用时间计算方法一与方法二的等价性以扇区 I 为例由正弦定理可得两个非零矢量的作用时间// 扇区 I 作用时间k sqrt(3) * Ts / Udc T1 k * Uref2; // 对应矢量 U4 T2 k * Uref1; // 对应矢量 U6 T0 T7 (Ts - T1 - T2) / 2; // 零矢量均分其中 k √3·Ts/UdcTs 是 PWM 周期Udc 是母线电压。方法二是把电压矢量投影到 α、β 轴令两轴分量相等解出 t1、t2结果与方法一完全等价只是表达式不同。复习时不必两个都背但要能互相推导因为考试或面试常问“为什么两种写法结果一样”。调制比 m √3·|Uref|/Udc线性区要求 m ≤ 1也就是 |Uref| ≤ Udc/√3。SVPWM 的直流母线电压利用率比 SPWM 高约 15.47%根源就在这里SPWM 调制比为 1 时对应幅值只有 Udc/2而 SVPWM 能到 Udc/√3。3.3 七段式切换顺序与过调制处理基本矢量作用顺序的分配原则只有两条每次开关状态转换只改变一相开关状态零矢量时间平均分配使 PWM 对称降低谐波。扇区 I 的典型顺序是 0→4→6→7→7→6→4→0其余扇区按相邻矢量类推。这里有个笔记里特意强调的细节T1、T2 的顺序是按开关切换顺序给的不是按矢量编号大小给的写代码时如果把 T1 赋给错误的比较寄存器波形看起来“有”但电流会畸变。过调制处理是另一个易漏模块。当 |Uref| 超过 Udc/√3 时T1T2 会大于 Ts零矢量时间为负必须做限幅或按比例缩放 T1、T2否则比较值溢出输出波形直接崩。常见做法是先判断 T1T2 是否超过 Ts超过则按比例压缩保证 T0 不为负。磁链圆限制章节里的 MAX_MODULE 和 START_INDEX 就是为这件事服务的后面会单独展开。4. PID 与积分抗饱和离散化、位置式增量式与限幅策略电流环和速度环的“稳”最终落在 PID 上。连续域公式谁都记得真正写进单片机的是离散形式而离散形式里最容易出问题的不是 P、I、D 三个系数而是积分项在输出限幅时的“记忆”。4.1 位置式与增量式的区别及适用场景位置式 PID 直接计算控制量绝对值输出 u(k) Kp·e(k) Ki·Σe Kd·(e(k)-e(k-1))积分项累加全部历史误差。增量式只算本次增量 Δu(k)输出靠累加公式里积分项退化为 Ki·e(k)。两者对比维度位置式 PID增量式 PID输出含义控制量绝对值控制量增量积分项累加历史误差需抗饱和天然无累加饱和切换扰动切换时冲击较大切换平滑适用场景电流环、需绝对输出速度环、执行机构带积分FOC 电流环一般用位置式因为需要直接给出电压矢量速度环可用增量式避免积分项长期累积。程序实现时要注意采样周期 Ts 进入积分和微分系数Ki 实际是 Kp·Ts/Ti直接拿连续域参数抄进代码响应会差一个数量级。4.2 积分饱和的成因、危害与三种抗饱和方法积分饱和的机理很直白输出被限幅后误差仍然存在积分项继续累加等误差反向时积分项已经“存”了一大笔需要很长时间才能退出来表现为超调大、恢复慢严重时系统振荡。抗饱和常见三种做法积分限幅给积分累加器设上下界积分分离误差大时暂时不积分误差进入小范围再启用反计算抗饱和用“限幅前输出减限幅后输出”的差回馈去修正积分项。第三种效果最好但实现稍复杂前两种在电流环里已经够用。血泪经验是只做输出限幅不做积分限幅等于给积分项留了“后悔药”却没吃波形上就是给定突变后电流冲上去再慢慢爬回来。5. 易漏点与易错点五个最容易被忽略的细节这一章单独拎出来是因为下面五条在复习时最容易被“看过去”但每一条都能让整机行为异常。易漏点一等幅值与恒功率系数混用。为什么漏两个系数都叫 Clark 变换系数公式长得像。怎么补记住等幅值 2/3 配 SVPWM 线性区恒功率 √(2/3) 会让矢量放大 1.5 倍选错直接过调制写代码时把系数定义成宏全局只引用一处。易漏点二电角度单位与极对数。为什么漏机械角与电角度在代码里都是“角度”变量名不区分。怎么补在角度入口处强制乘极对数并注释单位查表前统一归一化到 0~2π避免 32768 定点与弧度混用。易漏点三扇区判断的 N 权重顺序。为什么漏A、B、C 三个布尔量看起来对称权重 1、2、4 不直观。怎么补把 N 与扇区对照表写成常量数组写完用六个基准角度各测一次确认扇区号连续。易漏点四零矢量时间为负未处理。为什么漏正常工况下 T1T2 很少超 Ts调试时不易触发。怎么补在作用时间计算后加一道判断T1T2 Ts 时按比例缩放并保留一个过调制标志位便于观测。易漏点五积分抗饱和只限输出不限积分。为什么漏输出限幅是“看得见”的保护积分累加是“看不见”的状态。怎么补积分累加器单独设上下界或采用反计算回馈调试时观察给定阶跃后的恢复时间是否对称。6. 磁链圆限制与复习清单MAX_MODULE、START_INDEX 怎么定磁链圆限制解决的是“合成矢量别冲出线性区”的问题。MAX_MODULE 是允许的矢量最大模长理论上取 Udc/√3 对应调制比 1 的边界实际留一点裕量防止数值误差和死区导致越界。START_INDEX 则用于在矢量模长接近边界时提前介入限制相当于给限制器一个“软启动”区间避免在边界上硬切换引起抖动。程序实现上通常是先算模长平方与 MAX_MODULE 平方比较超限则按比例缩放 α-β 分量再送入 SVPWM。复习时建议按下面这张清单逐项自查每项都能对应到前文的具体章节复习项自查问题对应模块核心思想能否一句话说清“超前 90 度磁场”第 1 章Clark 系数等幅值与恒功率分别何时用2.1Park 符号正变换与反变换的 sin 符号规律2.2扇区判断N 的权重与扇区对照表能否默写3.1作用时间方法一与方法二能否互推3.2过调制T1T2 超 Ts 时怎么处理3.3PID 离散化Ki 与 Ts 的关系是否清楚4.1抗饱和三种方法各自适用场景4.2磁链限制MAX_MODULE 与 START_INDEX 的物理含义第 6 章查漏补缺的具体技巧拿一张纸从“给定 Iq”开始把经过 Park 反变换、SVPWM、扇区判断、作用时间、比较寄存器、逆变器、Clark、Park 回到 Id/Iq 的整条回路画一遍每画一个环节就写出它的输入输出和关键参数。画不出来的环节就是漏洞回到对应小节补推导而不是回去背结论。我自己的习惯是每次改完电流环参数都强制走一遍“扇区判断表 过调制判断 积分限幅”三连检查因为这三处出问题时的现象都是“电机能转但不对劲”靠示波器很难一眼定位。希望这份梳理能帮到你把零散的公式串成一条能自己走通的链路。本文还有配套的精品资源点击获取