ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从开环到无感闭环:FOC磁场定向控制核心链路与调试实战

从开环到无感闭环:FOC磁场定向控制核心链路与调试实战 磁场定向控制这四个字刚入行的时候我觉得它玄乎得不行。翻教材全是坐标变换、PI调节器、空间矢量每个字都认识连起来就是不知道在干嘛。后来真正自己动手写电流环、调PWM、盯着示波器上那三根相电流波形发呆才慢慢把里面的逻辑串起来。这篇东西不是教科书复述是我自己从能转就行到转得稳、转得准这个过程里对FOC核心链路的一次完整梳理。三相电流到底怎么变成两个直流量、dq坐标系为什么能解耦转矩和磁链、电流环带宽该怎么定、转子初始位置检测为什么是无感FOC的第一道坎——这些我都会按实际调试的顺序讲一遍。适合已经能跑通开环、想搞明白闭环里每一步在干什么的人也适合调电流环调到头大、想回头补理论的朋友。1. 从三根线到两个直流量FOC到底在解决什么问题1.1 直流电机为什么好控交流电机为什么难控先说一个最朴素的对比。有刷直流电机转矩和电流基本成正比你给多少电流它就出多少力控制起来跟拧水龙头一样直观。原因在于它的磁场方向和电枢电流方向在空间上是固定的换向器和电刷帮你把该换的向都换好了你只需要管电流大小。三相交流电机就不一样了。定子上三个绕组在空间上互差120度通进去的也是三路相位互差120度的交流电。转子在转定子磁场也在转转矩是定子磁场和转子磁场相互作用的结果。如果你只是简单给三路正弦电流转矩会随着转子位置周期性波动而且磁链和转矩是耦合在一起的——你想调转矩磁链也跟着变想调磁链转矩又受影响。这就是交流电机难控的根源变量耦合、坐标系在转。FOC的思路说白了就一句话把交流电机当成直流电机来控。怎么当通过坐标变换把旋转的、耦合的三相交流量投影到一个跟着转子一起转的坐标系上。在这个坐标系里原本交流的量变成了直流量原本耦合的磁链和转矩被拆成了两个独立的分量。于是你就可以像控直流电机那样一个分量管磁链一个分量管转矩各管各的互不干扰。1.2 Clarke变换三相到两相降维的第一步三相电流 ia、ib、ic 满足 iaibic0星形接法、无中线也就是说三个量里只有两个是独立的。既然只有两个自由度就没必要用三个坐标去描述它。Clarke变换干的事就是把三相静止坐标系a、b、c轴空间互差120度投影到两相静止坐标系α、β轴互差90度。等幅值Clarke变换的公式是这样的# 等幅值Clarke变换三相 - 两相静止 i_alpha ia i_beta (ia 2*ib) / sqrt(3) # 等价于 (ib - ic)/sqrt(3) 的变形实际工程里更常见的是直接用 ia、ib 两相来算因为 ic -ia - ibi_alpha ia i_beta (ia 2*ib) / 1.7320508这里有个细节很多人第一次会懵等幅值变换和等功率变换系数不一样。等幅值变换下变换前后矢量幅值不变但功率差了个 3/2 的系数等功率变换则保证功率不变但幅值会变。做电流环的时候如果你用等幅值变换那转矩公式里要带 3/2如果用等功率变换转矩公式就干净一些。我个人的习惯是统一用等幅值然后在转矩计算那里显式乘 3/2这样物理意义更直观——α、β 轴上的电流幅值就是相电流的幅值示波器上看波形对得上。变换之后三相的120度相位关系被压成了两相90度关系但注意α、β 仍然是静止坐标系里面的量还是交流的。转子在转α、β 轴不动所以电流矢量相对于 α、β 轴还是在旋转。这一步只是降了维还没解耦。1.3 Park变换让坐标系跟着转子一起转Park变换是把两相静止坐标系α、β再投影到两相旋转坐标系d、q。这个旋转坐标系跟着转子磁场一起转d轴对准转子磁链方向q轴超前d轴90度。公式# Park变换两相静止 - 两相旋转 i_d i_alpha * cos(theta) i_beta * sin(theta) i_q -i_alpha * sin(theta) i_beta * cos(theta)theta 是转子电角度也就是d轴相对于α轴的角度。这个角度从哪来有传感器就是编码器/旋变读出来的无感就是观测器估出来的——这是后话先记住它是整个FOC的方向盘。变换完你会发现稳态下 i_d 和 i_q 都是直流量。为什么因为坐标系跟着转子转了电流矢量相对于转子的位置在稳态下是固定的投影到d、q轴上自然就是常数。这就是FOC最漂亮的地方旋转坐标系把交流问题变成了直流问题。1.4 反Park变换算完控制量还得变回去你在d、q坐标系里算出了想要的电压 v_d、v_q但逆变器只能输出三相电压所以还得变回去。反Park变换v_alpha v_d * cos(theta) - v_q * sin(theta) v_beta v_d * sin(theta) v_q * cos(theta)然后再经过反ClarkeSVPWM里通常直接进SVPWM模块不一定显式做反Clarke生成三相占空比驱动六个开关管。整条链路串起来就是三相电流采样 → Clarke → Park → d、q轴PI调节 → 反Park → SVPWM → 逆变器。这个环跑起来电流就闭上了。提示theta 的精度直接决定FOC能不能正常工作。角度差个几度电流环还能勉强跑但效率会掉、转矩会脉动角度差几十度直接失控。所以无感FOC里观测器的收敛精度是命门。2. dq坐标系里的转矩控制为什么id0是主流选择2.1 转矩公式拆开看哪一项在出力表贴式永磁同步电机SPMSM在dq坐标系下的转矩公式Te (3/2) * p * [psi_f * i_q (L_d - L_q) * i_d * i_q]p 是极对数psi_f 是永磁体磁链L_d、L_q 是d、q轴电感。对于表贴式电机L_d ≈ L_q第二项 (L_d - L_q) * i_d * i_q 基本为零。转矩就简化成Te (3/2) * p * psi_f * i_q也就是说转矩只跟 i_q 有关跟 i_d 没关系。这就是为什么表贴式PMSM普遍用 id0 控制既然 i_d 不产生转矩那让它等于零所有电流都用来产生转矩效率最高铜耗最小。对于内置式电机IPMSML_d L_q第二项是负的因为 i_d 通常为负这叫磁阻转矩。这时候可以让 i_d 取负值用磁阻转矩帮忙出力这就是MTPA最大转矩电流比控制的由来。同样的转矩用MTPA可以少用一点电流铜耗更低。但代价是控制复杂度上去了而且 i_d 为负会削弱磁链高速弱磁区要小心。2.2 id0控制的实际含义和边界id0 不是说d轴电流物理上必须为零而是说给定值 i_d_ref 0让电流环把实际 i_d 调到零附近。实际运行中 i_d 会有小波动但只要在零附近转矩就基本由 i_q 线性决定。这个策略的适用边界表贴式PMSM额定转速以下id0 是最优解直接用。内置式PMSM额定转速以下id0 能用但不是最优想要效率就上MTPA。高速弱磁区id0 不行了反电动势会顶到母线电压上限必须给负的 i_d 来削弱磁链这就是弱磁控制。我见过不少人调电机低速段跑得好好的一上高速就失控八成是没做弱磁。母线电压就那么多转速上去反电动势跟着上去电压裕量不够电流环饱和PI输出顶死角度一乱就飞车。2.3 电流环PI调节器的设计逻辑d、q轴各有一个PI调节器结构一样参数通常也设成一样因为d、q轴在解耦后是对称的。PI的输出是电压指令 v_d、v_q。设计电流环带宽的时候有个经验公式带宽 ωc 2π * fc Kp L * ωc Ki R * ωcL 是d轴或q轴电感R 是相电阻。这个公式来自把电流环近似成一阶系统让闭环带宽等于 ωc。实际调试的时候我会先按这个算出理论值然后在这个基础上微调。带宽选多少太低响应慢转矩跟不上太高容易振荡而且采样噪声会被放大。一般电流环带宽取开关频率的 1/10 到 1/20。比如10kHz开关频率电流环带宽取500Hz到1kHz比较稳妥。我试过把带宽拉到2kHz空载还行一加载就啸叫示波器上看电流波形全是毛刺——采样噪声和PWM更新延迟把相位裕度吃掉了。注意电流环带宽不能超过采样频率的一半奈奎斯特实际上要远低于因为还有PWM更新延迟、计算延迟。数字控制里这些延迟会引入相位滞后带宽越高滞后占比越大稳定性越差。2.4 前馈解耦要不要做什么时候做d、q轴在数学模型上其实还有耦合项v_d R*i_d L_d*di_d/dt - ωe*L_q*i_q v_q R*i_q L_q*di_q/dt ωe*L_d*i_d ωe*psi_f那个 -ωeL_qi_q 和 ωeL_di_d 就是交叉耦合项ωe 是电角速度。转速越高耦合越强。如果PI调节器带宽足够高它能自己把耦合当成扰动压下去不做前馈解耦也能跑。但高速的时候耦合项幅值大PI要花力气去压动态响应会变差。前馈解耦就是把这两项直接算出来加到PI输出上让PI只管自己那一轴。做法v_d_ff -omega_e * L_q * i_q v_q_ff omega_e * L_d * i_d omega_e * psi_f v_d pi_d_output v_d_ff v_q pi_q_output v_q_ff我个人的经验低速段做不做无所谓高速段额定转速70%以上建议做尤其是对动态响应有要求的场合。但前馈项里的 L_d、L_q、psi_f 参数要准参数不准前馈反而帮倒忙。3. 电流环带宽、采样与PWM那些调波形时才会懂的事3.1 带宽不是越高越好先搞清楚限制在哪很多人一提带宽就觉得越高越好响应快嘛。但电流环带宽受几个硬约束约束来源影响典型取值开关频率PWM更新延迟带宽越高相位滞后越大带宽 ≤ 开关频率/10采样频率奈奎斯特定理且采样噪声放大带宽 ≤ 采样频率/10计算延迟一个控制周期的纯滞后相位裕度下降电流传感器噪声高带宽放大噪声PI输出抖动取决于传感器和滤波母线电压裕量带宽高需要更大电压摆幅受限于调制比我一般按开关频率的1/10先定比如10kHz开关频率先取1kHz然后看波形。如果电流波形干净、阶跃响应无超调可以往上试如果一加载就振荡往下调。3.2 采样时刻和PWM更新的对齐关系数字控制里有个特别容易被忽略的点电流采样时刻和PWM更新时刻的配合。常见做法是PWM计数器在谷底或峰顶触发ADC采样然后在下一个周期更新占空比。这样采样点落在电流纹波的中间值附近避开开关瞬间的尖峰。如果你采样时刻乱放采到的是开关噪声最大的点电流环里全是毛刺带宽根本上不去。我踩过这个坑一开始ADC随便触发电流波形看着还行但一算 i_d、i_q 全是高频抖动PI输出跟着抖电机啸叫。后来把采样对齐到PWM谷底抖动小了一大半。还有一种做法是双采样双更新一个PWM周期采样两次、更新两次等效采样率翻倍带宽可以做得更高。但计算量也翻倍对MCU算力有要求。3.3 死区、管压降这些小误差怎么影响电流逆变器桥臂上下管之间要留死区防止直通。死区期间输出电压不受控实际输出电压和指令电压有偏差。这个偏差在低速、小电流的时候占比很大会导致电流波形畸变、低速转矩脉动。补偿方法有几种基于电流极性的死区补偿、基于电压误差的死区补偿。我一般用电流极性法简单有效# 简化死区补偿示意 if i_a 0: duty_a_comp duty_a deadtime_comp else: duty_a_comp duty_a - deadtime_comp但电流过零附近极性判断不准容易补偿错误反而引入畸变。所以过零附近通常不补偿或者做平滑过渡。这个细节调低速的时候特别明显低速电流波形上的那个台阶就是死区造成的。3.4 电流采样方案单电阻、双电阻、三电阻方案原理优点缺点三电阻每相下桥臂各一个采样电阻直接采三相最简单成本高三个运放双电阻采两相第三相算出来成本适中够用需要重构有盲区单电阻母线一个采样电阻成本最低重构复杂盲区大三电阻最省心采样时刻对上就行。双电阻要处理哪两相可采的问题因为不同扇区下桥臂导通情况不同。单电阻最麻烦要在PWM周期内找合适的采样窗口窗口太窄就采不到低速小占空比时尤其难。我刚开始做的时候用单电阻低速直接采不到电流波形全是乱的。后来换双电阻世界清净了。如果成本不敏感三电阻是最稳的选择。4. 无感FOC绕不开的第一关转子初始位置检测4.1 为什么无感FOC必须先知道转子在哪有传感器的场合上电读编码器就知道转子位置直接闭环。无感就不一样了上电时你不知道转子在哪如果随便给个角度去闭环很可能给反了电机要么不动要么反转要么直接过流。所以无感FOC的启动流程通常是初始位置检测 → 开环强拖 → 观测器收敛 → 切换到闭环。初始位置检测是第一步也是最容易翻车的一步。4.2 高频注入法的基本思路表贴式PMSM的L_d ≈ L_q凸极率低反电动势法在零速和低速下失效反电动势为零或很小。这时候要用高频注入法利用电机的凸极效应即使L_d≈L_q饱和也会造成微小凸极来辨识转子位置。基本做法在d轴注入高频电压信号检测q轴高频电流响应。因为d轴和q轴电感不同高频电流响应的幅值会随注入方向和转子位置的夹角变化。通过解调这个响应可以提取出转子位置误差用锁相环PLL收敛到真实位置。# 高频注入简化示意 v_inj V_h * sin(omega_h * t) # 注入高频电压 # 检测q轴高频电流响应 i_q_h I_h * sin(omega_h * t) * sin(2 * (theta_est - theta_real)) # 用PLL把 theta_est 收敛到 theta_real实际实现比这复杂得多要考虑注入频率、幅值、滤波、解调相位延迟。注入频率一般取开关频率的1/10到1/5幅值要足够大能检测到响应又不能太大导致噪声和损耗。4.3 脉冲注入法更简单但精度有限另一种常用方法是脉冲注入依次给不同方向的电压矢量检测电流响应幅值幅值最大的方向就是转子d轴方向因为d轴电感最小或最大取决于饱和特性。做法# 依次在6个或12个方向注入短时电压脉冲 for angle in [0, 60, 120, 180, 240, 300]: apply_voltage_vector(angle, V_pulse, T_pulse) measure_current_response(angle) # 电流响应最大的方向即为转子d轴方向这个方法简单不需要复杂解调但精度有限取决于注入方向的分辨率而且注入脉冲会产生转矩脉动和噪声。适合对启动精度要求不高的场合。4.4 初始位置检测的常见坑注入幅值太小响应淹没在噪声里检测不出来。要根据电机参数和采样精度算最小可检测幅值。注入时间太短电流还没建立起来就结束了响应不完整。多个方向响应差不多凸极率太低区分不出来。这时候要考虑用其他方法或者接受较大误差。检测完直接闭环初始位置有误差直接闭环可能失步。通常先开环拖到一定转速等观测器收敛再切闭环。我调过一台凸极率很低的表贴电机脉冲注入法检测出来的角度误差有30度开环强拖都费劲。后来改用高频注入精度好一些但调试花了好几天。所以选电机的时候如果要做无感凸极率是个重要指标。5. 观测器无感FOC从开环到闭环的那座桥5.1 滑模观测器为什么这么常用滑模观测器SMO是无感FOC里最常用的观测器之一。它的核心思想是构造一个电流观测器让观测电流和实际电流的误差在滑模面上收敛到零从误差里提取反电动势再算出转子位置。反电动势和转子位置的关系e_alpha -omega_e * psi_f * sin(theta) e_beta omega_e * psi_f * cos(theta) theta atan2(-e_alpha, e_beta)SMO的优点是鲁棒性强对参数变化不敏感实现也不算复杂。缺点是低速时反电动势小信噪比低观测不准而且滑模本身有抖振需要滤波滤波又引入相位延迟。5.2 从反电动势提取角度的细节提取角度用 atan2 直接算或者用PLL锁相。atan2 简单但噪声大PLL平滑但需要调参数。我一般用PLL结构如下# PLL提取角度和速度 error -e_alpha * cos(theta_est) - e_beta * sin(theta_est) omega_est pi_pll(error) # PI调节器 theta_est integrate(omega_est)PLL的带宽要折中太低收敛慢太高噪声大。一般取几十到几百赫兹。5.3 低速段为什么难怎么过渡低速段反电动势幅值和转速成正比转速越低反电动势越小噪声占比越大SMO基本失效。所以低速段通常用高频注入或者I/F开环强拖等转速上来、反电动势足够大了再切到SMO闭环。切换点怎么选一般看反电动势幅值是否大于某个阈值或者转速是否超过额定转速的5%到10%。切换过程要做平滑过渡避免角度突变导致电流冲击。常见做法是切换时让观测器角度逐渐接管而不是瞬间切换。5.4 观测器参数整定的经验SMO的滑模增益、滤波截止频率、PLL带宽这三个参数互相影响。我的调试顺序是先调滑模增益让观测电流能跟上实际电流误差收敛。再调滤波截止频率让提取的反电动势波形干净但相位延迟可接受。最后调PLL带宽让角度跟踪平滑且收敛快。整个过程要在不同转速下反复验证低速、中速、高速都要看。我一般会记录不同转速下的角度误差画个曲线看哪个转速段误差大针对性调。6. 从理论到落地一套可复现的调试顺序6.1 先开环把PWM和采样跑通不要一上来就闭环。先开环给三相正弦电压频率从低到高慢慢加用示波器看三相电流是否对称、正弦度如何相电流和相电压的相位关系采样时刻是否对齐PWM谷底死区补偿是否生效这一步是把硬件和底层驱动跑通确认采样、PWM、死区都没问题。我见过有人跳过这步直接闭环结果查了半天发现是采样通道接错了。6.2 再电流环id和iq分开调开环没问题了上电流环。先只闭 i_d 环i_q 给零看 i_d 能不能稳在零。然后只闭 i_q 环i_d 给零看 i_q 能不能跟上阶跃。两个都稳了再一起闭。调PI的时候先给小的阶跃看响应。超调大就降Kp响应慢就加Kp稳态有误差就加Ki。注意积分饱和要加抗饱和。6.3 然后速度环带宽要拉开电流环稳了外面套速度环。速度环带宽一般取电流环的1/5到1/10两个环带宽拉开避免相互干扰。速度环输出是 i_q_refi_d_ref 还是零额定转速以下。速度环调的时候先空载再看加载。空载稳了加载可能振荡因为转动惯量变了。有条件的话做负载测试或者用对拖台架。6.4 最后上无感从强拖到闭环有传感器跑通了再换无感。流程初始位置检测 → I/F开环强拖 → 观测器收敛 → 切闭环。每一步都要验证切换点要平滑。我一般会在切换前后记录角度、转速、电流波形对比观测器角度和实际角度如果有编码器做参考。误差在可接受范围内再撤掉编码器。6.5 几个反复出现的坑角度方向反了电机反转或者不动。检查theta的符号和极对数。相序接错电流不对称转矩脉动大。交换任意两相试试。PI积分饱和启动时电流顶死响应迟钝。加抗饱和。观测器低速失效低速抖动或失步。检查切换点是否太低。死区补偿过度电流过零畸变。过零附近减小补偿量。提示调试的时候一定要有示波器或者高速数据记录光看串口打印的数值很多细节看不到。电流波形、角度波形、PI输出波形这三个是排查问题的关键。7. 一些参数计算和选型的实际参考7.1 电流环PI参数算例假设一台PMSM相电阻 R 0.5Ωd轴电感 L_d 5mHq轴电感 L_q 6mH开关频率 10kHz目标电流环带宽 1kHz。按公式ωc 2π * 1000 6283 rad/s Kp_d L_d * ωc 0.005 * 6283 31.4 Ki_d R * ωc 0.5 * 6283 3141 Kp_q L_q * ωc 0.006 * 6283 37.7 Ki_q R * ωc 0.5 * 6283 3141这是理论值实际调试在这个基础上微调。注意Ki的量纲和你的离散化方式有关如果是位置式PIKi要乘采样周期。7.2 带宽和响应时间的关系一阶系统带宽 fc 和上升时间 tr 的关系tr ≈ 0.35 / fc1kHz带宽对应上升时间约0.35ms。如果你需要更快的转矩响应就得提高带宽但受前面说的那些约束限制。7.3 母线电压和最大转速电机能跑多快受母线电压限制。稳态下V_max ≈ sqrt((R*I_q ωe*psi_f)^2 (ωe*L_q*I_q)^2)简化看高速时反电动势 ωe*psi_f 占主导所以最大转速大致受限于ωe_max ≈ V_dc / psi_f实际还要留调制比裕量、电阻压降、电感压降。如果要做弱磁负的 i_d 可以削弱有效磁链把转速往上推。7.4 极对数和电角度的换算theta_e theta_m * p omega_e omega_m * pp 是极对数。编码器读的是机械角度进Park变换前要乘极对数。这个换算错了电机要么不转要么乱转。我见过有人把极对数搞错调了一整天没找到原因。8. 写在最后FOC调试是个系统工程FOC这东西理论看一遍觉得懂了真上手调又是另一回事。电流环、速度环、观测器、初始位置检测每一块单独看都不算太难但串在一起任何一个环节出问题都会表现为电机不转或者电机抖排查起来像大海捞针。我的经验是分层验证逐级闭环。先把开环跑通再闭电流环再闭速度环最后上无感。每一级都确认没问题了再往上加。不要跳步跳步省的时间后面都要加倍还回来。还有就是示波器真的比串口打印有用得多。电流波形、角度波形、PI输出波形这三个看懂了大部分问题都能定位。串口打印只能看数值看不到波形畸变、相位关系、噪声这些关键信息。参数计算是起点不是终点。理论算出来的PI参数实际调的时候大概率要改。因为理论模型忽略了很多东西采样延迟、PWM延迟、死区、参数非线性、温度漂移。所以算完理论值一定要在实测中微调以波形为准。最后说一句FOC的每个环节都有很多变种和优化空间观测器有SMO、EKF、磁链观测器初始位置检测有高频注入、脉冲注入、旋转高频调制有SVPWM、DPWM。没有哪个方案是万能的选型要看具体应用的需求——成本、精度、动态响应、低速性能各有取舍。把基础链路跑通再根据需求去优化特定环节这是我觉得比较靠谱的路径。
返回列表