尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FOC闭环速度控制实战:从三环架构到PID整定完整指南

FOC闭环速度控制实战:从三环架构到PID整定完整指南 FOC闭环速度控制实战手记从三环架构到参数整定的那些坑玩电机控制有一段时间的朋友多半都会走到FOC这一步。磁场定向控制Field Oriented ControlFOC这个名字听起来唬人但本质上就是把三相交流电机的控制问题通过坐标变换简化成类似直流电机那样“励磁”和“转矩”独立控制的问题。而闭环速度控制是在这个基础上最常用、也最考验调试功夫的一层应用。这篇文章我想聊聊我在STM32平台上从零调通FOC闭环速度控制的全过程包括三环架构怎么搭、为什么电流采样要放在下桥、速度环PID怎么整定才能不抖不吵以及实测中踩过的那些坑。不管你是刚接触BLDC/PMSM控制的学生还是已经在用3508电机做机器人项目的工程师这篇都应该能帮你少走不少弯路。这篇文章会写得比较长我尽量把“为什么这么做”讲透而不只是贴代码和参数。因为FOC这东西网上资料满天飞但真正能落地、能在电机上转起来不炸MOS的细节往往是藏在那些不起眼的工程判断里。1. FOC闭环速度控制的整体架构拆解1.1 为什么速度闭环必须建立在电流环之上先说一个很多初学者容易搞混的点FOC闭环速度控制不是“直接控速度”而是速度环外面套电流环的嵌套结构。为什么要这样设计我举个生活化的例子你想让车以60km/h巡航你不会直接猛踩油门到底然后等车速慢慢飘到60。你会先看当前速度差多少再决定踩多深——而且这个“踩多深”最终作用的是发动机输出扭矩不是速度本身。电机也一样。速度环的输出是电流环的给定值Iq_ref电流环再通过SVPWM去控制逆变器输出对应的电压矢量。电流环是内环跑得快通常10kHz-20kHz速度环是外环跑得慢通常1kHz-5kHz。内环先稳住电流外环才有资格去调速度否则外环算出来的电流指令内环根本跟踪不上整个系统就会发散。我在实际调试中体会很深的一点是如果电流环没调好千万别急着碰速度环。电流环调好的标志很简单——给定一个阶跃Iq_ref实测Iq能在1-2ms内跟上且无明显超调。这一步做不到速度环无论怎么调都是白搭。1.2 FOC三环架构各自的分工与频率搭配一个完整的FOC速度控制系统从上到下是位置环可选最外层输出速度给定值频率最低通常100Hz-1kHz速度环中间层输出Iq_ref频率1kHz-5kHz电流环最内层输出Vd/Vq频率10kHz-20kHz为什么频率要这样递减原因有二。一是物理带宽限制电流的动态响应最快需要高频率才能把正弦电流控好机械速度的惯性大响应慢频率高了不仅浪费算力还容易引入噪声。二是避免环路耦合如果内外环频率一样或太接近外环的离散噪声会直接干扰内环的收敛产生振铃。我常用的搭配是电流环16kHz PWM频率同步触发速度环2kHz位置环如果做的话500Hz。这样各环之间留出足够的频带隔离调试起来干扰小很多。1.3 核心硬件选型思路以STM32F407 3508电机为例很多做RoboMaster或者DIY伺服项目的朋友手头都是大疆M3508电机 STM32F407ZGT6这套组合。3508是典型的PMSM电机内置行星减速器转子是永磁体配合C620电调本来可以直接用PWM控制但如果要做FOC常规做法是拆掉电调自己用MOS驱动板直接驱动电机相线。F407跑FOC完全够用主频168MHz带FPU做单电机FOC三环控制在CPU占用30%-40%左右还能余出资源跑通信和逻辑。如果用更高端的STM32G4系列优势是内置了更高性能的定时器和运放适合要做板级集成、采样电路想做得更干净的朋友。但对于学习验证阶段F407加一套独立的电流采样板比如AS5600编码器 电流传感器模块就足够了。1.4 FOC算法落地的基础公式回顾这里快速过一下FOC的核心数学变换因为后面调试PID、判断波形都要用到这些概念Clarke变换将三相电流ia、ib、ic通常只采样两相另一相通过基尔霍夫定律算出从abc静止坐标系变换到αβ静止坐标系Park变换将αβ坐标系旋转到dq坐标系旋转角是转子电角度θe。变换后得到励磁电流Id和转矩电流IqSVPWM根据Vd、Vq反Park变换得到Vα、Vβ再用空间矢量调制生成三路互补PWM波形核心控制逻辑就是速度环PI算出的Iq_ref Id_ref0表贴式PMSM通常这样设置电流环PI跟踪这两个电流指令输出Vd/Vq再反变换生成PWM。整个系统让Iq和实际转矩线性相关速度控制就变成“调Iq”这么简单。2. 电流采样为什么要放在下桥——硬件设计的关键决策2.1 采样位置不同效果天差地别关于电流采样网上讨论最热烈的就是这个问题采样电阻应该放在哪里三种常见方案高端采样采样电阻串在母线正极或各相上桥臂低端采样采样电阻串在下桥臂MOS管源极与地之间低端三电阻采样三个下桥臂各放一个采样电阻分别采样三相电流主流的低成本FOC方案基本都走下桥三电阻采样路线。原因很实际电流信号是相对于GND的采样电路简单、共模干扰小、价格便宜。高端采样因为电流信号浮在母线电压上必须用差分放大器或者隔离运放电路复杂度和成本都上去了。2.2 下桥采样与PWM同步的关系但下桥采样有个致命的前提必须在PWM周期的特定时刻下桥MOS管恰好导通时采样。这就引出了“为什么要设置在下桥”的回答——不是“只能放下桥”而是下桥方案必须和SVPWM的开关时序配合才能采到准确的相电流。具体来说在一个PWM周期内当某一相下桥导通时该相的电流会流过采样电阻此时用ADC去采样才能采到该相真实的电流值。如果采样的时刻不对——比如下桥已经关断、电流在续流二极管里走——采到的就是乱七八糟的续流电流完全不能用。所以工程实现上通常有两种做法中心对齐PWM 定时器触发ADC把PWM配置成中心对齐模式三角载波在计数器的特定计数值通常是周期中点或边界触发ADC采样。此时三个下桥同时导通的时间窗口最大最容易采到准确的三相电流。非对称采样补偿在低调制比或某些扇区边界某个下桥导通时间太短导致该相电流采不到此时需要用重构算法或者调整采样时刻来补偿。2.3 我的实际采样方案与参数选择我用的方案是三个低边采样电阻10mΩ 运放放大增益约50倍 STM32 ADC1三通道同步采样。PWM中心对齐三角载波周期62.5μs16kHzADC触发点设在定时器上溢中断的下一拍即载波峰顶处此时所有下桥都导通三相电流均可采样。这里面的关键细节是10mΩ采样电阻在10A电流下压降才0.1V功率损耗小运放带宽要够至少要能跟上PWM频率下的电流纹波我用的是带宽3MHz的轨到轨运放ADC采样时间要设置到尽量短我通常用1.5周期采样时间并且三通道同时采样避免相位差采样完的数据建议用DMA搬运到内存数组在电流环中断里直接计算Clarke/Park变换省去等待ADC转换的时间2.4 电流采样常见的坑刚开始调的时候最容易遇到的问题是采到的电流波形全是毛刺根本没法看。排查方向如下采样时刻不对用示波器同时抓下桥MOS的Vgs波形和ADC触发信号确认是不是在导通窗口中间采的地线环路采样电路的地和功率地要单点连接避免功率回路的大电流在地线上产生压降干扰采样信号运放供电问题运放正电源用干净的3.3V或者5V模拟电源不要直接取开关电源的输出纹波太大会让采样信号全是噪踩过这个坑之后我养成了一个习惯先用开环强制给定占空比不用速度环在示波器上看三相电流波形是否对称正弦。如果开环下电流波形是漂亮的正弦说明采样链路没问题再去闭环调试。3. 速度信号的获取与处理——编码器不是插上就能用3.1 编码器选型与速度计算方法FOC转子位置是所有变换的前提速度环也必须有速度反馈。对于3508这种带减速箱的电机通常做法是在**电机后端高速侧**装磁编码器而不是在输出轴侧。3508电机尾部留了磁铁安装位配合AS5600或MA730这类磁编码器很合适。速度计算最常用的两种方法M法测频法固定采样周期Ts统计Ts内编码器脉冲数n速度 n / (N * Ts)其中N是编码器单圈脉冲数或4倍频后的数。适用于中高速低速时脉冲少、分辨率不够T法测周期法测量相邻两个脉冲的时间间隔速度 脉冲角度差 / 时间差。适用于低速但高速时脉冲间隔太短测量误差大实际工程中常用M/T法结合或者更简单粗暴的做法——在高速侧用M法直接算因为减速后输出轴转速很低如果编码器在输出侧高速侧每转几十圈输出轴才转一圈M法的分辨率会好很多。3.2 速度计算需要低通滤波就算编码器分辨率够转速信号也会有量化噪声。尤其是低速时每两个采样周期之间脉冲数可能就一两个算出来的速度值是一格一格的台阶直接喂给速度环会让Iq_ref抖得很厉害。我的做法是M法算出的原始速度再过一阶低通滤波截止频率大概设到50Hz-100Hz。为什么这个量级因为速度环带宽通常只有10Hz-30Hz低通滤波频率只要比带宽高两三倍就不会影响环路稳定性同时能滤掉大部分量化噪声。滤波要小心的一点是滤波太狠会让速度反馈滞后导致速度环调PI时容易以为系统反应慢拼命加KP最后速度环振荡。我一般会先用示波器看滤完波的速度阶跃响应保证延迟在5ms以内。3.3 电角度对齐——FOC能不能转起来的第一关编码器装上去之后有个关键步骤电角度对齐。PMSM的Park变换需要转子电角度θe如果编码器的零位和电机A相绕组轴线不对齐那么Id/Iq就不是真正的励磁/转矩分量闭环一跑就乱。对齐方法最基本的一种给定一个固定的Vd直轴电压即电流方向正好在转子轴线上让电机转到一个确定的机械位置此时把编码器角度记录为零位偏移。实际调试时我会写一个开环“对齐模式”给Vd1V很小等待1-2秒让转子稳定然后读取编码器角度θ_offset后续所有电角度都减去这个偏移量。这个步骤看起来简单但是90%的“电机一闭环就发烫、咔咔响”的新手问题根子都在电角度没对齐。我建议对齐完之后用手掰一下电机轴确认转子在任位置下启动都能平稳出力再往下走。4. 速度环PI参数整定实操——从纸上谈兵到稳如老狗4.1 速度环设计与电流环的频率关系速度环的PI参数是整个系统调试中经验性最强的部分。先给个大概的调参顺序先把电流环闭环调好给定Iq_ref阶跃看Iq跟踪是否快速无超调电流环闭环后速度环给定一个斜坡速度指令不要阶跃观察实际速度跟踪情况如果速度响应太慢加大KP如果出现振荡减小KP、加大KI或先不加I只调PI的作用是消除稳态误差但要放PI的零点远低于速度环穿越频率否则会引入相位滞后4.2 一个可落地的调参流程以3508电机为例空载情况下速度环KP初始设为 0.05 左右输出Iq_ref的单位是AKI设为0.001给一个500rpm电机轴非减速输出轴的阶跃看速度波形如果响应慢且无振荡KP每次×1.5往上加直到出现轻微超调如果出现持续振荡KP减半然后加KI消除稳态误差我实际调下来3508高速侧在24V电压、空载情况下速度环KP在0.2-0.5、KI在0.02-0.05这个范围表现比较理想响应时间大概100-200ms稳态误差能控制在±5rpm以内。但注意这是空载带载后惯量变化参数必须重新整定。4.3 积分限幅与抗饱和——一个常常被忽视的细节速度环PI最容易出问题的不是KP/KI本身而是积分饱和。当电机堵转或者从启动瞬间开始加速时速度误差很大积分项会一直在累加输出Iq_ref可能顶到电流上限比如20A而且很长时间退不下来。结果就是速度已经到位了积分还源源不断地输出系统出现过冲甚至振荡。解决办法必须有积分限制和输出限幅电流环给定Iq_ref要限幅我根据电机额定电流和MOS管能力设置为±12A积分项单独限幅通常限制在输出限幅的50%-70%比如±6A——这样可以保证比例项还有调整空间避免积分把输出占满更高级的做法是做条件积分当输出饱和时暂停积分累加或反向衰减等误差重新拉回来再恢复我调试时踩过一次速度环调好了一加上带载测试电机低速抖动原因就是积分饱和。给积分单独限幅之后问题直接消失。这个细节参考资料里很少提但对实际系统太重要了。4.4 速度环带宽目标与实测验证整定完参数后怎么判断系统“够好”我一般看两方面阶跃响应速度从0阶跃到500rpm超调量不超过10%调节时间进入±2%误差带不超过200ms抗扰性用手捏住输出轴施加一个突加的阻力矩速度跌落不超过20rpm并且能快速恢复如果这两项都过了说明速度环带宽大概在10-20Hz左右对绝大多数运动控制场景够用了。如果是做高动态的机器人关节可能需要更激进的参数这时要注意电流环的相位裕度是否足够否则速度环带宽上去了系统容易在高频段谐振。5. 实操过程记录从零到闭环的完整流程5.1 调试环境的搭建我调试时的硬件清单如下主控STM32F407ZGT6最小系统板驱动板自制三相全桥逆变IR2104 IRFS3006 MOSFET母线电容470μF电机M3508 P1919倍减速比24V供电编码器AS5600磁编码器SPI模式读取12位角度电流采样三电阻采样 运放放大ADC同步采样调试工具示波器、逻辑分析仪、串口上位机J-Scope软件上用TIM1产生中心对齐PWMPWM频率16kHz死区设为500nsIR2104驱动下死区太小会直通炸管。5.2 开环验证→电流环闭环→速度环闭环的三步走我的调试流程严格按三步走绝不跳步第一步开环验证用上位机发一个固定占空比的SVPWM矢量比如让电机开环旋转观察三相采样电流波形确认是正弦且相位差120°此时不做任何闭环只验证功率电路、采样链路、编码器读数是否正常第二步电流环闭环电角度对齐给定Iq_ref 1AId_ref 0看实际Iq能否跟踪调整电流环PI先P后I直到阶跃响应在1ms左右跟上无振荡第三步速度环闭环速度环输出接入电流环的Iq_ref斜坡调速观察速度响应整定速度环参数完成5.3 关键代码结构的介绍这里给一个简化的中断函数结构展示三环是怎么嵌套的// TIM1 更新中断电流环 16kHz void TIM1_UP_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 1. 读取ADC采样值DMA已搬运到adc_buf GetPhaseCurrent(ia, ib, ic); // 2. Clarke Park 变换得到 Id、Iq ClarkePark(ia, ib, ic, theta_elec, Id, Iq); // 3. 电流环 PIId_ref 通常为0Iq_ref 由速度环给出 Vd PI_CurrentD(Id_ref, Id); Vq PI_CurrentQ(Iq_ref, Iq); // 4. 反Park变换 SVPWM InvPark(Vd, Vq, theta_elec, Valpha, Vbeta); SVPWM_SetDuty(Valpha, Vbeta); } } // 定时器4中断速度环 2kHz5ms周期 void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); speed_meas GetSpeedFromEncoder(); // 低速则 M法 或 外插 Iq_ref PI_Speed(speed_target, speed_meas); // 输出限幅 ±12A // 更新电角度 theta_elec编码器读数 - 零位偏移乘以极对数 } }这个结构里电流环尽量缩短代码执行时间三角函数用查表或fast_atan2实现采样到的原始数据直接运算不在中断里做打印或浮点格式化。速度环中断优先级低于电流环保证电流环不被抢占。如果你用STM32CubeMXPWM和ADC的初始化可以图形化配置但中断函数里的代码顺序和逻辑一定要自己理清楚。我见过不少人初始化都配置对了但中断里计算顺序颠倒导致电流环用的电角度还是上一拍的系统就工作不正常。6. FOC控制调试中那些典型的疑难杂症6.1 电机堵转或者启动的一瞬间电流爆表这个问题的根源通常是速度环输出限幅太大 积分项过快饱和。启动时速度误差最大速度环PI输出直接顶到限幅值电流环满负荷输出如果没有母线电流保护很容易把MOS管炸了。解决办法加软件过流保护电流采样值超过设定阈值比如20A立刻关闭PWM输出并置故障标志启动时限制速度环给定的变化率用斜坡发生器把速度指令从0慢慢升到目标值积分限幅如前所述把PI积分项单独限幅6.2 低速时速度波动大、电机会有“格愣格愣”的声音低速抖动的原因一般是两个速度采样分辨率不够编码器分辨率低低速时速度value是台阶状速度环误以为速度在剧烈变化不断调节Iq电流环带宽不够低速时反电动势小PWM占空比很小SVPWM在低调制比下的非线性死区效应、最小脉宽限制会让电流波形畸变排查技巧把速度环断开直接给一个恒定的Iq_ref听电机声音是否平稳。如果电流环开环下电机平稳问题在速度采样/滤波如果开环下电机也有咔咔声重点查死区补偿、电流采样时序是不是在低占空比时失真6.3 高速时力矩上不去电流波形削顶这大概率是母线电压不够了。PMSM在高速时反电动势接近母线电压SVPWM的调制比进入过调制区实际可用的电压矢量不足电流环输出顶到饱和力矩自然掉。解决思路确认电源电压满足电机在该转速下的需求反电动势系数 × 转速 母线电压的80%左右适当降低速度环的目标转速或者换更高电压的电源如果必须高速运行考虑弱磁控制id_ref负向给定但这对初学者不太友好我建议先把基础流程跑通再考虑6.4 编码器电角度在高速时漂移严重AS5600这类磁编码器如果安装偏心或者受到电机磁场的干扰角度读数会和真实电角度有偏差高速时这个误差会被放大造成电流环解耦不准进而出力下降、电流变大。对策用EEPROM校准让电机开环匀速转一圈记录编码器角度和理论上电角度的偏差表或者换用更高精度、抗干扰更强的编码器如MA730、TLE5012B机械上做好编码器磁铁的同心对中这一点在自制机架上尤其要注意7. 送给新手的几条“少走弯路”心得从最开始对着示波器一头雾水到后来能在一个晚上完成整套FOC速度闭环的调试我总结了几条经验算是给后来人的一份礼物别一上来就追求“无感FOC”。无感FOC要用滑模观测器或龙伯格观测器估算反电动势对电流采样噪声、PWM频率、死区补偿的要求比带编码器的有感FOC高一个数量级。先把有感FOC调明白再去做无感你会发现那些观测器参数不再玄学。每一步都要有可观测的输出。电流采样波形、速度阶跃响应、Iq_ref变化曲线这些都用串口或J-Scope发出来看。盲调PID基本等于碰运气我见过太多人用上位机看速度曲线都不看一直在试参数试了半天还不知道问题在哪。电角度对齐多花十分钟后面少折腾两小时。电角度不对所有闭环都是白搭电机只会嗡嗡响、发烫、电流大。把对齐这步做成一个独立的调试模式以后每次换编码器或换电机都能复用。热保护别省。MOS管温度超过80°C就已经很危险了我做过一台小驱动板没加热保护一次长时间满载调试直接烧了MOS。后来在MOS管下面贴了热敏电阻和过流保护一起接进ADC才能放心长时间跑。仿真能做就先做仿真。Simulink里搭一个FOC三环模型把电流环、速度环参数调得差不多再上实机调试能省至少一半的试错时间。实机上的问题多半是采样噪声、非线性、限幅这些仿真里不太容易体现的细节。电流环参数其实不用太焦虑。电流环的PI可以用理论计算来初始化知道电机电感L、电阻R、PWM周期Ts用零极点对消法算出一组KP、KI就能保证基本稳定再微调就行。不用像调速度环那样全靠试。8. FOC速度控制的扩展方向从单电机到多电机协同调通了单电机的FOC速度闭环你会发现这个架构其实是模块化的。速度环的输入可以是位置环做伺服也可以是力传感器的力矩指令做力控甚至可以直接把Iq_ref当作外环控制量和机械臂的动力学解算接上。最近我在做多电机协同位置控制CSP的项目本质上就是在多个FOC速度环控制器之上加一层位置规划和同步逻辑。每一个电机仍然跑自己的三环FOC只不过速度环的给定值由中心控制器统一调度。这种架构的好处是每个电机控制器的实时性要求都能保证速度环频率不用因为多电机而降下来逻辑层的带宽要求低可以用EtherCAT、CAN等总线做同步任何一个电机故障可以单独切换控制模式不影响其他电机继续运行如果你对FOC有兴趣继续深入我建议下一站可以试试位置环 速度前馈让位置闭环更快、更平滑然后再试试扰动观测器让速度环能更好地抵抗负载突变。FOC这条路走到后面你会发现最有趣的不再是坐标变换本身而是如何让整个系统在不确定性面前保持稳定和高效——那才是工程控制的核心乐趣。
返回列表