硅微机械陀螺自激振荡驱动Simulink仿真建模与代码生成实战
简介本资源面向自动化、电子信息、通信工程等专业的在校学生与科研人员围绕硅微机械陀螺的系统结构建模与自激振荡驱动闭环控制提供一套基于Simulink的完整仿真方案可用于毕业设计、课程设计或相关课题的初期立项演示。压缩包共42个文件约87.48MB包含13个slx仿真模型、15个pdf参考文献、2个m脚本及txt说明、图片、流程图等覆盖结构等效建模、驱动闭环、锁相环控制、PID参数整定与检测模式仿真等模块。资源中附有结构模型、开闭环驱动与检测模型、低通滤波传递函数分析等可运行工程并配有试凑法PID设计准则、Z域转差分方程、移相前后对比等图示便于理解控制环路设计细节与调试思路。目前已有49人学习适合在现有模型基础上修改扩展完成静电补偿、数字化信号处理等进阶功能验证。1. 硅微机械陀螺的Simulink仿真从系统结构到自激振荡驱动一套能跑通的建模路径硅微机械陀螺MEMS gyroscope的驱动模态控制是很多做惯性传感器仿真的工程师绕不开的一道坎。你手里可能已经有了一个陀螺的力学参数表也知道要让它振动起来得靠自激振荡驱动但打开 Simulink 之后发现——驱动环路怎么搭、相位条件怎么满足、幅度怎么稳、系统结构里哪些模块该放哪些该省全是一团乱麻。这篇笔记就是冲着这个问题来的把硅微机械陀螺的系统结构拆清楚再把自激振荡驱动回路的 Simulink 仿真一步步搭出来让你能从零建出一个能起振、能稳幅、能看波形的模型。适合正在做 MEMS 惯性器件仿真、控制系统建模、或者课程项目需要交付完整 Simulink 文档的人。不聊虚的直接上结构、参数和踩坑记录。2. 硅微机械陀螺系统结构拆解驱动模态、检测模态与接口电路怎么分2.1 从力学方程到 Simulink 模块的映射关系硅微机械陀螺的核心是一个二自由度振动系统。驱动模态和检测模态各有一个二阶微分方程形式都是质量-弹簧-阻尼那一套。驱动模态的方程通常写成m·ẍ c·ẋ k·x F_e其中 m 是等效质量c 是阻尼系数k 是刚度F_e 是静电力。检测模态的方程类似但激励源是科里奥利力大小正比于驱动模态的速度和输入角速度。在 Simulink 里这个二阶方程有两种搭法。第一种是用两个积分器串联把 ẍ 积分成 ẋ 再积分成 x反馈路径上放 c/m 和 k/m 的增益。第二种是直接用 Transfer Fcn 模块传递函数写成 1/(m s² c s k)。我一般用第一种因为中间变量 ẋ 在自激振荡驱动里要单独取出来做相位判断用积分器链更方便。系统结构上硅微机械陀螺的 Simulink 模型通常分四块驱动模态力学模型、检测模态力学模型、驱动控制环路、信号调理与解调。驱动控制环路就是自激振荡驱动的核心后面单独讲。检测模态这边科里奥利力作为输入输出是检测模态的位移再经过电容检测接口变成电压信号。2.2 驱动模态与检测模态的参数差异及建模注意点驱动模态和检测模态虽然方程形式一样但参数差别很大。驱动模态的品质因数 Q 通常很高几百到几万都有意味着阻尼 c 非常小。检测模态的 Q 值一般低一些因为要保证带宽。这两个模态的固有频率在理想情况下是匹配的但加工误差会导致几赫兹到几十赫兹的失配。在 Simulink 里建模时驱动模态的阻尼系数 c 如果直接按 Q 值反算数值会很小积分器容易因为数值精度问题出现漂移。我的做法是把 c/m 和 k/m 作为增益参数用 MATLAB 脚本先算好再赋给增益模块而不是在 Simulink 里现场算。另外驱动模态的位移幅度通常在微米量级检测模态的位移在纳米量级两者相差三个数量级。如果放在同一个 Scope 里看检测信号会被压成一条直线。解决办法是给检测模态单独配一个增益可调的 Scope或者用 To Workspace 导出后在 MATLAB 里画图。还有一个容易翻车的地方科里奥利力的符号。科里奥利力 F_c 2mΩ×ẋ方向与驱动速度方向垂直。在 Simulink 里搭的时候如果驱动模态的速度输出接乘法器时符号搞反了检测模态的响应会反相。这个错误在时域波形上不明显但到解调环节会直接导致输出角速度符号错误。我一般会在乘法器后面加一个手动开关仿真时先给一个已知正角速度看解调输出是不是正的确认后再跑正式数据。2.3 接口电路在 Simulink 中的等效建模方式硅微机械陀螺的接口电路主要是电容-电压转换。驱动模态的位移变化引起驱动电容变化检测模态的位移变化引起检测电容变化。在 Simulink 里电容变化可以等效成一个增益环节把位移乘以灵敏度系数得到电容变化量再经过一个载波调制和解调环节变成电压。常见做法是驱动模态的位移先经过一个增益单位是 F/m得到电容变化再乘以载波幅值然后通过一个乘法器实现调制。解调部分用同样的载波乘以调制信号再过一个低通滤波器。这个低通滤波器的截止频率要低于载波频率但高于驱动模态的工作频率。如果截止频率设高了载波残留会混进控制环路导致自激振荡驱动出现高频抖动。我一般把截止频率设在载波频率的十分之一左右同时保证它至少是驱动频率的五倍以上。接口电路的建模精度直接影响自激振荡驱动的起振判断。如果电容-电压转换增益设得太小驱动环路的环路增益不够起振会很慢甚至起不来。如果设得太大幅度控制还没起作用就饱和了。这个增益需要和后面的驱动控制环路增益联合调试不能单独拍脑袋定。3. 自激振荡驱动回路搭建从相位条件到幅度稳定的 Simulink 实现3.1 自激振荡的相位与增益条件在 Simulink 里怎么验证自激振荡驱动的基本原理是把驱动模态的位移信号取出来经过放大和移相再反馈回去作为驱动力。要维持稳定振荡必须满足两个条件环路增益大于等于 1环路相位是 360 度的整数倍。在 Simulink 里这两个条件不是靠理论推导保证的而是靠仿真跑出来的。我的做法是先把环路断开用 Simulink 的 Linear Analysis 工具或者手动注入扫频信号测出驱动模态从驱动力到位移的幅频和相频特性。驱动模态在谐振频率处相位滞后 90 度所以反馈回路需要再提供 90 度超前总相位才能凑够 360 度。这个 90 度超前通常用一个微分环节或者高通滤波器来实现。在 Simulink 里搭的时候微分环节不能用理想的 Derivative 模块因为理想微分对高频噪声的增益无穷大仿真步长稍微大一点就发散。我一般用 Transfer Fcn 模块搭一个带低通滤波的微分器传递函数写成 s/(τs1)τ 取驱动频率倒数的十分之一左右。这样在驱动频率处相位接近 90 度高频增益被压下来。环路增益的验证方法是在反馈回路上串一个增益模块从 0 开始慢慢加大观察驱动模态的位移幅度。如果增益加到某个值后位移开始等幅振荡说明环路增益刚好满足起振条件。如果加到很大还不起振说明相位条件没满足得回去检查移相环节。如果一加就发散说明幅度控制没起作用得先调幅度控制回路。3.2 驱动模态自激回路的 Simulink 模型搭建步骤下面是一个最小可跑通的自激振荡驱动回路搭建步骤。假设驱动模态的力学模型已经搭好输出是位移 x 和速度 ẋ。第一步从位移 x 取信号经过一个带通滤波器滤掉直流和高频噪声。带通滤波器的中心频率设成驱动模态的固有频率带宽设成固有频率的百分之一到百分之五。在 Simulink 里用 Analog Filter Design 模块或者自己用 Transfer Fcn 搭二阶带通。第二步把滤波后的信号送入移相环节。移相环节用前面说的带低通滤波的微分器传递函数 s/(τs1)。τ 的取值需要根据驱动频率微调目标是让整个环路的相位在驱动频率处刚好是 360 度。第三步移相后的信号送入幅度控制环节。幅度控制的核心是一个可变增益增益值由输出幅度和参考幅度的误差决定。在 Simulink 里可以用 PID Controller 模块输入是幅度误差输出是增益控制信号再通过一个 Product 模块乘到反馈信号上。第四步幅度控制后的信号经过一个增益模块调整到合适的驱动力大小然后反馈回驱动模态的力输入端。第五步给位移 x 一个很小的初始扰动比如在仿真开始时给积分器一个非零初始条件或者加一个短脉冲。然后运行仿真观察位移波形是否从微小扰动增长到稳定幅度。% 硅微机械陀螺驱动模态参数初始化脚本 % 这些参数在 Simulink 模型运行前先执行 m 1e-8; % 等效质量单位 kg f0 8000; % 驱动模态固有频率单位 Hz Q 5000; % 驱动模态品质因数 k m * (2*pi*f0)^2; % 刚度单位 N/m c m * 2*pi*f0 / Q; % 阻尼系数单位 N·s/m % 带通滤波器参数 BW f0 * 0.02; % 带宽取固有频率的 2% % 移相环节参数 tau 1 / (2*pi*f0) / 5; % 低通时间常数取驱动周期倒数的五分之一 % 幅度控制参考值 A_ref 1e-6; % 参考幅度单位 m取 1 微米 % 仿真参数 T_sim 0.1; % 仿真时长单位 s dt 1 / (f0 * 50); % 仿真步长取驱动频率的 50 倍以上这段脚本的作用是把力学参数、滤波器参数和仿真参数都算好放在工作区里Simulink 模型直接引用变量名就行。参数说明m 和 k 决定固有频率Q 决定阻尼大小tau 决定移相环节的相位特性A_ref 是幅度控制的设定值。仿真步长 dt 必须远小于驱动周期否则积分器精度不够起振过程会失真。3.3 幅度控制环路PI 参数怎么设、限幅放哪里幅度控制环路是自激振荡驱动能稳定工作的关键。没有它位移要么衰减到零要么发散到饱和。在 Simulink 里幅度控制通常用一个 PI 控制器实现输入是位移幅度的有效值或峰值与参考值的误差输出是反馈增益。幅度检测的方法有两种。一种是取位移信号的绝对值再过一个低通滤波器得到近似平均值。另一种是用峰值检测在每个周期内取最大值。我一般用第一种因为 Simulink 里搭起来简单低通滤波器的截止频率设在驱动频率的十分之一以下就行。PI 参数怎么设比例增益 P 决定幅度控制的响应速度积分增益 I 决定稳态误差。P 太大会导致幅度振荡P 太小则起振后幅度上升很慢。我的经验是先把 I 设成零慢慢加大 P直到幅度开始出现轻微振荡然后把 P 退回一半再加 I。I 的值一般取 P 的十分之一到五分之一具体看仿真步长和驱动频率。限幅必须加。幅度控制输出的增益信号要经过一个 Saturation 模块上限设成正常起振所需增益的两到三倍下限设成零。如果不加限幅起振瞬间误差很大PI 输出会冲到很高的值导致驱动力过大位移一下子冲到非线性区仿真直接崩掉。这个坑我踩过不止一次后来养成习惯凡是 PI 控制器输出必加限幅。还有一个细节幅度控制的 PI 控制器输出的是增益这个增益要乘到反馈信号上。乘法器的两个输入一个是移相后的位移信号一个是 PI 输出。如果 PI 输出是负值反馈信号会反相自激振荡条件被破坏。所以 Saturation 的下限必须设成零或者一个很小的正数。4. 仿真参数设置与波形验证步长、求解器、初始条件怎么调4.1 求解器选择与步长对起振过程的影响Simulink 的求解器选择直接影响自激振荡驱动的仿真结果。驱动模态的固有频率在几千赫兹到几十千赫兹仿真时长通常要跑几十毫秒才能看到稳定振荡。如果步长太大积分器误差累积起振过程会失真甚至出现虚假的稳定幅度。我一般用 ode4Runge-Kutta固定步长求解器步长取驱动频率的 50 到 100 倍。比如驱动频率 8 kHz步长取 1/(8000*50) 2.5 微秒。这个步长下一个驱动周期有 50 个采样点波形足够光滑积分误差也可以接受。如果用变步长求解器比如 ode45起振瞬间的快速变化会导致步长自动缩小仿真速度很慢而且幅度控制的 PI 环节在变步长下容易产生数值抖动。固定步长还有一个好处可以开 Simulink 的外部模式把模型编译后跑在目标硬件上做半实物仿真。虽然这篇笔记不展开硬件在环但步长设置和求解器选择要提前考虑这个需求。4.2 初始条件与激励方式怎么让振荡可靠地起来自激振荡驱动需要初始扰动才能起振。在 Simulink 里给初始条件有三种方式。第一种是给积分器设非零初始值比如位移积分器的初始值设成 1 纳米。第二种是在仿真开始时加一个短脉冲宽度小于驱动周期的十分之一幅度足够大。第三种是利用仿真开始瞬间的数值噪声但这种方式不可靠有时候起不来。我一般用第一种给位移积分器一个很小的初始值。这个值不能太大否则起振瞬间幅度控制还没反应过来位移就冲到非线性区了。也不能太小否则要等很久才能看到明显振荡。1 纳米到 10 纳米之间比较合适具体看驱动模态的等效质量和刚度。如果仿真跑了一段时间位移还是衰减的说明环路增益不够。这时候先检查反馈回路的增益模块逐步加大直到位移开始增长。如果位移一上来就发散说明幅度控制没起作用检查 PI 控制器的输出限幅和乘法器连接。4.3 用 Scope 和 To Workspace 验证驱动模态波形验证自激振荡驱动是否正常工作主要看三个波形驱动模态位移、驱动模态速度、幅度控制输出。位移波形应该是等幅振荡频率等于驱动模态固有频率。速度波形和位移波形相位差 90 度。幅度控制输出在起振阶段上升稳定后保持恒定。在 Simulink 里Scope 模块适合实时观察但数据不好导出。我一般用 To Workspace 模块把数据存成结构体仿真结束后在 MATLAB 里画图分析。To Workspace 的保存格式选 Array 或者 Structure with time采样点数设成跟仿真步长一致。% 仿真结束后在 MATLAB 里画图验证 % 假设 To Workspace 保存的变量名是 x_drive, v_drive, gain_ctrl figure; subplot(3,1,1); plot(x_drive.time, x_drive.signals.values); xlabel(时间 (s)); ylabel(驱动位移 (m)); title(驱动模态位移波形); subplot(3,1,2); plot(v_drive.time, v_drive.signals.values); xlabel(时间 (s)); ylabel(驱动速度 (m/s)); title(驱动模态速度波形); subplot(3,1,3); plot(gain_ctrl.time, gain_ctrl.signals.values); xlabel(时间 (s)); ylabel(幅度控制输出); title(幅度控制信号);这段代码把三个关键波形画在一起方便对照。位移波形看是否等幅速度波形看相位关系幅度控制信号看是否稳定。如果幅度控制信号一直在上升说明 PI 参数没调好或者参考幅度设得太高。如果位移波形有拍频现象说明驱动频率和环路相位不匹配需要微调移相环节的 tau 值。5. 避坑与排查自激振荡驱动仿真中常见的五个翻车点5.1 起振失败环路增益够但相位不对现象仿真跑了几十毫秒位移一直衰减到零加大反馈增益也没用。原因环路相位不满足 360 度条件。驱动模态在谐振频率处相位滞后 90 度如果移相环节提供的超前不够总相位差就不是 360 度反馈信号和位移信号不同相能量无法注入。解决用 Simulink 的 Linear Analysis 工具测环路频率响应看驱动频率处的相位是多少。如果相位差超过 360 度减小移相环节的 tau 值让超前相位增加。如果相位差不足 360 度加大 tau 值。微调之后重新跑仿真观察位移是否开始增长。5.2 幅度控制振荡PI 参数太激进现象位移幅度稳定后一直在上下波动幅度控制信号也在振荡。原因PI 控制器的比例增益太大或者积分增益太大导致幅度控制回路带宽接近驱动频率产生耦合振荡。解决先把积分增益设成零减小比例增益直到幅度波动消失。然后慢慢加积分增益每次加一点观察幅度是否还稳定。如果加了积分增益后波动又出现说明积分增益也大了退回上一个值。一般比例增益在 0.1 到 1 之间积分增益在 0.01 到 0.1 之间比较合适。5.3 仿真发散理想微分模块惹的祸现象仿真开始后位移迅速增大几毫秒内就冲到 10 的几十次方然后 Simulink 报错。原因移相环节用了理想 Derivative 模块高频增益无穷大数值噪声被无限放大积分器饱和。解决把理想 Derivative 换成带低通滤波的微分器传递函数 s/(τs1)。τ 取驱动周期倒数的五分之一到十分之一。如果已经用了带滤波的微分器还是发散检查低通滤波的截止频率是不是太高了把 τ 加大。5.4 检测模态无响应科里奥利力符号或增益搞错现象驱动模态正常振荡但检测模态位移一直是零或者非常小。原因科里奥利力的符号搞反了或者检测模态的力增益设得太小。科里奥利力 F_c 2mΩ×ẋ如果驱动速度 ẋ 的符号和角速度 Ω 的符号乘出来是负的检测模态的响应会反相但幅度不应该为零。如果幅度为零多半是增益设错了。解决先检查乘法器的两个输入是不是驱动速度和角速度。然后给一个已知的正角速度看检测模态位移的符号。如果符号反了在乘法器后面加一个负增益。如果幅度太小加大检测模态的力增益或者检查检测模态的刚度是不是设得太大了。5.5 波形有高频毛刺载波残留或步长太大现象驱动位移波形上叠加了高频振荡频率远高于驱动频率。原因接口电路的解调低通滤波器截止频率设得太高载波残留混进了控制环路。或者仿真步长太大积分器在每个步长内引入了数值噪声。解决先检查解调低通滤波器的截止频率确保它低于载波频率的十分之一同时高于驱动频率的五倍。如果截止频率没问题减小仿真步长从驱动频率的 50 倍加到 100 倍。如果毛刺还在检查带通滤波器的带宽是不是太宽了把带宽收窄到驱动频率的百分之一。6. 从仿真到代码生成把自激振荡驱动模型变成可部署的 C 代码6.1 用 Embedded Coder 生成驱动控制代码的配置要点Simulink 模型跑通之后下一步很多人会想把它变成 C 代码烧到 DSP 或者 FPGA 里做实物验证。这时候 Embedded Coder 就派上用场了。但自激振荡驱动模型里有连续时间的积分器和传递函数直接生成代码会变成离散化的差分方程离散化方法选不好代码跑出来的波形和仿真对不上。我一般先把连续模型转成离散模型。驱动模态的积分器用 Forward Euler 或者 Tustin 离散化步长跟仿真步长一致。带通滤波器和移相环节的传递函数用 c2d 函数转成离散传递函数离散化方法选 Tustin因为它在驱动频率处的相位特性跟连续域最接近。PI 控制器本来就是离散的不用转。配置 Embedded Coder 的时候系统目标文件选 ert.tlc代码风格选 C99浮点类型选 single 还是 double 看目标硬件的 FPU 支持。如果 DSP 没有双精度 FPU用 single 能快很多但要注意参数精度。驱动模态的位移是微米量级single 的精度大概在小数点后六七位够用。但幅度控制的积分项如果累积误差大可能会漂移这时候积分项可以用 double。6.2 定点化与浮点化的取舍什么时候该用 fixed-point如果目标硬件没有 FPU或者对功耗和面积要求很严就得考虑定点化。Simulink 里有 Fixed-Point Designer可以把浮点模型转成定点模型。但自激振荡驱动对相位很敏感定点化之后相位误差会变大起振条件可能不满足。我的经验是驱动模态的力学模型可以用定点因为积分器的动态范围可控。但移相环节和幅度控制的 PI 环节最好用浮点或者至少用高精度的定点比如 32 位 Q15。如果非要用定点先在 Simulink 里做定点仿真看起振过程和稳定幅度跟浮点差多少。如果差太多就得加宽位宽或者改离散化方法。还有一个折中方案用 Simulink 的变步长求解器跑浮点仿真验证算法正确性然后用 Embedded Coder 生成浮点代码在 DSP 上跑。如果 DSP 没有 FPU用软件浮点库速度慢但精度够。等算法验证没问题了再考虑定点化优化。6.3 代码生成后的验证用 Processor-in-the-Loop 对比仿真波形代码生成之后不能直接烧进去就完事得验证生成的代码和 Simulink 仿真结果一致。Simulink 支持 Processor-in-the-LoopPIL仿真把生成的代码跑在目标硬件或者目标硬件的仿真器上跟 Simulink 模型做对比。PIL 仿真的配置步骤先把模型配置成 PIL 模式指定目标硬件的通信接口串口或者 JTAG。然后运行仿真Simulink 会把模型的输入送给目标硬件目标硬件跑生成的代码把输出送回来跟 Simulink 的输出对比。如果波形一致说明代码生成没问题。如果波形有偏差检查离散化方法、数据类型和步长设置。我一般会在 PIL 仿真里重点看三个量驱动位移的幅度、驱动频率、幅度控制信号的稳态值。这三个量对上了基本就能确认代码可用。如果幅度对不上多半是离散化方法或者数据类型的问题。如果频率对不上检查步长和时钟配置。如果幅度控制信号对不上检查 PI 参数在代码里是不是被截断了。最后说一个我自己的习惯每次改完 Simulink 模型不管改动多小都先跑一遍最短的仿真看起振过程有没有异常。因为自激振荡驱动是个闭环系统牵一发动全身改一个参数可能起振条件就不满足了。这个习惯帮我省了很多次重新调参的时间。希望帮到你。本文还有配套的精品资源点击获取