磁轴承悬浮控制Simulink建模:负刚度线性化与PID整定实践
发布时间:2026/9/12 0:28:30来源:尧图网络
简介这是一份基于Simulink的单自由度轴向磁悬浮轴承控制模型适合从事磁悬浮控制、电力电子或自动控制方向的学生与工程师用于快速搭建磁悬浮仿真环境、研究悬浮控制算法。压缩包共2个文件分别为主Simulink模型.mdl和Matlab建模脚本.m前者包含传感器信号处理、控制器与电磁力计算等模块结构后者基于磁路法生成系统数学模型整体仅12KB轻量易用。已有408人学习下载常用于课程设计、毕业设计或预研验证。借助该资源用户可直观理解磁悬浮系统的建模与仿真流程并基于模型修改参数为PID、滑模等不同控制策略的仿真对比提供实践基础。1. 悬浮控制模型在 Simulink 里先要处理的正反馈刚度解压一个磁轴承仿真包最常见的劝退场景不是模型打不开而是 Scope 里位移通道在 0.2 秒内直接冲到底板。很多 Simulink 模型不收敛并不是 PID 给得太激进而是磁轴承被控对象的运动方程里天然带一个正反馈项转子偏离中心后吸气隙更近的那一侧电磁吸力会自动增大形成“越偏、拉力越大”的循环。对机械系统来说这个等效刚度是负的所以工程里叫它磁轴承负刚度。做悬浮控制模型时第一原则不是急着拉 PID而是先把电磁力线性化成两个系数一个反映控制电流能产生多大的力另一个反映位置偏移会产生多大的正反馈力。下面按这个顺序把磁轴承模型从物理方程讲到可仿真的 Simulink 闭环。2. 磁轴承差动磁力线性化把 ki 和 kx 算出来再进 Simulink2.1 单磁极电磁吸力与差动电磁铁的工作点磁轴承每个自由度通常不是用单个电磁铁而是用一对面对面安装的差动电磁铁。单个磁极的电磁吸力可以写成F C * i^2 / g^2其中i是线圈电流g是气隙C mu0 * A * N^2 / 4由磁极面积A和线圈匝数N决定。仿真空心铁芯模型时直接用这个表达式没有问题但直接做控制系统会遇到两个麻烦电流平方项让输入和输出不是线性关系气隙平方项让位置刚度随工作点剧烈变化。所以实际工程中会先给电磁铁加一个偏置电流i0让转子稳定在额定气隙g0附近再用控制电流ic在两侧做差动调节。偏置电流的作用有两面性。一方面它让电流-力曲线在零点附近近似线性否则i0附近控制器几乎没有增益另一方面偏置电流也同时带来了“越偏越吸”的正反馈梯度。很多简化模型只保留电流刚度而丢掉位置刚度闭合之后仿真看起来稳定换到真实磁轴承上却完全压不住转子问题就出在这里。2.2 把差动合力展开成 ki 和 kx 两个刚度设转子向右偏移量为x控制电流ic定义成让左侧磁极电流增大、右侧磁极电流减小。于是向右的合力可以写成F C*(i0-ic)^2/(g0-x)^2 - C*(i0ic)^2/(g0x)^2在x/g0远小于 1、ic/i0也远小于 1 的条件下保留一阶项差动合力可以线性化成m * x kx * x ki * ic其中kx 4 * C * i0^2 / g0^3单位 N/m表示位移力梯度ki 4 * C * i0 / g0^2单位 N/A表示电流刚度这里kx出现在运动方程右侧且符号为正说明它是正反馈项。写成机械弹簧形式就是m*x k_mech*x ...其中k_mech -kx所以才叫负刚度。ki的符号取决于控制电流定义和电磁铁接线方向如果仿真里发现方向反了把ki取负即可不需要改模型结构。2.3 算例一组能支撑仿真的刚度与状态矩阵下面的 MATLAB 脚本给出一组典型磁轴承单自由度参数并直接生成开环被控对象的状态空间模型。参数不需要追求和某个实物完全一致关键是量级要对转子质量几十千克以下位移刚度通常在 10^5 N/m 左右电流刚度在 10^2 N/A 左右。% 磁轴承单自由度参数 m 10; % 等效质量kg mu0 4*pi*1e-7; % 真空磁导率 A 4e-4; % 单磁极有效磁极面积m^2 N 100; % 线圈匝数 C mu0 * A * N^2 / 4; % 电磁力系数 g0 3e-4; % 额定气隙m i0 2; % 偏置电流A kx 4 * C * i0^2 / g0^3; % 位移力梯度N/m ki 4 * C * i0 / g0^2; % 电流刚度N/A A_mat [0 1; kx/m 0]; B_mat [0; ki/m]; C_mat [1 0]; D_mat 0; sys_p ss(A_mat, B_mat, C_mat, D_mat); % SISO 被控对象 eig(A_mat) % 查看是否有一个右半平面根脚本里A_mat的第二行完全由kx/m决定。算出来eig(A_mat)会是一对实根一个为正一个为负这就是开环不稳定的直接证据。后面在 Simulink 里用 State-Space 模块时可以直接把A_mat、B_mat这些矩阵填进去不用再重复搭积分器和增益。符号物理含义单位示例值m单自由度等效质量kg10C电磁力系数N·m²/A²1.26e-6g0额定气隙m3e-4i0偏置电流A2kx位移力梯度N/m7.45e5ki电流刚度N/A111.73. Simulink 悬浮控制模型搭建State-Space 被控对象、电流环与 PID 接线3.1 用 State-Space 模块把 ki、kx 装进模型搭建 Simulink 模型时我一般不会用两个 Gain 和两个 Integrator 手工搭状态方程而是直接拖一个 State-Space 模块。双击模块把上一章脚本里算好的A_mat、B_mat、C_mat、D_mat填进去。这样后续用 Simulink Control Design 做线性化、算传递函数、整定 PID 都会非常顺因为线性化工具能直接识别状态空间模块。需要注意State-Space模块的输入是控制电流ic不是最终 PWM 占空比或功放电压。如果你把电流环也放进 Simulink那么电流环输出接 Plant位置环 PID 输出接电流环给定。开环模型可以先用一个 Step 加在 Plant 输入端看位移是不是按指数发散方向走如果正向阶跃导致正向位移快速增长说明kx/m的作用方向正确。下面是打开已有闭环模型并设置参数的示例脚本。模型名mag_bearing_close是手动搭好的结构接线顺序是“参考 0 - 差值 - 位置环 PID - 饱和 - 电流环 PI - 电流饱和 - Plant - 位移反馈”。% 把上一章算好的参数写进闭环模型 set_param(mag_bearing_close/Position PID, ... P,20000, I,5000, D,35); set_param(mag_bearing_close/Current PI, ... P,5, I,500); set_param(mag_bearing_close/Plant, ... x0,[1e-5; 0]); % 给 0.01mm 初偏观察回中 sim(mag_bearing_close, 0.2);set_param的好处是参数以字符串形式写进模块后续做批量扫描时只需要把数字换成工作区变量例如P,PID_P然后循环改PID_P即可。模型里Plant的初始状态不能设成全零否则仿真只会在平衡点附近无事发生给一个很小的 10 微米初偏能很快看出闭环是否真的把转子拉回中心。3.2 电流环和功率放大器不是用一个 Gain 糊弄过去磁轴承控制系统如果只看位置环很容易把电流环简化成1/(T_i*s1)的一阶惯性。但这样做有一个隐藏风险电流环带宽如果低于被控对象开环不稳定的特征频率位置环实际控制的是一个“拖着慢尾巴”的惯性对象仿真很容易出现 200 Hz 到 500 Hz 的高频振荡。对于 5 mH 电感、2 欧姆电阻的线圈从电压到电流的传递函数是1/(0.005*s2)时间常数 2.5 ms。如果电流环 PI 给得太慢闭环电流环带宽可能只有一两百 rad/s而上一章算出的开环正根已经接近 273 rad/s这就不满足最小带宽要求。仿真的意义就是把这个问题提前暴露。推荐的做法是至少保留一个电流环 PI 和一个饱和模块并单独测一下电流环阶跃响应。电流环 PI 可以先给P5、I500让电流环带宽落在 1 kHz 以上。位置环再去处理机械刚度和阻尼不要让位置环同时去补电流环的滞后。3.3 位置环 PID 和负刚度抵消位置环的 PID 三个参数在磁轴承里有很明确的分工比例项产生与位移成比例的电磁力用于抵消kx*x正反馈微分项提供等效阻尼压住刚体模态积分项解决不对称偏载和传感器零漂保证稳态悬浮在中心位置。接线时把参考位移设成 0位置反馈从 State-Space 模块的输出端接回差值点。如果用的是真实传感器反馈端还要加 20 kHz 到 40 kHz 的低通滤波但仿真里可以先不加。PID 模块记得开启微分滤波N默认取 1000 或更小否则在求解器步长变化剧烈时微分项会把传感器噪声放大成抖动。位置环输出经过一个 ±10 的饱和再加到电流环防止启动时 PID 给一个几十安培的电流指令。3.4 一组能跑起来的仿真参数按照上面的模型结构可以使用下面这组初始参数跑通第一次仿真模块参数初值位置环 PIDP20000, I5000, D35, N1000抗饱和 back-calculation增益 0.3位置环输出饱和上下限±10电流环 PIP5, I500输出限幅 ±10Plant 初始状态x0[1e-5; 0]求解器ode45最大步长1e-4 s仿真时间StopTime0.2 s位置环D35对应的阻尼系数是ki*D约 3900 N·s/m对 10 kg 质量来说是过阻尼方向偏临界阻尼先跑一次看有没有超调。如果位移回中太慢加大 P如果回中前出现明显振荡加大 D再拉大积分增益 I。仿真时间 0.2 秒足够看到至少一次完整的回中过程。4. 磁悬浮控制模型仿真发散排查pidtune、求解器与抗饱和4.1 用 pidtune 先拿一组稳定 PID手工给 PID 参数容易在负刚度模型上踩坑因为开环有右半平面极点比例增益给小了根本稳不住。更好的做法是直接利用线性对象sys_p用闭环带宽作为设计目标来整定。目标带宽必须明显高于开环正根这里正根约 273 rad/s所以先试 400 rad/s。% 用线性被控对象 sys_p 整定位置环 PID opts pidtuneOptions(PhaseMargin, 45); [Cpos, info] pidtune(sys_p, pid(20000, 5000, 35), 400); % 把整定结果写回模型 set_param(mag_bearing_close/Position PID, ... P, num2str(Cpos.Kp), ... I, num2str(Cpos.Ki), ... D, num2str(Cpos.Kd));pidtune对不稳定的被控对象也能生成稳定控制器但它返回的是连续域 PID且默认带一阶微分滤波参数Tf。如果算出来的滤波时间常数接近 1e-4 秒以下说明目标带宽给得偏高可以把 400 降到 350 或 300。info结构里能看到闭环极点和稳定标志不要只看Cpos。4.2 用 margin 和根轨迹确认正根被拉回左半平面Simulink 模型跑出看起来不错的回中曲线后还需要确认稳定性裕度。把整定后的 PID 和被控对象串起来画 Bode 图L sys_p * Cpos; margin(L);margin会显示开环穿越频率和相位裕度。磁轴承位置环的相位裕度最好保持在 30 度以上穿越频率落在 200 rad/s 到 500 rad/s 区间。低于 200 rad/s 说明控制器反应偏慢难以克服负刚度高于 500 rad/s 则容易把高频噪声带进电流环实际硬件很难跟踪。如果相位裕度不够优先减小 PID 的积分项必要时降低目标带宽而不是一味加大 D。4.3 发散、饱和、采样时间不一致仿真发散的原因需要分类排查不要一上来就怀疑求解器。现象常见原因检查点位移直线冲向限位控制方向反了或比例增益太小把ki取负逐步加大 P5 kHz 以上高频抖动微分项噪声放大或电流环太慢加微分滤波 N提高电流环带宽波形稳定但偏差很大积分增益不够或传感器零漂偏置加大 I加入参考前馈数值出现 NaN气隙被算到 0 或负值检查位移初值和饱和限幅有一点容易被忽略位置环 PID 模块里的N如果不设置默认值在高频时也会引入零点仿真会把这个零点当成真实微分放大。很多模型从 MATLAB 旧版本迁移过来后突然高频振荡就是因为 PID 模块的微分滤波参数变了。4.4 抗积分饱和磁轴承启动时位置误差很大位置环 PID 输出会很快顶到饱和。如果 PID 没有开抗饱和积分项会继续往上累计等位移回到中心时积分输出还挂在最大值附近转子会冲过中心再被拉回来形成一次低频大幅摆动。事实上有时候“发散”只是积分饱和后的一次过冲。在 Simulink 的 PID Controller 模块里把 Anti-windup method 设为 back-calculationAnti-windup gain可以先给 0.3。电流环 PI 同样要设输出饱和很多模型只在位置环出口设了饱和结果电流环积分器自己先饱和了问题依旧。两个环路都要限幅并且限幅值要匹配实际功放输出能力。5. 用 linearize 把磁轴承 Simulink 模型闭环整定做成批量工作流5.1 从非线性模型拿到线性化对象仿真能稳定运行之后不要只靠 Scope 波形判断性能。更好的做法是在模型中用 Simulink Control Design 的线性化输入输出点把整个闭环在平衡工作点处线性化然后读闭环阶跃响应和 Bode 图。这样可以客观地看出闭环带宽、相位裕度和负刚度抵消效果而不是靠肉眼数超调量。% 在位置环输入处打断线性化回路在 Plant 输出处取位移 io [linio(mag_bearing_close/Position PID, 1, input), ... linio(mag_bearing_close/Plant, 1, output)]; sys_lin linearize(mag_bearing_close, io); step(sys_lin); bode(sys_lin);linio里的模型路径要和实际 Simulink 模块名一致。线性化会在当前工作点自动求偏导不需要手动给状态初值。这一步比直接跑sim快得多也更适合做参数扫描每次改完 PID重新linearize一次就能看到闭环带宽往哪个方向移动。5.2 用工作区变量把 PID 参数和批量扫描串起来最后一个实用技巧是把所有 PID 参数写成工作区变量而不是在模块对话框里写死数字。这样后续批量扫描只改变量循环不需要反复打开 Simulink 界面。% 先在工作区定义参数 PID_P 20000; PID_I 5000; PID_D 35; % 模型里 PID 模块参数写成 PID_P、PID_I、PID_D set_param(mag_bearing_close/Position PID, ... P,PID_P, I,PID_I, D,PID_D); % 批量扫描比例增益 P_list [10000 20000 40000]; for k 1:length(P_list) PID_P P_list(k); simOut(k) sim(mag_bearing_close, StopTime, 0.2); end模型里 PID 模块的 P 参数直接填字符串PID_PSimulink 在仿真开始时会自动从工作区取值。这样批量扫描的结果都在simOut变量里可以一次性绘制不同比例增益下的位移曲线。如果后续要上硬件还可以把同一组 PID 参数通过set_param写进 Embedded Coder 生成代码前使用的模型配合外部模式先在真实功放上做一次小幅摆锤测试确认电流环方向后再让转子闭环悬浮。整个过程从线性化到代码生成共用一份参数避免在 UI 和脚本之间来回抄数字。本文还有配套的精品资源点击获取
网站建设高端定制企业官网