第一次把四自由度磁悬浮轴承控制仿真的电流环、位置环、位移解析和磁轴承模型一起在Simulink里跑通,已经是凌晨一点多。屏幕上那条位移曲线最终稳定在零附近、来回抖动的幅度收敛到微米级时,我才真正松一口气。从搭第一个电磁铁模型到这一刻,中间踩过的坑、推翻的参数方案,比预想中多得多。
如果你正准备做基于Simulink的磁悬浮轴承控制仿真平台,或者你已经在路上但被电流环带宽、位置环阻尼、四自由度耦合这些问题卡住,这篇文章值得你花半小时读完。我会按我实际搭建的顺序,把磁轴承本体的建模过程、电流环与位置环的设计思路、位移传感器的Simulink实现方式,以及四自由度刚体耦合模型的搭建和调试经验全部讲清楚。适合刚开始接触磁悬浮的学生,也适合想把控制算法先放到仿真里验证的工程师。
1. 先搞清楚一件事:磁悬浮轴承仿真平台到底在仿真什么
1.1 一个径向磁轴承的控制回路长什么样
磁悬浮轴承控制系统看起来环节很多,但剥开之后就是一个典型的多闭环串级控制系统。以单个径向自由度为例,信号流是这样的:转子位置由位移传感器测到,经过标定和滤波后送入位置控制器(外环),位置控制器输出的是电流参考值;电流参考值和实际线圈电流比较后进入电流控制器(内环),电流控制器输出控制电压,电压驱动功率放大器,功放给电磁铁线圈供电,电磁铁产生吸力,吸力和位移刚度共同决定转子运动。这个链条里任意一个环节建模不准,仿真的悬浮效果都会失真。
我在搭建平台时给这个回路定义了几个关键分界点:电流环是纯电气环节,包含功率放大器、线圈R-L对象和电流采样;位置环是机械环节,包含转子动力学、电磁力与位移关系;位移解析则横跨两者,承担着“把传感器电压翻译成真实的转子位移”的任务。想明白这个分界,后面建模就不会糊成一团。
1.2 四自由度从哪来,五自由度又是什么概念
标题里的四自由度,严格来说是径向四自由度:一根转子通常需要两个径向磁轴承支撑,前后各一个,每个径向轴承提供X、Y两个方向的悬浮控制力,所以一共有四个径向控制通道。如果再算上轴向方向,完整的磁悬浮转子系统是五自由度。很多教材和论文习惯用“五自由度磁悬浮轴承”指代整机系统,单独提“四自由度”时,一般默认轴向自由度假定由机械限位或独立轴向轴承承担,控制系统只处理径向部分。
这个概念不是抠字眼。四自由度和五自由度在建模上的最大区别在于:轴向自由度通常可以和径向解耦,单独用一个轴向电磁铁和轴向位移传感器闭环就能搞定;但径向四个自由度之间是天然耦合的——前端轴承X方向施加一个力,不仅推着转子质心平移,还会产生绕Y轴的俯仰力矩,进而带动后端轴承的X位移变化。Simulink平台如果按四个完全独立的单自由度通道分别建模,仿真结果会和实物差很多。我后面的做法是:先用单自由度模型把控制参数调明白,再升级到四自由度刚体耦合模型,这样既不会一上来就被耦合问题绕晕,也不至于停留在过于简化的解耦模型上。
2. 磁轴承本体的Simulink建模:从电磁力公式到可运行模块
2.1 差动电磁铁的非线性力模型
磁悬浮轴承的径向电磁铁绝大多数是差动结构:以某一方向为例,转子两侧各有一个对置的电磁铁,静态时通入相同的偏置电流I0,动态时在一个线圈上叠加控制电流i,另一个线圈上减去i。这样做的直接好处是电磁力在小位移附近是近似线性的,控制增益不会被“吸力与电流平方成正比”的强非线性吃掉。
单侧电磁铁的吸力公式是经典磁路模型:
F = (1/2) * μ0 * A * N^2 * i^2 / s^2
其中μ0是真空磁导率,A是磁极有效截面积,N是线圈匝数,s是气隙长度。两侧差动后,净电磁力是:
F_net = (1/2) * μ0 * A * N^2 * [ (I0+i)^2 / (s0-x)^2 - (I0-i)^2 / (s0+x)^2 ]
这里s0是转子处于中心位置时的单侧气隙,x是转子偏离中心的位移。把I0看作偏置电流,i是控制电流。这个公式我建议直接进Simulink的MATLAB Function或者Interpreted MATLAB Function里实现,因为后续如果要考虑磁饱和、漏磁等非线性因素,直接在函数里扩展比模块连线方便得多。
2.2 工作点线性化:电流刚度与位移刚度
非线性模型虽然真实,但控制和参数整定还需要一个线性化版本。在x=0、i=0工作点处对上面公式做泰勒展开,保留一阶项就得到:
F = k_i * i + k_s * x
两个系数的表达式是:
k_i = 2 * μ0 * A * N^2 * I0 / s0^2 k_s = 2 * μ0 * A * N^2 * I0^2 / s0^3
我用一组仿真参数算过:μ0取4π×10^-7,A取8×10^-4 m²,N取200匝,I0取2A,s0取0.4mm。算出来k_i约等于1000 N/A,k_s约等于5×10^6 N/m。
这里必须强调一下k_s的物理含义。它在方程里是“力等于正比于位移的项”,但这个力方向是跟着位移走的——转子往哪边偏,电磁吸力就往哪边推,本质上是负刚度效应,会让系统开环发散。所以后文转子方程里我写的是mx'' = k_sx + k_i*i + F_d,k_s为正数,但它对应的是不稳定项。很多新手在这里会纠结正负号,直接记住“磁悬浮开环是不稳定的”这个物理事实就不会弄反。
2.3 转子动力学方程与Simulink积木式搭建
单自由度径向转子动力学方程非常简洁:
m * x'' = k_s * x + k_i * i + F_d
m是转子在该方向的等效平动质量,F_d是外部扰动力。这是一个二阶线性微分方程,Simulink里最直观的搭建方式是两个积分器串联:第一个积分器输入加速度x'',输出速度x';第二个积分器输入速度,输出位移x。然后把位移经过k_s增益反馈回输入端,把控制电流经过k_i增益加进去,扰动F_d直接加在最前面。这样做的好处是物理意义一目了然,后面接电流环、传感器模型时信号流向非常清晰。
如果你更喜欢紧凑的结构,也可以用状态空间模块:状态变量取[x; x'],状态矩阵A = [0 1; k_s/m 0],输入矩阵B = [0; k_i/m]。我平时把两种都搭过,调试初期用积分器连线版更方便观察中间变量,跑批量参数扫描时用状态空间版更快。
2.4 四自由度刚体耦合模型的处理方式
四自由度模型不能再画四个独立积分器了事。刚体转子有两个平动自由度(质心的X、Y位移)和两个转动自由度(绕X轴和绕Y轴的角位移)。以Y方向和俯仰X转动为例,我定义变量:
- y_c:转子质心在Y方向位移
- θ_x:转子绕X轴角位移(俯仰角)
- L1、L2:前后两个径向磁轴承到质心的距离
- J:转子绕X轴的转动惯量
- F_y1、F_y2:前后轴承在Y方向输出的电磁合力
刚体动力学方程为:
m * y_c'' = F_y1 + F_y2 J * θ_x'' = L1 * F_y1 - L2 * F_y2
轴承安装位置的位移与外部位移的关系是小角度近似:
y_b1 = y_c + L1 * θ_x y_b2 = y_c - L2 * θ_x
而每个轴承的电磁合力里包含控制力和负刚度项:F_y1 = k_i * i_1 + k_s * y_b1,F_y2同理。这里要特别小心:负刚度项耦合回来了,前后通道并不是独立的。我在Simulink里用状态空间模块承载这个刚体模型,状态变量取[y_c, v_c, θ_x, ω_x]四个,A、B矩阵用MATLAB脚本算好再填进去:
m = 4.2; J = 0.035; L1 = 0.12; L2 = 0.10; ks = 5e6; ki = 1000; A = [0 1 0 0; (ks*(1/m+1/m)) 0 (ks*(L1-L2)/m) 0; 0 0 0 1; (ks*(L1-L2)/J) 0 (ks*(L1^2+L2^2)/J) 0 ]; B = [0 0; ki/m ki/m; 0 0; ki*L1/J -ki*L2/J]; C = [1 0 L1 0; 1 0 -L2 0];这段脚本里A矩阵非对角位置的项就是耦合项,只要L1不等于L2,质心平动和俯仰转动一定会互相影响。仿真时把两个控制通道的电流i_1、i_2作为输入,C矩阵输出两个轴承位置位移,就完成了四自由度被控对象建模。X方向和绕Y轴的转动完全对称,把A、B矩阵扩展成8阶就能同时覆盖四个径向通道。
3. 电流环仿真:从R-L对象的PI设计到数值实现
3.1 为什么电流环必须放在最内层
在Simulink里搭磁悬浮控制平台,最容易犯的错是直接对电磁铁线圈用电压控制。线圈本质上是R-L串联对象,电流对电压的响应存在一阶惯性延迟:Ldi/dt + Ri = u。如果外环直接给出电压指令,电流响应滞后明显,位置环看到的等效对象会混入一个不可控的滞后环节,阻尼特性变得极差,悬浮起来要么抖要么根本拉不稳。
把电流环作为最内层闭环之后,位置环面对的就是一个近似“受控电流源”:给定电流参考,线圈电流快速跟随,带宽可以做得很高。这样外环设计可以专心对付转子的机械特性,不用操心电气延迟。换句话说,电流环是一堵墙,把电气动态和机械动态隔开了。
3.2 用零极点对消法整定电流环PI
电流环的被控对象传递函数是G_i(s) = 1/(L*s + R)。电流控制器我用PI,形式为C_i(s) = Kp_i + Ki_i/s。
零极点对消的思路很直接:让PI控制器的零点抵消对象在s=-R/L处的极点。设期望的电流环闭环时间常数为τ_i,那么PI参数按下式计算:
Kp_i = L / τ_i Ki_i = R / τ_i
这样设计出来的电流环闭环传递函数近似为一阶惯性1/(τ_i*s + 1)。τ_i越小带宽越高,但不能太小,否则采样频率跟不上。我的仿真平台用的是20kHz电流环采样率,τ_i取0.5ms,对应的电流环带宽约2kHz,是采样率的十分之一,留足了稳定性裕量。算出来Kp_i = 4.5mH / 0.5ms = 9 V/A,Ki_i = 1.8Ω / 0.5ms = 3600 V/(A·s)。这些参数直接用MATLAB算:
L = 4.5e-3; R = 1.8; tau_i = 5e-4; Kp_i = L / tau_i; Ki_i = R / tau_i;离散化时我用c2d函数把连续PI转成离散形式:PI控制器里的积分项换成离散积分式Euler法,采样时间Ts_i = 50μs。在Simulink里我习惯用离散PID Controller模块,设好P、I参数,采样时间设为Ts_i即可。
3.3 Simulink里的电流环实现与采样率问题
电流环模型里还有一个容易被忽略的环节——功率放大器。实验台上功放有延迟,通常等效为一个一阶惯性环节加上饱和限幅。我在仿真里用一个一阶惯性模块G_pa(s) = 1/(τ_pa*s + 1),τ_pa取50μs,后面接Saturation模块限幅到功放最大输出电压,比如±48V。这个饱和限幅非常重要,没有它,位置环给个大电流参考,仿真里的电压超出物理范围,看起来还“稳定”,换到实物立马失控。
采样率这里多说一句:电流环和位置环的采样率不必相同,DSP/FPGA实现里常见的是电流环20kHz、位置环10kHz。Simulink里设置不同采样时间的离散模块能直接模拟这种多速率控制。我测试过,如果把位置环也提到20kHz,仿真结果差别很小,但控制器代码生成后的执行时间会明显变长,所以仿真阶段就应该按实际硬件能跑到的采样率来搭,不然后面移植到嵌入式平台会踩坑。
4. 位置环与位移解析:让转子真正悬起来的关键环节
4.1 负位移刚度带来的开环不稳定性
转子开环时受力方程是mx'' = k_sx。机械上看,这相当于一个质量为m、刚度为-k_s的“倒摆”系统,特征根是s = ±sqrt(k_s/m)。用我前面的参数算,sqrt(5×10^6/4.2)约等于1090 rad/s,对应约174Hz——也就是说转子一旦偏离中心,会在不到毫秒级时间内加速撞向电磁铁。这就是磁悬浮系统“开环必挂”的数学根源,任何仿真平台如果没有闭环控制,位移曲线一定是发散的。
4.2 PD位置控制器的极点配置
位置环最常用的是PD控制,因为系统本身是二阶的,PD恰好能同时提供刚度和阻尼。控制器形式为:
i_ref = Kp_p * x + Kd_p * x'
这里i_ref是电流环的参考输入。把PD控制代入转子方程,闭环特征方程为:
ms^2 + k_iKd_ps + (k_iKp_p - k_s) = 0
与标准二阶系统s^2 + 2ζω_n*s + ω_n^2对比,可以反解出PD参数:
Kp_p = (mω_n^2 + k_s) / k_i Kd_p = 2ζω_nm / k_i
我设计时取ω_n = 900 rad/s,ζ = 0.7,代入m=4.2、k_s=5×10^6、k_i=1000:
Kp_p = (4.2900^2 + 5e6)/1000 = 8402 A/m Kd_p = 20.79004.2/1000 = 5.29 A·s/m
这个PD参数作为初值很可靠,但如果电流环不是理想一阶而存在延迟,实际阻尼会下降,最终调试时Kd_p要再往上加一点。仿真平台的好处就是你可以在几分钟内反复试,找到临界阻尼附近的最优值。
有一点必须说明:PD控制对静态负载扰动存在稳态误差。如果仿真里要模拟转子重力偏载之类的外部常值力,单纯PD是压不干净的。这种情况下我在位置环里加一个积分项I,组成PID,但积分项增益要小,并且必须做积分饱和限制,否则大扰动时积分堆积会让系统大幅超调。我的做法是积分输出限制在电流参考范围的±10%。
4.3 位移传感器建模:从电涡流探头到标定位移
位移解析这个词听起来玄乎,实际就是传感器电压和真实位移之间的换算关系。径向磁悬浮轴承常用电涡流位移传感器,线性工作区内输出电压近似与位移成正比。我仿真里用到的传感器灵敏度是10 mV/μm,也就是10000 V/m,量程±0.5mm,带宽5kHz。
Simulink传感器模型我用三个模块串联:Gain模块做灵敏度转换,把位移(米)变成电压(伏);Band-Limited White Noise模块叠加噪声,噪声方差按0.5μm等效位移来设;最后加一个一阶低通滤波器模拟传感器带宽限制。这里我踩过一个坑:一开始把传感器理想化,噪声为零、带宽无限,位置环PD参数调得又高又硬,结果一加噪声仿真就开始高频抖动。后来才意识到,传感器噪声会被PD里的微分项放大,所以仿真平台里传感器模型必须从一开始就带着噪声和带宽,否则调试出来的参数根本不能用。
位移解析逆过程在控制器侧实现:传感器电压除以灵敏度得到米,再经过一个高频滤波环节进入位置控制器。标定系数我放在init脚本里统一定义,方便不同传感器型号切换。
4.4 微分项的滤波处理与实现
PD控制里的微分项直接对位移差分或求导,在高采样率下会把传感器噪声放大得极其夸张。我实测过,不加滤波的Kd_p项,位移信号里1μm的噪声经过微分后反馈力矩噪声能大到让电磁铁电流抖动肉眼可见。
工程标准做法是用带滤波的微分代替纯微分:传递函数为Kd_ps/(τ_ds + 1),τ_d取1/(2π500)秒,相当于微分滤波截止频率500Hz。这样既保留中低频段的速度反馈阻尼,又不会把5kHz以上的传感器噪声放大。Simulink里实现很简单,用一阶传递函数模块TF(τ_d,1)串在Kd_p增益前面。这个细节直接影响仿真能否收敛到稳定的悬浮,强烈建议别图省事省略掉。
5. 四自由度联合仿真平台:架构、模块划分与调试顺序
5.1 整体控制架构与控制周期安排
综合前面几节,我的Simulink顶层模型按子系统划分为三大块:Control、Plant、Sensor。Control子系统内放置四个通道的位置环PD和电流环PI,分层排布:最外层四个位置控制器,输出四路电流参考;中间层四个电流控制器,输出四路电压指令;最末尾是功放限幅模型。Plant子系统就是扩展后的八阶刚体转子矩阵模型和电磁力计算。Sensor子系统负责从轴承位移计算传感器电压、加噪声滤波后再标定回位移。整个模型是三环嵌套加多速率,典型配置:位置环Ts_p=100μs、电流环Ts_i=50μs、连续被控对象用ode15s变步长求解。
在离散控制加连续被控对象的混合仿真中,代数环问题很容易冒出来。传感器输出经过位置环、电流环,再回到被控对象,如果这些模块之间没有离散延迟或Memory模块打破瞬间直接路径,Simulink会报代数环提示甚至仿真失败。我的做法是:所有控制器都用显式离散模块,且在反馈路径上放置一个Unit Delay模块来模拟真实的“采样后计算、下一周期输出”的数字控制时序。这既是解决代数环的手段,也顺便模拟了数字控制的计算延迟。
5.2 Simulink模型的分层结构与参数脚本
模型层级清晰了之后,参数管理就成了效率的关键。所有物理参数我都放在一个init_params.m脚本里,每次仿真前先运行这个脚本,再把参数传到模型工作区。这样做的好处是:换一组转子参数、换一个传感器规格,只需要改脚本,不用在Simulink图形界面里翻模块属性。
脚本里除了前面算过的那些常数,还会预计算控制器的离散化参数,我在文中已经展示了一部分。另外我会把期望闭环极点也放在脚本顶部注释里,这样后期调整时有据可查。分层结构还有一层考虑:控制器算法可以随时替换,比如把位置环的PD换成LQR或者鲁棒控制器,只需要替换Control子系统内部模块,Plant和Sensor完全不动。
5.3 单自由度调通再扩展四自由度的调试路径
我强烈建议不要一上来就跑四自由度全通道联合仿真,耦合项一旦发散你根本分不清是哪个通道的参数问题。我的调试路径是分三步走的:
第一步,把Plant子系统切换成单一径向自由度的二阶模型,位置环和电流环只保留一个通道,参考位移设一个1mm阶跃,观察位移跟踪曲线。确认单自由度PD参数能让转子在约10ms内回到中心、超调量在10%以内、无持续振荡。
第二步,把Plant换成四自由度刚体模型,但四个通道暂时用同一套PD参数,不加解耦矩阵。这一步的观察点是:给前端X方向加一个脉冲扰动,后端X方向位移会不会被激起明显的耦合响应;如果耦合振荡幅度超过主通道的30%,说明需要对Kd_p做增益修正或者用交叉解耦补偿。
第三步,把位置环参考信号设成中心零位移,加入一个模拟负载扰动的力信号,看系统能否扛住并最终收敛。这一步是评估平台“全方位”能力的关键:既要看静态抗扰,也要记录瞬态恢复时间。
调试过程中的现象和参数关系我整理成了这个表格,照着查能省不少时间:
| 仿真现象 | 根因方向 | 调整手段 |
|---|---|---|
| 悬浮后持续高频抖动 | 微分增益过大或传感器噪声过强 | 减小Kd_p、降低微分滤波截止频率 |
| 阶跃响应超调大、回中心缓慢 | 阻尼不足 | 增大Kd_p,或提高位置环采样率 |
| 静态下转子偏向一侧 | 常值扰动力或传感器零漂 | 增加积分项、校准传感器偏置 |
| 大位移处电流饱和失稳 | 功放限幅限制或PD输出过大 | 检查Saturation限幅、降低参考阶跃幅度 |
| 四通道相互“打架” | 耦合模型参数错误或L1/L2取值不当 | 核对A矩阵耦合项、检查C矩阵位移换算 |
6. 从仿真到实物:那些Simulink里跑得通、实验台却失败的坑
6.1 功放饱和与电流限幅
仿真里最容易“自欺欺人”的地方就是功放和电流的限幅。电磁铁线圈电流终归是有限的,功放输出也是有电压上限的。如果仿真中不把这些限制加进去,位置环在大误差时给出的电流参考可能高达几十安培,模型依然线性稳定;但实物中功放早就饱和了,电流跟踪不上参考值,位置环看到的对象特性突变,系统立刻失稳。所以我在仿真平台里对每一路电流参考和功放输出电压都加了Saturation模块,数值按实际功放规格设定。这个限制加上去之后,很多看上去漂亮的控制器参数会现出原形——这一步非常值得花时间做。
6.2 数字控制一拍延迟的影响
Simulink纯连续模型里,控制器输出和被控对象输入是瞬时同步的,这跟实物“采样、计算、更新PWM占空比”一拍一拍执行的流程完全不同。我在仿真平台里刻意在每个控制通道反馈路径上放了一个Unit Delay模块,模拟一个采样周期50μs的计算延迟。加了这一拍延迟之后,实测位置环的临界阻尼Kd_p明显要调大,否则系统相位裕度不足,会出现缓慢发散或边界振荡。
如果你做的是控制器代码自动生成,建议在仿真阶段就用离散控制器加Unit Delay的配置,这样生成的C代码移植到DSP或FPGA后,行为和仿真基本一致。我见过不少同学仿真用连续PID,调试得特别好,一上实验台就振,改动模型为离散结构后,问题立刻消失。
6.3 传感器噪声与量化误差的代价
仿真平台里噪声加不加,结果可能是两个极端。不加噪声,系统可以在很高的PD增益下保持“完美”稳定;加噪声后,微分项放大的噪声会让电流指令抖动,电磁铁发热,严重时控制器饱和。我把噪声模型固定下来之后,再回头审视PD参数,发现原来那些“更优”的参数其实都不满足工程可实现性。量化误差也是类似的道理:如果传感器信号经过AD转换,至少要有12位量化,对应到3V量程,量化台阶约0.7mV。仿真里我把这个量化效果也加进去了,用Quantizer模块,量化步长设成传感器量程除以2^12,这样控制器看到的信号和实物处在一个量级。
6.4 参数不确定性与鲁棒性验证
仿真平台最大的价值是你能随便改变模型参数来验证控制器的鲁棒性。我把k_s和k_i做±20%的摄动,再叠加转子质量变化10%,发现原来按标称值设计的PD参数在某些组合下已经出现弱阻尼振荡。这时候你就会理解为什么实物调试要留足相位裕度,以及为什么很多控制器最终要加上自适应或者鲁棒补偿环节。仿真阶段把这些边界摸清,比在实验台上反复炸机试错要划算得多。
最后分享一个我个人的习惯:每次仿真跑通一组参数后,我会把位移曲线、电流曲线、控制电压曲线全部截图存档,旁边注释当时的参数组合。过两周再回头看,这些记录比任何论文都更有参考价值。磁悬浮控制仿真平台的搭建不是一次性的活,它应该像一台可重复使用的试验台,参数改起来方便、模型层级清晰、边界条件可控,这样的平台才真正配得上“全方位”三个字。