首页 / 资讯中心 / 文章详情

无传感器永磁电机控制:LADRC速度环与非线性磁链观测器设计

无传感器永磁电机控制:LADRC速度环与非线性磁链观测器设计 ★ FEATURED ARTICLE
做无传感器永磁电机控制的人应该都有过这种体验观测器在开环状态下跑得挺好仿真波形也算干净可一旦把速度环的反馈从编码器换成观测器估计值系统的毛病立刻全冒出来了——转速低频振荡、突加负载掉速、起步瞬间反冲甚至直接发散。多数人第一反应是观测器参数没调好但调试到后面你会发现问题往往出在速度环本身。我一直用的一套组合方案是速度环用二阶LADRC线性自抗扰控制器转子位置和速度交给非线性磁链观测器估计整套系统在Simulink里建模并且从一开始就按“可生成C代码”的标准来搭。这篇文章就围绕这个方案展开把控制器设计、观测器原理、Simulink建模和代码生成链路一次讲透。如果你正在调无传感器FOC或者想找一种比PI更容易应付“观测反馈污染”的速度环方案这篇内容应该能帮你省掉不少弯路。1. 为什么无传感器速度环需要LADRC而不是传统PI1.1 无传感器反馈回路的相位滞后比想象中严重传统转速环面对的控制对象是机械方程J dω/dt Te - TL - Bω其中J是转动惯量Te是电磁转矩TL是负载转矩B是阻尼系数。PI速度环在这种对象上工作得很好前提是速度反馈真实且干净。但无传感器控制里“真实且干净”这个前提本身就不成立。无传感器速度反馈来自观测器和锁相环这意味着一路信号至少经过了观测器收敛、反电动势提取、角度跟踪、速度微分这样几个环节。观测器有带宽限制PLL本身又是一个低通跟踪器实测下来速度反馈相对真实转速总有几十到几百赫兹的相位滞后。再加上为了避免微分噪声很多人还会额外串一级低通滤波滞后就更大了。用PI控制时积分项本来就会引入90°的相位滞后观测链路再叠加上几十度的滞后速度环的相位裕度被压缩得非常快。开环传函写出来就是L(s) Kp(1 Ki/s) * 1/(Js) * e^(-τs)那个e^(-τs)就是观测和滤波链路带来的等效延迟。你为了提高抗扰能力加大Ki低频增益上去了中频段相位裕度进一步恶化最后的结果就是临界振荡。我见过不少项目PI参数在编码器反馈下怎么调都稳一换观测器反馈积分项必须砍掉一半以上才不抖代价是稳态刚度大幅下降。1.2 LADRC的抗扰思路和PI有本质区别LADRC的思路完全不同。它不试图精确知道负载、摩擦、模型误差每一项是多少而是把所有这些合在一起当成一个“总扰动”用一个扩张状态观测器LESO把它实时估出来然后在前向通道里做前馈补偿。还是从机械方程出发J dω/dt Te - TL - Bω两边除以Jdω/dt (1/J)Te d(t)其中d(t) -(TL Bω)/J这就是总扰动它包含负载、摩擦也包含模型误差。把它扩张成一个额外的状态控制器里根本不需要单独去辨识负载转矩也不需要知道摩擦系数只需要观测d(t)的变化。对比一下PI和LADRC的行为差异理解起来更直观对比项传统PI速度环二阶LADRC速度环对负载扰动的处理靠积分项慢慢累积误差去补偿LESO直接观测扰动并前馈抵消反馈信号质量要求高相位滞后容易激化振荡相对容忍观测器输出可被LESO重构参数整定Kp、Ki耦合在一起牵一发动全身全部由带宽参数化ωc、ωo、b0三个数对模型依赖程度需要准确的J做工程整定只需要b0量级准确误差会被总扰动吸收用一句话总结PI是“误差驱动”它只能看到已有误差然后被动去追LADRC是“扰动前馈”它主动把外部扰动和内部不确定性一起抵消掉。在反馈信号本身就有污染的无传感器系统里谁更适合一目了然。2. 非线性磁链观测器的原理与选型逻辑2.1 为什么线性观测器在这个应用里不够用磁链观测器的本质是从定子电压、电流的电气方程里把转子磁链方向反推出来。表贴式永磁同步电机在αβ坐标系下的定子电压方程可以写成v_α Rs·i_α Ls·di_α/dt e_α v_β Rs·i_β Ls·di_β/dt e_β其中反电动势e_α -ψf·ωe·sinθe e_β ψf·ωe·cosθeθe就是转子电角度ψf是永磁磁链。只要把反电动势e_α、e_β估出来位置和速度自然就有了。传统线性龙贝格观测器直接把这个方程线性化设计一个状态观测器来估计磁链。这种做法在参数准确、转速稳定时没问题但无传感器控制恰好是参数最容易失配的场景定子电阻随温度变化电感随电流饱和变化转速从零到额定值跨越几个数量级反电动势幅值也剧烈变化。线性观测器在这些不确定因素面前鲁棒性明显不足。非线性观测器的核心差异在于引入了切换项或高增益非线性项。说得直白一点它让状态轨迹先被强制“拉”到滑模面上一旦进入滑模面系统行为就对参数失配不敏感了观测等效值中只剩我们想要的反电动势成分。2.2 超螺旋滑模观测器的离散化设计滑模观测器常见的形式是对电流观测方程加入符号函数切换项。但标准一阶滑模有个让工程人员头疼的毛病——抖振。符号函数的高频切换会直接污染电流估计值进而污染反电动势最终在速度信号上表现为高频毛刺。我实际用的是超螺旋滑模观测器ST-SMO它把切换项分成两部分一个比例于|s|^0.5·sign(s)的项负责快速收敛一个对sign(s)积分项负责消除稳态误差。这个结构在连续域里的形式是di_hat_α/dt (1/Ls)·[v_α - Rs·i_hat_α - k1·|s_α|^0.5·sign(s_α) - ∫k2·sign(s_α)dt]其中s_α i_hat_α - i_α是电流估计误差。β轴完全对称。由于积分项的存在等效控制可以直接从积分输出中提取反电动势抖振比一阶滑模小一个量级。离散化实现要特别注意符号函数的处理。直接sign()在固定步长仿真和代码生成中容易引起数值颤振我一般换成饱和函数sat(s/ε)function [ialpha_hat, ibeta_hat, ealpha, ebeta] st_smo_step(...) % 超螺旋滑模观测器单步离散更新Ts为离散周期 % 输入: valpha, vbeta, ialpha, ibeta 定子电压电流 % 参数: Rs, Ls, k1, k2, epsilon % 状态: ialpha_hat, ibeta_hat, zalpha, zbeta积分项 % 电流误差 eia ialpha_hat - ialpha; eib ibeta_hat - ibeta; % 饱和函数代替符号函数epsilon通常在0.01~0.05之间 sata sat(eia / epsilon); satb sat(eib / epsilon); % 积分项更新对应反电动势估计的等效值 zalpha zalpha Ts * k2 * sata; zbeta zbeta Ts * k2 * satb; % 电流估计更新 ialpha_hat ialpha_hat Ts / Ls * (valpha - Rs * ialpha_hat ... - k1 * sqrt(abs(eia)) * sata - zalpha); ibeta_hat ibeta_hat Ts / Ls * (vbeta - Rs * ibeta_hat ... - k1 * sqrt(abs(eib)) * satb - zbeta); % 反电动势估计直接取积分项 ealpha zalpha; ebeta zbeta; endk1、k2的量级要按电压方程来估。反电动势项的量级是ωe·ψfk1、k2太小时观测器收敛慢太大时噪声会被放大。工程上我习惯先用连续仿真自动整定再根据离散周期微调。2.3 转子位置和速度提取别小看PLL反电动势估计出来之后位置不能直接atan2。直接用e_α、e_β做atan2(e_α, e_β)虽然简单但反电动势里的高频残余会直接变成角度抖动再微分算速度基本不可用。正确做法是锁相环。把反电动势方向角θe作为锁相环的输入用PI调节器跟踪角度ε (-e_hat_α·cosθ_hat - e_hat_β·sinθ_hat) / sqrt(e_hat_α² e_hat_β²)当θ_hat θe时ε趋向于0。PLL的PI输出是电角速度积分后得到电角度。这里有个关键细节PLL带宽要放在观测器带宽的1/5到1/3。PLL带宽太高反电动势噪声会直接进入速度信号太低速度反馈相位滞后又增大速度环LADRC再能扛也扛不住90°以上的滞后。折中下来观测器本身做到几百赫兹带宽时PLL带宽放在30~60Hz比较稳妥。3. 速度环LADRC控制器设计从被控对象到LESO整定3.1 被控对象降阶与b0的工程辨识设计LADRC时第一步是把被控对象化成积分串联型。速度环对象近似为dω/dt b0·u d(t)其中u Te_refb0 1/J。实际系统里电流环有延迟通常十几个kHz采样下等效成一个时间常数很小的惯性环节。LADRC处理这个惯性的方式是把它扔进总扰动里让LESO去估计。所以设计时不需要精确知道电流环传递函数只需要b0量级正确。b0的工程辨识很简单。空载、额定速度以下给一个阶跃转矩指令用高分辨率编码器调试阶段记录转速上升曲线取稳态段斜率b0 Δω / Δt / Te_step如果连编码器都没有可以估算。比如电机额定转矩3N·m转子惯量0.001kg·m²空载从0加速到1000rpm大约需要0.16s那b0大约等于b0 ≈ (1000·2π/60) / 0.16 / 3 ≈ 21.8 (rad/s²)/(N·m)实际用的时候上下浮动50%都不致命因为b0的误差会被当成总扰动的一部分被LESO补偿。这也是LADRC比PI省心的核心原因。3.2 LESO设计与带宽参数化建立速度环扩张状态方程dx1/dt x2 b0·u dx2/dt hx1是转速x2是总扰动h是扰动变化率。LESO写成dz1/dt z2 b0·u l1·(ω - z1) dz2/dt l2·(ω - z1)l1和l2按带宽参数化配置l1 2·ωo l2 ωo²ωo是观测器带宽一般取闭环带宽ωc的5到10倍。控制器输出u0 ωc·(ω_ref - z1) u (u0 - z2) / b0这里的逻辑是z1是对转速的重构z2是对总扰动的实时估计。控制量里先用z2把扰动抵消掉剩下的u0就是一个纯积分对象上的比例控制带宽就是ωc性质非常好。离散化用前向欧拉足够代码生成也友好function [z1, z2, Te_ref] ladrc_velocity_step(z1, z2, w_meas, w_ref, b0, wc, w0, Ts) % 二阶LADRC速度环单步更新固定步长离散 % 输入: w_meas 观测器速度反馈, w_ref 速度给定 % 状态: z1 转速估计, z2 总扰动估计 % LESO增益 l1 2 * w0; l2 w0 * w0; % 观测误差 e w_meas - z1; % 状态更新前向欧拉 z1 z1 Ts * (z2 b0 * Te_ref l1 * e); z2 z2 Ts * (l2 * e); % 控制律扰动前馈 比例反馈 u0 wc * (w_ref - z1); Te_ref (u0 - z2) / b0; end这个函数可以直接丢进Matlab Function块配合固定步长求解器就是可生成的离散控制器。整个速度环一共三个整定参数ωc决定响应快慢ωo决定扰动观测速度b0量级决定前馈准确性。相比PI的两个参数LADRC的参数物理意义清楚得多调起来不用瞎试。3.3 速度环反馈到底用观测器原始值还是z1这是个非常实际的问题。很多人在速度环前面再加一个低通滤波器想滤掉观测速度的纹波结果低通带来的相位滞后直接把LADRC好不容易省出来的裕度又吃掉了。我的经验是反馈直接用PLL输出的速度但把LESO的观测带宽ωo设计得比PLL带宽高2~3倍。这样LESO能跟踪上速度反馈的变化但不会放大高频噪声z1天然就是一个带观测特性的平滑速度。速度环不需要额外低通控制带宽也能保持住。如果你发现速度反馈毛刺还是很明显优先回头压PLL带宽和观测器增益不要在速度环里串滤波。串滤波是扬汤止沸源头上的噪声不处理后面怎么串都治标不治本。4. Simulink建模与代码生成的衔接要点4.1 仿真模型顶层拓扑整个系统的Simulink模型分几个关键模块结构上我习惯按信号流排列电机与逆变器PMSM模型 三相两电平逆变器电流采样与坐标变换Clark、Park变换电流环PI控制器d轴、q轴各一个输出Ud、Uq反Park变换与SVPWM调制非线性磁链观测器超螺旋滑模观测器输出反电动势PLL从反电动势提取转速和角度速度环LADRC输入转速给定和观测速度输出q轴电流给定转速斜坡给定用于限制启动加速度调试阶段我建议先用平均模型逆变器忽略开关纹波把算法调通再加SVPWM和开关模型验证真实工况。平均模型下电流环带宽调得快但最终仿真一定要回到开关模型否则代码生成之后的性能可能会差很多。4.2 求解器与采样周期的配合仿真阶段可以用变步长连续求解器但一旦准备生成代码模型里就不能有连续积分器了必须全部离散化。离散化之前先确定采样周期环路典型采样频率说明电流环10kHz~20kHz与PWM开关频率一致或加倍磁链观测器10kHz~20kHz与电流环同频PLL10kHz也可以降半频但要注意抗混叠速度环LADRC1kHz~2kHz比电流环慢5~10倍这组配置下速度环看到的是一个带宽在几百Hz范围、电流内环等效为高增益环节的被控对象LADRC的LESO带宽放10倍左右就能把扰动看清。注意所有不同频率的模块之间信号切换要么在慢速环入口做离散采样保持要么直接用相同基频再倍频千万别让Simulink自动插值产生“仿真里稳定、代码里没有”的假象。4.3 代码生成前的模型硬化检查我吃过最大的亏就是仿真里通了代码生成后一接真实逆变器就崩。后来固定了一套“模型硬化”流程求解器改为固定步长离散步长取电流环采样周期模型里的连续积分模块全部替换为离散积分器或单位延迟全局信号数据类型检查杜绝double和single混用关闭Simulink的动态内存分配和可变大小数组所有数组长度在初始化时固定用代码生成工具预先做模型检查确认没有不可生成的模块生成代码后先用纯软件仿真跑一遍生成代码和原模型的一致性对比。这六步做完模型基本就是一台“会动的控制器原型”了。剩下的工作就是把生成代码嵌到中断服务程序里PWM由硬件外设直接输出。5. 参数整定顺序与仿真调试中的高频踩坑点5.1 整定顺序电流环→观测器→LADRC顺序不能乱无传感器系统的参数整定有个先后顺序调错顺序会让整个调试过程变得极其痛苦。第一步电流环。电流环带宽调好之前后面全白搭。先把电流环PI带宽定在500Hz左右用编码器或者虚拟电机模型验证d、q轴电流跟随。第二步观测器。观测器增益从偏小开始逐步增大观察启动过程的反电动势估计波形。此时速度环可以先给开环、恒定q轴电流让电机转起来看观测器的角度跟踪是否平滑。第三步才是速度环LADRC。先给一个很小的ωc确认转速能跟上斜坡给定且无振荡再逐步增加ωc到目标值。ωo始终保持ωc的5~10倍。最后再给额定负载阶跃观察LESO的z2能不能快速跟上。这套顺序的本质是先保证底层执行可靠再保证观测可信最后才谈得上控制性能。跳步调参最后出的问题你根本不知道来自哪一层。5.2 低速、零速带载和初始位置这几个硬骨头无传感器控制最怕低速。反电动势幅值正比于转速转速降到5%额定以下时反电动势小到几乎淹没在噪声里滑模观测器再强也难以为继。有两种工程化处理一是零低速启动前做转子预定位或者做初始位置辨识。我在实际项目里用预定位最简单可靠给定一个固定的q轴电流和零d轴电流让转子强制转到一个已知位置再开始正常闭环。代价是启动前会有一点“抖一下”的动作很多商用驱动器也是这么干的。二是低速段改用高频注入策略。这个方案复杂一些系统里要额外叠加高频电压信号并在电流信号里做解调。如果题目限定在非线性磁链观测器框架内那就要明确告诉项目需求方低速性能是有底线的不是观测器不够强而是物理信噪比决定了反电动势法在这段转速范围先天不足。零速带载就更直接了。反电动势为零纯反电动势法没有任何反馈信号可用必须靠初始辨识和开环强拉。这也是为什么高标准无传感器方案普遍做混合切换零低速用高频注入中高速用反电动势法切换点在10%~15%额定转速附近。我建议把这一点写进项目方案里能避免后续很多需求层面的扯皮。5.3 从仿真到代码生成后性能退化的问题固定步长离散化之后最明显的变化是观测器切换项的等效带宽下降了。原来连续仿真里k2设得比较大反电动势还能保持平滑固定步长下同样的k2可能直接引起电流估计的高频振荡。我的处理办法是离散化后把k2降到连续仿真值的二分之一到三分之一然后观察反电动势波形里的高频纹波直到纹波幅值和连续仿真相当为止。另一个退化点是速度环带宽。仿真里ωc放到20Hz没问题代码生成之后由于整个采样链路存在相位延迟20Hz可能就振荡了。我一般先按仿真的50%起步确认系统稳定后再向上升直到出现振荡临界点再退回60%~70%作为最终工作点。代码生成之后不接电机先做控制器在环测试也很重要。把生成的C代码跑在控制芯片上模拟器里跑电机模型通过硬件IO和模拟器交互这一层验证能排除绝大多数代码生成的低级错误比直接上真实电机台架安全得多。最后再分享一个小技巧把所有关键参数b0、ωc、ωo、观测器k1、k2、PLL带宽都定义成模型工作区变量用初始化脚本统一赋值不要直接在模块参数里填数字。这样调参的时候只需要改脚本配合快速仿真就能把整定时间从上星期压缩到一两天。参数和结构分离也是后续做自动标定、参数自整定的基础这一步提前做好后面复杂项目能省大量时间。
阅读完成 · 觉得有帮助?
咨询建站