FOC如何控制速度力矩大小,以及无感FOC检测电角度的方法

发布时间:2026/5/19 2:00:27

FOC如何控制速度力矩大小,以及无感FOC检测电角度的方法 FOC 控制电机本质就一句话通过控制三相电流让定子磁场始终在“最合适的角度”拉着/推着转子转。更工程一点说速度靠速度环调节扭矩靠 q 轴电流Iq调节电角度靠编码器/霍尔/无感估算得到。1. FOC 怎么控制电机速度FOC 不是直接控制“速度”而是通过控制电流 → 扭矩 → 加速度 → 速度。控制链路一般是这样目标速度 target_speed ↓ 速度环 PID ↓ 目标 q 轴电流 Iq_ref ↓ 电流环 PID ↓ Vq/Vd ↓ 反 Park/SVPWM ↓ 三相 PWM ↓ 电机转起来可以理解成你想让电机转 1000rpm FOC 发现现在才 600rpm 速度误差 1000 - 600 400rpm 速度 PID 输出一个 Iq_ref比如 3A 意思是给我 3A 的 q 轴电流用来产生扭矩加速所以 FOC 里面真正直接控制的是Iq_ref// 控制扭矩Id_ref// 控制磁场一般表贴式 PMSM/BLDC 设为 0速度控制通常是外环电流控制是内环。2. FOC 的核心Iq 控制扭矩在 FOC 里面Idd轴电流沿着转子磁场方向 Iqq轴电流垂直于转子磁场方向大多数 BLDC/PMSM 控制里Id_ref0;Iq_ref由速度环输出;因为Iq 才是主要产生扭矩的电流。对于表贴式 PMSM可以粗略理解为T_e \approx K_t I_q也就是说Iq 越大电机扭矩越大 Iq 为正正向扭矩 Iq 为负反向扭矩/制动扭矩 Iq 为 0理论上不出力这就是 FOC 控制扭矩大小的核心。3. 加速是怎么实现的比如你当前速度是 500rpm目标速度是 1000rpm。速度环会做speed_errortarget_speed-current_speed;Iq_refspeed_pid(speed_error);如果误差很大速度 PID 输出较大的Iq_ref目标速度 当前速度 → speed_error 为正 → Iq_ref 为正 → 输出正扭矩 → 电机加速例如target_speed1000;current_speed500;speed_error500;Iq_ref3.0f;// 给 3A 的 q 轴电流然后电流环会努力让实际Iq跟随Iq_ref。实际 Iq 太小 → 增大 Vq → PWM占空比变化 → 相电流增加 实际 Iq 太大 → 减小 Vq所以加速不是直接把 PWM 加大而是速度误差 → Iq_ref 增大 → 扭矩增大 → 加速4. 减速是怎么实现的比如目标速度从 1000rpm 降到 500rpm。目标速度 当前速度 → speed_error 为负 → Iq_ref 变小甚至变负有两种情况。情况 1自然减速如果只是把Iq_ref降到 0Iq_ref0;电机就不主动输出扭矩靠负载摩擦、风阻、机械阻力慢慢降速。这叫滑行 / 惯性减速 / coast适合风扇、轻负载、不要急停的场景。情况 2主动减速如果速度环输出负的Iq_refIq_ref-2.0f;这时候 FOC 会产生一个反向扭矩。电机还在正转 但是你给它负 Iq → 电磁扭矩方向和旋转方向相反 → 电机主动减速这就是主动刹车的基础。5. FOC 怎么刹车FOC 里常见的刹车有几种。5.1 滑行刹车 Coast直接不输出力矩Iq_ref0;Id_ref0;PWM 关闭或者进入高阻特点刹车力小 电机靠惯性慢慢停 发热小 控制简单类似自行车不捏刹车靠摩擦慢慢停。5.2 主动电刹给负 Iq如果电机正转你给负的Iq_refIq_ref-brake_current;比如Iq_ref-3.0f;效果产生反向电磁扭矩 电机快速减速这是 FOC 里面最常见、最可控的刹车方式。但是要注意负 Iq 过大 → 电流大 → MOS发热 → 母线电压可能升高因为刹车时电机可能进入发电状态能量会回灌到母线电容/电池。5.3 动态刹车短接三相比如让下桥全开或者三相短接。电机转动 → 反电动势产生电流 电流产生反向阻力矩特点不需要复杂控制 低速刹车力会变弱 电流可能很大 发热明显很多电调里面的 “brake on/off” 就有类似思想。5.4 能量回馈刹车如果你的母线接的是电池并且硬件允许能量回充那么刹车能量可以回到电池。机械能 → 电能 → 电池但这需要电池允许充电 母线电压不能过高 驱动器有过压保护 控制算法限制回馈电流否则很容易出现母线电压升高 驱动器过压保护 MOS损坏 电容爆所以小车、平衡车里面刹车电流一定要限制。6. 控制扭矩大小其实就是控制 Iq 大小FOC 中扭矩控制非常直接Iq_reftorque_command;例如Iq_ref0.5A;// 小扭矩Iq_ref3.0A;// 中等扭矩Iq_ref8.0A;// 大扭矩Iq_ref-3.0A;// 反向扭矩/刹车工程上一般会做限幅if(Iq_refIq_max)Iq_refIq_max;if(Iq_ref-Iq_max)Iq_ref-Iq_max;比如#defineIQ_MAX_ACCEL5.0f#defineIQ_MAX_BRAKE3.0f#defineIQ_MAX_TOTAL8.0f如果是平衡车就更像这样angle_errortarget_angle-actual_angle;speed_errortarget_speed-actual_speed;Iq_refangle_pid(angle_error)speed_pid(speed_error);最终还是变成姿态/速度需求 → Iq_ref → 扭矩7. 低速扭矩和高速扭矩有什么区别这是很关键的问题。理论上扭矩 ≈ Kt * Iq只要你能给足Iq低速和高速都能有扭矩。但是工程上不是这样因为高速时会受反电动势和母线电压限制。7.1 低速时容易输出大扭矩低速时电机反电动势小。反电动势小 → 母线电压主要用来推动电流 → 电流容易打进去 → Iq容易上去 → 扭矩大所以电机低速、堵转、起步时理论上可以输出很大扭矩。但限制是相电流不能太大 MOS不能过流 电机绕组不能过热 电池不能过流低速大扭矩主要受电流限制。7.2 高速时扭矩会下降高速时转子转得快反电动势变大。转速越高 → 反电动势越大 → 留给电流控制的电压余量越小 → Iq越来越难打进去 → 扭矩下降可以理解成低速电池电压几乎都能拿来推电流 高速电池电压很大一部分被反电动势抵消了所以高速时虽然你想要Iq_ref5A;但是实际可能只能做到Iq_actual2A;这时候电机扭矩自然就小了。8. 为什么高速要弱磁高速时反电动势太大母线电压不够用了。这时候可以给一个负的IdId_ref0;它的作用是削弱转子等效磁场让反电动势下降。负 Id → 弱磁 → 反电动势降低 → 可以继续升速但是代价是同样电流下扭矩能力下降 电机发热增加 控制复杂度提高所以常规控制低速/中速 Id_ref0;Iq_ref控制扭矩;高速弱磁区 Id_ref0;Iq_ref受限后的扭矩电流;简单说低速靠电流限制扭矩 高速靠电压限制扭矩 弱磁可以提高最高速度但会牺牲部分扭矩9. FOC 为什么必须知道电角度FOC 要把三相电流转换到d/q坐标系。但是d/q坐标系是跟着转子磁场一起转的。所以你必须知道转子磁场现在转到哪里了这个角度就是电角度。机械角度转子物理转了多少度 电角度转子磁场转了多少电角度关系是电角度 机械角度 × 极对数例如电机是 7 对极机械转一圈 360° 电角度转 7 圈 2520°FOC 里面的 Park 变换需要这个角度Id/IqPark(Ialpha,Ibeta,electrical_angle);如果电角度错了你以为 q 轴是 q 轴 实际可能打到 d 轴去了结果就是扭矩小 电流大 电机抖动 发热 甚至反转/失控10. 有感 FOC 怎么得到电角度常见有三种编码器 霍尔 磁编码器例如 AS5600、MT6701、TLE5012B、ABZ 编码器等。流程大概是mechanical_angleread_encoder_angle();electrical_anglemechanical_angle*pole_pairsoffset;electrical_anglenormalize(electrical_angle);其中offset很关键。因为编码器的 0 度不一定等于转子磁场 d 轴的 0 度。所以需要电角度校准。11. 无感 FOC 怎么检测电角度无感 FOC 没有编码器它不是直接“检测”电角度而是通过电压、电流、电机模型去估算电角度。核心依据是电机转起来会产生反电动势 反电动势的方向和转子磁场位置有关所以无感 FOC 大多是估算反电动势 → 转子磁链位置 → 电角度12. 无感 FOC 常见估算方法12.1 反电动势观测法电机模型可以粗略理解成给电机的电压 电阻压降 电感压降 反电动势所以反电动势 输入电压 - 电阻压降 - 电感压降控制器知道给了多少电压 Uα/Uβ 测到了多少电流 Iα/Iβ 知道电机参数 R/L然后就可以估算反电动势Eα/Eβ反电动势向量的位置和转子磁场位置有固定关系所以可以推算电角度。大概流程measure ia,ib,ic ↓ Clarke 变换得到 Ialpha/Ibeta ↓ 根据 SVPWM 反推 Ualpha/Ubeta ↓ 用电机模型估算 Ealpha/Ebeta ↓atan2(Ebeta,Ealpha)↓ 得到估算电角度注意实际代码里不会这么简单直接因为噪声很大需要滤波、PLL、观测器。12.2 SMO滑模观测器这是很多无感 FOC 用的方法。思想是用一个数学模型估算电流 把估算电流和实际电流比较 不断修正模型 最后估算出反电动势 再由反电动势得到电角度流程实际电流 Iα/Iβ 估算电流 Îα/Îβ 误差 实际电流 - 估算电流 通过滑模控制估算反电动势 Eα/Eβ Eα/Eβ 进入 PLL 输出电角度 θe优点实现相对常见 中高速效果不错 抗参数误差能力比简单模型好缺点低速效果差 有抖动/噪声 需要滤波 参数不好调12.3 PLL 锁相环估算角度很多无感算法最后都会接一个 PLL。PLL 的作用是从估算出来的反电动势/磁链方向里面平滑地跟踪角度和速度它输出estimated_electrical_angle;estimated_electrical_speed;你可以把 PLL 理解成一个专门追踪旋转角度的 PID反电动势角度很抖PLL 把它变成平滑的电角度。12.4 高频注入法低速甚至零速时反电动势很小。转速低 → 反电动势小 转速为 0 → 反电动势约等于 0所以普通无感 FOC 在低速很难知道转子角度。高频注入法就是人为注入一个高频信号通过电机电感差异估算转子位置。适合低速 零速 需要大启动扭矩的场合但是它比较复杂通常用于 IPMSM普通入门项目不建议一开始搞。13. 无感 FOC 启动为什么难因为电机不转时反电动势 0没有反电动势就很难通过反电动势估算角度。所以无感 FOC 启动一般有几个阶段1. 转子预定位 2. 开环强拖启动 3. 速度起来后开始估算反电动势 4. 切换到闭环无感 FOC阶段 1转子预定位先给一个固定方向的定子磁场把转子吸到一个已知角度。Id_refalignment_current;Iq_ref0;electrical_anglefixed_angle;效果类似我先强行把转子拉到 0° 附近阶段 2开环启动然后控制电角度慢慢旋转electrical_angleopenloop_speed;同时给一个启动电流Iq_refstartup_current;意思是我不管真实转子在哪 先用旋转磁场把你拖起来阶段 3估算器接管当速度升高后反电动势足够大反电动势信号变明显 估算角度可信就切换到无感闭环 FOC这时候电角度来自观测器而不是开环积分。14. 无感 FOC 的低速扭矩为什么差因为低速时反电动势太小。低速 → 反电动势小 → 角度估算不准 角度不准 → Iq不纯 → 扭矩不稳结果就是启动抖 低速没力 容易丢步 大负载启动失败所以无感 FOC 适合风扇 水泵 高速电机 电动工具 航模电调不太适合直接做零速大扭矩 平衡车 伺服定位 机器人关节平衡车更推荐有感 FOC磁编码器/霍尔/ABZ编码器因为平衡车经常需要零速附近来回扭 低速大扭矩 快速正反转 刹停这些都是无感 FOC 的弱项。15. 速度控制、扭矩控制、刹车的代码关系可以粗略写成这样// 目标速度单位可以是 rpm 或 rad/sfloattarget_speed;// 当前速度来自编码器/估算器floatcurrent_speed;// 速度环输出floatIq_ref;// d轴一般给0floatId_ref0.0f;// 速度误差floatspeed_errortarget_speed-current_speed;// 速度环 PID 输出 q轴电流目标Iq_refPID_Speed_Calc(speed_pid,speed_error);// 限制最大加速/刹车电流Iq_refconstrain(Iq_ref,-IQ_BRAKE_MAX,IQ_ACCEL_MAX);// 电流环floatId_errorId_ref-Id_actual;floatIq_errorIq_ref-Iq_actual;VdPID_CurrentD_Calc(id_pid,Id_error);VqPID_CurrentQ_Calc(iq_pid,Iq_error);// 反Park SVPWMFOC_Output(Vd,Vq,electrical_angle);加速时target_speedcurrent_speed Iq_ref0减速/刹车时target_speedcurrent_speed Iq_ref0保持速度时target_speed ≈ current_speed Iq_ref维持负载所需的小电流堵转/爬坡/负载变大时速度掉了 → speed_error 变大 → Iq_ref 增大 → 扭矩增大16. 对平衡车来说更推荐怎么理解平衡车不是简单速度控制而是姿态角控制为主 速度控制为辅例如车身往前倒车身前倾 → 控制器让轮子往前加速 → 轮子追上车身 → 车身重新立起来最终还是输出一个Iq_refIq_refangle_loop_outputspeed_loop_outputturn_loop_output;然后左右两个电机分别控制left_Iq_refbalance_Iqturn_Iq;right_Iq_refbalance_Iq-turn_Iq;所以平衡车里面 FOC 最重要的是低速大扭矩 快速正反转 刹车可控 角度反馈准确因此不建议一开始用纯无感 FOC 做平衡车除非你只是做实验。更稳妥方案FOC 磁编码器 FOC 霍尔 FOC ABZ编码器17. 总结成一张表控制目标FOC 里面实际控制什么结果加速增大正向Iq正向扭矩增大减速减小Iq或给负Iq扭矩减小或反向制动刹车给负Iq/ 短接三相 / 回馈快速降低转速控制扭矩控制Iq_refIq越大扭矩越大低速大扭矩给足电流主要受电流和发热限制高速大扭矩受母线电压和反电动势限制高速扭矩会下降弱磁升速给负Id提高最高转速牺牲扭矩有感FOC角度编码器/霍尔读取低速和零速好无感FOC角度反电动势/观测器估算中高速好低速差18. 最重要的几个结论你可以先记住这几句话1. FOC 控制速度本质是速度环输出 Iq_ref。 2. FOC 控制扭矩本质是控制 Iq。 3. Iq 为正加速/正向出力。 4. Iq 为负反向扭矩/刹车。 5. 低速扭矩主要受电流限制。 6. 高速扭矩主要受母线电压和反电动势限制。 7. 无感FOC不是直接测角度而是通过反电动势/磁链观测器估算电角度。 8. 无感FOC低速和零速很难平衡车更适合有感FOC。对于你要搞平衡车我建议路线是先用有感FOC 磁编码器/霍尔 先跑通 电流环 → 速度环 → 姿态环 不要一开始就上无感FOC因为平衡车最难的地方刚好是无感 FOC 最弱的地方零速附近 低速大扭矩 频繁正反转 快速刹车

相关新闻