含时变刚度与齿侧间隙的六自由度齿轮弯扭耦合MATLAB模型
发布时间:2026/10/11 0:10:07 锦皓数字建站

1. 这个模型到底是什么能拿来做什么搞齿轮传动研究的人十有八九都会被振动噪声问题折磨过。齿轮箱一旦跑起来啮合冲击、齿侧间隙带来的敲击、轴系弯曲和扭转耦合到一起频谱上密密麻麻根本分不清到底哪一阶是主激励。前阵子有朋友问我手上拿到一份MATLAB六自由度齿轮弯扭耦合动力学代码考虑时变啮合刚度、齿侧间隙按集中质量法建模应该怎么看懂、怎么改参数、怎么用起来。我直接说这套框架基本就是齿轮动力学从入门到进阶最经典的练手工程值得花时间彻底吃透。这类模型在论文里见过很多但真正能跑起来、能解释清楚每个参数出处、能自己动手扩展的版本其实不多。这篇文章就把我实际使用和修改这套模型的经验从头到尾梳理一遍。你算是对齿轮箱振动特性、传动误差、齿面冲击、故障特征频率感兴趣的人这篇文章应该能帮你省掉大把翻文献和调bug的时间。1.1 齿轮箱振动问题为什么难搞齿轮箱里的振动源头不只是齿轮本身。轴会弯轮体会扭齿面啮合时刚度还在不停变化再加上齿侧必须有间隙——没间隙装配都装不进去——所以齿轮副在运转时经常处于一会儿碰得上、一会儿碰不上的状态。这种带间隙的非线性接触会让轴承座、箱体上测到的振动信号里混入大量高频成分和边带做状态监测的人最头疼的就是这个。把这个问题拆开核心就是两件事一是啮合副的弹性和间隙让接触状态时断时续二是弯扭自由度之间的耦合让激励可以沿着不同路径传递。所以单看转速或者单看扭矩都解释不了振动为什么长这样必须把这些因素放进一个统一的动力学模型里。这篇文章要聊的就是用集中质量法建一对啮合齿轮副的六自由度动力学方程并且把时变啮合刚度、齿侧间隙这两个最要命的非线性因素都放进去。跑出来的结果可以直接用来分析齿轮系统的稳态响应、冲击特征也可以为故障特征频率的预测提供仿真支撑。换齿轮参数、转速、负载都能快速看到趋势变化。1.2 六自由度到底“自由”在哪很多人第一次看到六自由度会疑惑齿轮不就是绕轴转吗哪来六个自由度实际上这是把每个齿轮的轮体看作一个刚体在平面内运动。主动轮和从动轮各有三个自由度x方向平动、y方向平动、绕自身轴线的转动。一对齿轮加起来正好六个所以叫六自由度弯扭耦合模型。x、y方向的平动代表轮心在轴承支撑下的横向弯曲振动绕轴线的转动代表轮体的扭转振动。齿轮啮合时齿面法向的啮合力同时作用在径向和切向上于是弯曲和扭转就通过啮合力耦合到一起。你只建一个纯扭转模型会把很多轴系弯曲带来的边带分量丢掉只做横向弯曲模型又没法体现转速波动和传动误差带来的扭转激励。六自由度模型正是把这两半拼起来是做分析和实验对照最常用的一档复杂度。1.3 这套代码适合谁来研究如果你正在做齿轮动力学相关的毕业设计、写小论文或者在搞故障诊断算法之前需要先建立一套可解释的仿真数据这套代码是很好的起点。需要的基础并不高懂一点振动理论清楚质量、刚度、阻尼怎么进方程会用MATLAB的ode求解器基本就能跑通。我接下来会把建模逻辑、参数选取、方程列写、代码框架、调参踩坑一条线讲清楚。拿到手之后不用把每行代码都背下来只要知道哪些地方是物理核心、哪些地方是数值技巧就能自由改造。2. 建模逻辑为什么这么简化参数到底怎么取2.1 集中质量法用离散弹簧阻尼逼近连续系统齿轮箱里的轮齿、轮体、轴、轴承本来是连续弹性体严格算要上有限元。但工程上做动力学趋势分析习惯了先把质量集中到轮心把轴和轴承的弹性等效成支撑刚度把啮合齿面的弹性等效成啮合刚度这就是集中质量法。这套方法的优点是直观、参数少、计算快。一对齿轮副跑一次时间历程普通电脑几秒钟就出结果有限元模型则要花上更多时间在处理网格和接触上。缺点也很明显它给不了应力分布给不了齿根局部变形只能给你系统层面的响应。所以你在代码里看到每个齿轮只有两个位移和一个转角没有节点应力别觉得它简陋这是方法论本身的选择。我实际用下来的体会是做参数趋势研究、故障特征谱分析集中质量法非常够用。真正需要看齿根弯应力、接触应力时再用有限元去校核那些关键工况。两者配合比单纯迷信任何一种都靠谱。2.2 时变啮合刚度不是拍脑袋齿轮啮合时同一时刻参与啮合的齿对数在变。直齿轮重合度如果在1到2之间就是单齿啮合和双齿啮合交替出现。双齿区分担载荷多整体刚度高单齿区刚度低。刚度随转角做周期性变化啮合频率由转速和齿数决定f_m z1 * n1 / 60这里z1是主动轮齿数n1是主动轮每分钟转速。比如z120、n11500 r/min啮合频率就是500Hz这个频率就是齿轮振动里最明显的主峰。在代码里时变啮合刚度可以简化成单双齿啮合切换的方波或者用傅里叶级数展开。方波更贴近物理谐波形式更容易做解析分析。实际常用值模数2mm、齿宽20mm的钢制直齿轮啮合刚度大致在0.5乘以10的8次方到2乘以10的8次方牛每米量级。你可以按这个量级去试先不用纠结精确值。2.3 齿侧间隙必须有的非线性源头没有齿侧间隙齿轮副会因为加工误差、热膨胀而卡死。但有了间隙齿面接触就不再连续。相对位移δ在正负b之间变化时啮合力为零轮齿脱啮一旦越过间隙边界才会发生单边或双边冲击。这个分段函数就是模型里非线性的根源。具体写出来就是f(δ) δ - b当 δ bf(δ) 0当 |δ| ≤ bf(δ) δ b当 δ -b这里的2b是总侧隙b是半侧隙。看文献时要先确认对方用的是半侧隙还是全侧隙否则同样的间隙值仿真结果会完全对不上。我常用的起始值是b0.05mm然后再扫参看它对冲击的影响。2.4 支撑刚度和阻尼怎么给支撑刚度主要是轴承和轴段的等效径向刚度。对于深沟球轴承配合短轴数量级一般在1乘以10的7次方到1乘以10的8次方牛每米。取太大会让系统固有频率偏高出现数值刚性取太小会让弯曲模态掉得很低显得不真实。阻尼用阻尼比来给钢制机械结构常用0.01到0.05。啮合阻尼可以按等效质量折算c_m 2ζ√(k_m · m_eq)m_eq是啮合线方向上的等效质量。注意别把阻尼设得过大否则系统很快收敛得没有振动特征仿真结果会平淡得像静力学那就看不到冲击了。3. 六自由度弯扭耦合方程怎么列3.1 自由度编号和啮合线位移用q [x1, y1, θ1, x2, y2, θ2]表示两个齿轮沿x、y的平动和转角。齿轮副的啮合线方向与两个齿轮的连心线夹角为压力角α。沿啮合线的相对位移是影响齿面接触状态的核心量δ (x1 - x2)cosα (y1 - y2)sinα r1θ1 r2θ2注意这是按外啮合直齿副、以某一固定啮合线方向写的转动项正负号要和坐标定义一致。放到自己的模型里第一件事就是把r1θ1和r2θ2这两项的符号校核清楚。如果转动的正方向定义反了结果直接发散或者完全不对。3.2 每个齿轮的运动方程怎么写系统里每个自由度都满足牛顿第二定律和转动方程。以主动轮为齿轮1、从动轮为齿轮2举例主动轮的x、y和转动方程是m1 ẍ1 c_bx1 ẋ1 k_bx1 x1 -F_m cosαm1 ÿ1 c_by1 ẏ1 k_by1 y1 -F_m sinαI1 θ̈1 T1 - r1 F_m从动轮受力方向相反m2 ẍ2 c_bx2 ẋ2 k_bx2 x2 F_m cosαm2 ÿ2 c_by2 ẏ2 k_by2 y2 F_m sinαI2 θ̈2 -T2 r2 F_mF_m是作用在齿面上的法向啮合力来自弹性变形和阻尼F_m k_m(t) · f(δ) c_m · δ̇T1是输入扭矩T2是负载扭矩。跑仿真时要让T1和T2满足平均传动比关系稳态时T2约等于T1乘以z2除以z1否则系统一直处于加速或减速状态稳态分析无从谈起。这个看似基础的平衡条件我见过不少人漏掉结果时域图上转速一直在爬升还以为是模型建错了。3.3 状态空间转换二阶方程改写成一组一阶方程MATLAB的ode族只能解一阶常微分方程组所以要把六个二阶方程转成十二个一阶方程。令状态向量X [x1, y1, θ1, x2, y2, θ2, ẋ1, ẏ1, θ̇1, ẋ2, ẏ2, θ̇2]前六个状态是位置后六个状态是速度。方程右边由上一节解析出来的加速度组成dX(1)/dt X(7)dX(7)/dt a_x1……这样写下去对应到代码里的索引就不容易乱。我自己在写的时候习惯在状态向量旁边放一个注释表标明每个分量的物理含义尤其是隔了几个星期再回来看代码能省不少事。3.4 重合度对刚度表达式的影响重合度决定单双齿啮合区间在啮合周期里的比例。重合度等于1.6时双齿啮合时间占百分之六十单齿啮合占百分之四十。写时变刚度函数时可以设置双齿区用k_max单齿区用k_mink_min大约是k_max的一半到七成具体和齿廓修形、有限元计算结果有关。如果追求平滑可以用傅里叶级数取前几阶比如k_m(t) k_mean Σ A_n cos(nω_m t φ_n)系数取法有很多种不必拘泥于某一种关键是周期和均值要准确。运行时要注意时变刚度突变会让ODE求解器在切换点产生误差最好设置合适的MaxStep。4. MATLAB实现从方程到可运行代码4.1 整体程序结构我习惯把程序拆成四块参数文件、系统方程函数、时变刚度函数、间隙函数再加上一个主脚本调用ode45。这样后续要扫参数、换工况只要改参数文件就行不用动方程主体。下面给一个可以直接抄的主脚本框架参数先用一组示例值% main_six_dof.m clear; clc; close all; p setup_params(); % 所有参数集中在结构体p里 tspan [0 0.2]; % 仿真时长单位秒 q0 zeros(12,1); % 初始位移和速度均为0或者给一个微小扰动 opts odeset(RelTol,1e-8,AbsTol,1e-10,MaxStep,0.0001); [t, q] ode45((t,q) six_dof_rhs(t,q,p), tspan, q0, opts); % 后处理 x1 q(:,1); y1 q(:,2); th1 q(:,3); x2 q(:,4); y2 q(:,5); th2 q(:,6);这个例子把MaxStep压到啮合周期的十分之一左右。比如啮合周期2msMaxStep取0.0001s这样不会让非光滑段被积分步长跨过去。RelTol尽量收紧到1e-8别用默认的1e-3否则间隙切换位置的误差会被放大。4.2 参数配置% setup_params.m function p setup_params() p.m 2e-3; % 模数单位m p.z1 20; % 主动轮齿数 p.z2 40; % 从动轮齿数 p.alpha 20*pi/180; % 压力角单位rad p.r1 p.m*p.z1/2; % 主动轮节圆半径 p.r2 p.m*p.z2/2; % 从动轮节圆半径 p.bw 0.02; % 齿宽单位m p.rho 7800; % 材料密度kg/m3 % 轮体质量按实心圆柱粗略估算工程上可用实际设计参数修正 p.m1 pi * (2*p.r1)^2 / 4 * p.bw * p.rho; p.m2 pi * (2*p.r2)^2 / 4 * p.bw * p.rho; p.I1 p.m1 * p.r1^2 / 2; p.I2 p.m2 * p.r2^2 / 2; % 支撑刚度和阻尼 p.kbx1 1e8; p.kby1 1e8; p.kbx2 1e8; p.kby2 1e8; p.cbx1 1000; p.cby1 1000; p.cbx2 1000; p.cby2 1000; % 啮合参数 p.km_mean 1e8; % 平均啮合刚度N/m p.epsilon 1.6; % 重合度 p.km_max 1.2e8; % 双齿区刚度 p.km_min 8e7; % 单齿区刚度 p.b 5e-5; % 半侧隙单位m p.omega1 2*pi*1500/60; % 主动轮转速rad/s p.T1 50; % 输入扭矩Nm p.T2 p.T1 * p.z2/p.z1; % 负载扭矩稳态平衡关系 % 啮合阻尼按等效质量折算 m_red p.m1 * p.m2 / (p.m1 p.m2); p.cm 2 * 0.02 * sqrt(p.km_mean * m_red); end量纲必须盯死质量用千克惯量用千克平方米刚度用牛每米阻尼用牛秒每米。转速统一换算成rad/s不要直接用r/min否则啮合频率算出来全是错的。4.3 时变啮合刚度函数方波形式最直观% mesh_stiffness.m function km mesh_stiffness(t, p) fm p.z1 * p.omega1 / (2*pi); % 啮合频率Hz Tm 1 / fm; % 啮合周期 ratio p.epsilon - 1; % 双齿啮合占比 tau mod(t, Tm) / Tm; if tau ratio km p.km_max; else km p.km_min; end end这只是最简单的处理方式。如果要做谐波平衡或频域分析建议改成傅里叶级数版本平均刚度和一阶谐波系数就够用。4.4 齿侧间隙函数% backlash_func.m function gap backlash_func(delta, b) if delta b gap delta - b; elseif delta -b gap delta b; else gap 0; end end这个函数在每个时间步都会被调用写成标量if判断没问题。如果你拿Python之类的语言移植注意这个函数要能被循环调用最好不要在函数内部写数组遍历。4.5 系统方程函数% six_dof_rhs.m function dXdt six_dof_rhs(t, X, p) x1 X(1); y1 X(2); th1 X(3); x2 X(4); y2 X(5); th2 X(6); vx1 X(7); vy1 X(8); w1 X(9); vx2 X(10); vy2 X(11); w2 X(12); % 啮合线相对位移和相对速度 delta (x1 - x2)*cos(p.alpha) (y1 - y2)*sin(p.alpha) p.r1*th1 p.r2*th2; delta_dot (vx1 - vx2)*cos(p.alpha) (vy1 - vy2)*sin(p.alpha) p.r1*w1 p.r2*w2; km mesh_stiffness(t, p); gap backlash_func(delta, p.b); Fm km * gap p.cm * delta_dot; % 主动轮加速度 ax1 (-Fm*cos(p.alpha) - p.kbx1*x1 - p.cbx1*vx1) / p.m1; ay1 (-Fm*sin(p.alpha) - p.kby1*y1 - p.cby1*vy1) / p.m1; aw1 (p.T1 - Fm*p.r1) / p.I1; % 从动轮加速度 ax2 (Fm*cos(p.alpha) - p.kbx2*x2 - p.cbx2*vx2) / p.m2; ay2 (Fm*sin(p.alpha) - p.kby2*y2 - p.cby2*vy2) / p.m2; aw2 (-p.T2 Fm*p.r2) / p.I2; dXdt [vx1; vy1; w1; vx2; vy2; w2; ax1; ay1; aw1; ax2; ay2; aw2]; end注意x2和y2的受力符号与齿轮1相反因为作用力和反作用力。齿面法向力沿啮合线分解到x和y时带上cos和sin。如果运行结果与预期差异很大先用这个函数里的表达式逐项检查。4.6 后处理光看时域不够还要会看频域跑完ode45之后别只盯着时域波形。我一般先看啮合线相对位移δ和啮合力F_m随时间的变化再取一段稳态数据做FFTfs 1/mean(diff(t)); L length(t); Y fft(th1); f (0:L-1)*fs/L; plot(f(1:L/2), abs(Y(1:L/2)));由于ode45是变步长的diff(t)不均匀严格说直接FFT不够严谨。工程上如果步长控制得很密近似当成均匀采样也能看个大概。想要严谨可以先用interp1把结果插值到固定采样频率再进FFT。这一步很多人偷懒我建议至少在写论文时把处理方式写清楚。5. 运行时最常踩的坑5.1 一跑就发散先查量纲再查符号最常出现的问题是位移直接飞掉。先别怀疑公式第一步检查相对位移δ的表达式里r1θ1和r2θ2的符号与坐标正方向是否自洽。把转角和位移设成几个简单状态手动算一下δ的正负看啮合力方向能不能形成反馈。第二步检查刚度量级啮合刚度和支撑刚度差了数量级时方程容易变成病态问题。如果公式确认没问题但仍然发散把MaxStep再调小检查初始条件是否给得太大。早期瞬态冲击太大时ode45会不断缩小步长最后发出积分不收敛的警告。5.2 用了ode45但计算特别慢齿轮系统的刚度大固有频率高最大稳定时间步长被限制得很小所以跑到0.2秒也可能要几分钟。这时候可以考虑换ode15s或ode23t。虽然不是严格刚性问题但隐式格式往往能省时间再不济就缩短仿真时长先跑0.05秒看趋势。另一个常用技巧是把方程无量纲化让位移、时间都变成无量纲量。这样质量矩阵变成单位量级数值条件改善不少。很多文献里的模型参数看起来特别规整实际上是先做了无量纲化读的时候要留意。5.3 间隙和刚度切换导致数值毛刺时变刚度在单双齿区切换间隙函数在边界点不可导求解器会在这些位置产生局部振荡。处理手段有三种一是把间隙函数做成光滑近似比如用tanh或多项式过渡二是把刚度的方波用一到两阶傅里叶截断替代三是设置事件函数在两个子区间分别积分。前两种简单实用第三种最严谨但工程量大。我个人的经验是先做平滑近似跑通流程后再恢复精确分段看结果差异是否在可接受范围。如果能接受就说明平滑处理没有改变主要动力学行为。5.4 时域曲线看不出有价值信息怎么办不要只画位移随时间的曲线。齿轮系统有多个模态时域信号是模态叠加的结果直接看图经常一片乱。我常用的几个图相对位移δ(t)判断齿轮是否进入脱啮区。啮合力F_m(t)看冲击幅值和冲击间隔。相图用某个位移做横轴、对应速度做纵轴判断是否出现周期分岔或混沌迹象。FFT频谱找啮合频率、倍频和边带。状态监视点也很重要记录δ进入间隙区的占比。如果大部分时间δ都在0附近说明系统处于脱啮再啮合的强非线性状态转速和负载会严重影响结果。5.5 常见问题速查表现象最可能原因处理办法位移直接发散坐标符号或刚度量级错误手动验证δ表达式检查N/m量级计算极慢步长过小或系统刚性换ode15s/ode23t无量纲化稳态变成直线阻尼太大或激励被平滑掉降低阻尼比检查刚度时变幅值出现大量毛刺间隙或刚度切换不光滑平滑近似收紧RelTol减小MaxStepFFT频率对不上采样时间不均匀或单位错了重采样核对r/min与rad/s换算6. 扩展方向和我自己的实操心得6.1 从直齿轮往斜齿轮、行星轮扩展直齿轮平面模型固然经典但实际工程里大量用斜齿轮。斜齿轮的啮合刚度波动比直齿平缓重合度更大而且会产生轴向分力模型要增加轴向自由度或做等效折算。行星轮系统更复杂多个啮合副的相位关系决定模态不是简单叠加就能办到的。不过这套六自由度框架的核心——啮合线位移、间隙分段、时变刚度——可以在每个啮合副上重复使用代码结构不需要推翻。如果你之后要做行星齿轮箱建议先把单级直齿轮这套代码吃透再去加星星轮和齿圈的啮合。行星轮多了几个啮合副方程数量变多但每个副的建模逻辑还是一样。6.2 拿来当故障诊断的训练数据做齿轮箱故障诊断时最缺的是带标签的故障样本。用这台仿真代码可以生成不同转速、负载、间隙、刚度衰退下的振动信号用做算法训练的模拟数据。比如把齿侧间隙调大就能模拟磨损后敲击加剧把时变刚度里的k_min调低就能模拟轮齿裂纹导致的刚度衰退。生成的信号再叠加噪声用来验证诊断算法的鲁棒性比纯实测数据好控制得多。我试过用这个方法做故障特征迁移研究先在仿真数据上训练再用少量实测数据微调效果比只用实测数据好不少。当然仿真和实测之间肯定有偏差仿真数据的价值主要在于覆盖不同工况和故障程度的趋势变化。6.3 我踩过的几个坑第一次跑这个模型时我直接用了默认的ode45容差结果间隙函数产生的冲击被积分器平滑掉FFT里根本找不到高频边带。后来把RelTol收到1e-9才看到应有的冲击谱。所以求解容差这件事不是越小越慢这么简单而是直接决定你能不能复现非线性现象。还有一次我把转速单位搞错了以为1500 r/min等于1500 rad/s结果啮合频率高出好几倍频谱怎么都看不懂。现在我的参数文件里统一写omega 2pin/60再在注释里标清单位免得隔一个月自己都忘了。另外如果拿仿真结果和实验数据对比不要只改齿轮参数还要把测试台支撑刚度、负载波动一起匹配进去否则仿真峰值频率对不上相关性会很差。模型简单但对应的边界条件不能简单。6.4 最后的建议这套六自由度弯扭耦合代码配上时变啮合刚度和齿侧间隙是研究齿轮动力学一个非常好的起点。我的建议是拿到代码后先做三件事第一把刚度设成常数、间隙设成零算系统固有频率看是否在合理范围第二只加时变刚度不加间隙看强迫响应第三再加间隙观察非线性特征。一步一步来你才能知道每个因素到底贡献了什么。一上来就把所有非线性全打开出了异常根本没法定位。我自己每次拿到别人代码的第一件事就是把注释重新写一遍把每个变量的单位和物理意义标出来。这看起来费时间实际上能逼着你从头想清楚建模逻辑后面改起来会顺手很多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。