资讯动态

基于势能法的含齿根裂纹直齿轮时变啮合刚度MATLAB计算

发布时间:2026/9/10 1:33:00 来源:尧图企业网站定制
做齿轮动力学或者故障诊断的朋友大概率都绕不开时变啮合刚度TVMS这个参数。很多论文里都会画一条波浪形的刚度曲线说这是齿轮副的“内部激励源”。但真到自己动手算的时候尤其是想把齿根裂纹这种局部故障也塞进模型里就会发现好多细节没写清楚。我之前就是照着马辉、罗阳等文献的思路用MATLAB写了一个考虑齿根裂纹的直齿轮时变啮合刚度计算程序中间踩了不少坑也反复对比过有限元结果。这篇博文就把整个计算思路、代码架构、裂纹建模逻辑以及那些文献里不太会写明的实操细节系统整理出来。这套方法的核心是势能法思路是把轮齿当成变截面悬臂梁把啮合力引起的能量分成弯曲、剪切、轴向压缩、赫兹接触和基体弹性变形几个部分再通过能量守恒反推刚度。齿根裂纹的影响最终落到截面积和截面惯性矩的折减上。整个过程不涉及任何商业软件用MATLAB矩阵化编程完全可以跑非常适合做参数敏感性分析比如裂纹深度从10%到80%逐级变化时刚度曲线到底怎么变、振动响应会有什么趋势这类工作用有限元挨个建模会非常痛苦而势能法编译一次就能批量出结果。1. 为什么选势能法以及时变啮合刚度的本质1.1 时变啮合刚度到底在算什么先明确一件事齿轮啮合过程中接触点是沿啮合线移动的轮齿的受力位置和力臂时刻在变。再加上重合度通常不是整数所以啮合过程会出现单齿啮合区和双齿啮合区交替的规律。双齿区里两对齿同时分担载荷总变形量反而比单齿区小刚度也就更高。这个随啮合时间或转角变化的综合刚度就是时变啮合刚度。从工程意义上看这个刚度波动是齿轮系统最核心的动态激励源之一它直接决定了齿轮振动的幅值和频率成分。齿根出现裂纹后局部柔性增大刚度曲线会在裂纹齿参与啮合的位置出现一个明显的凹陷这个凹陷正是故障诊断里“边频调制”的机理来源。所以算准TVMS不管是做动力学响应预报、振动信号仿真还是做损伤识别特征提取都是第一步。1.2 势能法相比有限元法的核心优势最初考虑过用有限元软件扫参数后来放弃了。原因很简单裂纹参数一改就得重新建模、重新剖分网格尤其是裂纹尖端的网格要加密几千个样本跑下来光网格处理的时间就让人崩溃。而势能法把轮齿抽象成悬臂梁裂纹的影响只是改变了积分里的截面参数算一次基准模型只需要毫秒级批量扫描深度、角度、齿数等参数非常合适。当然势能法也有局限。它本质上是二维平面的简化模型对齿面接触的局部弹性问题处理得比较粗糙应力集中系数也需要经验修正。所以我的态度是做了几百组参数对比和趋势分析然后挑几个典型工况用二维有限元做交叉验证两边印证着来既保留效率又不至于偏离真实物理太远。1.3 从马辉、罗阳等文献中提炼的建模逻辑马辉、罗阳等文献在含裂纹齿轮刚度计算上的处理方式基本可以概括成三步把单个轮齿等效成固定于齿根圆的变截面悬臂梁齿廓渐开线部分离散成若干截面对每一个微小截面计算面积、惯性矩等几何参数将齿根裂纹视为截面有效面积的削减把含裂纹的几何参数重新代入弯曲、剪切刚度的积分表达式。这个过程简洁但严谨。文献里对裂纹简化的前提通常是贯穿齿宽的直线裂纹也就是把三维裂纹问题先压成二维来处理。这篇博文的代码也是这样假设的因为工程上高周疲劳的齿根裂纹早期往往呈线状扩展先贯穿齿宽再向内扩展的简化是合理的。2. 齿根裂纹如何进入刚度计算模型2.1 裂纹几何参数怎么定义裂纹模型需要参数化我用的两个核心参数是裂纹深度和裂纹角度。深度我用相对值表示比如q表示裂纹尖端沿垂直于齿体表面方向扩展的深度占全齿高的比例。角度v表示裂纹扩展方向与齿体中心线的夹角通常情况下裂纹从齿根圆角应力最大点出发沿与齿面法线呈一定角度的方向扩展。文献里为了计算方便普遍假设裂纹是一条直线这样每个截面上被削掉的部分就是线性变化的。实际使用中早期故障推荐从q5%~10%起步因为在这个范围内刚度下降很小这正好对应“早期裂纹难以诊断”这一工程现象。深度超过30%之后刚度变化就会变得非常明显振动特征也开始突出。2.2 截面惯性矩的折减原理这是整个裂纹建模的核心。轮齿的渐开线齿廓在不同高度处的齿厚不同悬臂梁模型里每个截面x位置都有自己的厚度S_x。一旦出现裂纹裂纹尖端以下的材料仍然起支撑作用但裂纹尖端以上部分会形成“断开”区域原本有效的抗弯截面被削弱。计算时我直接改写每个x截面上的有效厚度S_x如果裂纹把该截面分成了两段则只保留仍与齿体主体相连的那一段。更准确的做法是先由裂纹直线方程求出它与齿体轮廓的交点判断该截面上裂纹覆盖的宽度范围再用数值方法求出剩余截面面积和惯性矩。注意这里不能用简单的“厚度乘以一个系数”代替因为惯性矩和厚度的三次方成正比同样的厚度削减比例惯性矩损失更大对刚度的影响也显著得多。2.3 不同刚度分量对裂纹的敏感程度我实际算下来不同能量分量对裂纹的敏感度差异很大这直接影响故障特征的解释。弯曲刚度最敏感。因为弯曲变形正比于力臂的贡献和截面惯性矩的倒数裂纹导致惯性矩下降弯曲柔度显著增加。剪切刚度比较敏感。剪切变形取决于截面积裂纹使有效截面积下降刚度也会降低但影响幅度通常比弯曲小。轴向压缩刚度基本可以忽略。齿面法向力分解出的轴向分量较小且轴向压缩刚度由整个截面面积决定裂纹对面积的影响有限。赫兹接触刚度不随裂纹变化。它只由接触点的曲率半径和材料弹性模量决定不涉及裂纹几何。基体弹性刚度几乎不变。这个分量反映轮体基体对齿根支承的柔度裂纹在齿体局部对基体整体的弹性影响很小。这个结论很重要后续做故障诊断特征提取时主要盯弯曲刚度的缺口来判断裂纹程度而不是笼统看总刚度。3. MATLAB实现详解从参数定义到刚度曲线输出3.1 计算流程总览整个程序的执行顺序推荐这样安排输入齿轮基本参数模数、齿数、压力角、齿宽、材料参数计算齿廓几何确定基圆、分度圆、齿顶圆、齿根圆以及渐开线离散点计算重合度确定一个啮合周期内单双齿啮合区间的边界对啮合线上每一个离散位置计算该啮合点相对齿根的位置和力臂分别计算无裂纹和含裂纹两种情况下的五种刚度分量按单双齿状态组合成总时变啮合刚度绘图输出并对关键工况做验证。建议把五种刚度的计算封装成独立子函数便于替换和调试。另外程序全程保持单位一致几何量用mm力用N弹性模量用MPa即N/mm²算出来的刚度单位就是N/mm。3.2 齿轮几何参数计算先给定一个标准算例的参数方便后续对照% 基本参数 m 2; % 模数 mm z1 20; % 小齿轮齿数 z2 30; % 大齿轮齿数 alpha 20*pi/180; % 压力角 rad B 20; % 齿宽 mm E 2.06e5; % 弹性模量 MPa (N/mm^2) nu 0.3; % 泊松比 r1_p m*z1/2; % 分度圆半径 r2_p m*z2/2; r_b1 r1_p*cos(alpha); % 基圆半径 r_b2 r2_p*cos(alpha); r1_a r1_p m; % 齿顶圆半径 r2_a r2_p m; r_f1 r1_p - 1.25*m; % 齿根圆半径 r_f2 r2_p - 1.25*m;这里有个新手容易犯的错误在计算变截面悬臂梁积分下限时有些程序直接从基圆算起这是不对的。有效的啮合起始点应该是配对齿轮齿顶圆与该齿轮渐开线相交的点而不是基圆本身。如果直接从基圆作为积分起点算出来的刚度会偏小导致曲线整体偏低。正确做法是先计算理论啮合线长度和啮合起始点半径。重合度用下式计算g_a sqrt(r1_a^2 - r_b1^2) sqrt(r2_a^2 - r_b2^2) - (r1_p r2_p)*sin(alpha); epsilon g_a / (pi*m*cos(alpha));这个重合度决定了单双齿分界。比如epsilon1.6就说明啮合周期内约60%是双齿区40%是单齿区具体边界点要换算成主动轮的转角。3.3 五种刚度分量的计算子程序这里把每个子程序的关键逻辑说一下代码格式可以直接照着用。赫兹接触刚度是常数与位置无关。平面应变状态下公式为function kh hertz_stiffness(E, B, nu) kh pi*E*B / (4*(1 - nu^2)); end这个公式里的系数取决于接触模型对于两个齿廓的线接触按无限长圆柱体赫兹接触导出系数通常是pi/4。注意平面应力状态下系数会不一样齿轮齿宽足够大时按平面应变处理更符合实际。弯曲刚度是整个程序里最核心的部分。它的柔度表达式是1/k_b ∫ 0^d [F_b*(d-x) - F_ah(x)]^2 / (EI(x)) dx其中d是啮合点沿齿高方向到齿根的距离h(x)是截面到力作用线的偏移量I(x)是截面惯性矩。含裂纹时I(x)要换成I(x)。function kb bending_stiffness(params, x_mesh, I_x, F_b, F_a) d params.d_mesh; h_x params.h_mesh; integrand (F_b*(d - x_mesh) - F_a*h_x).^2 ./ (params.E .* I_x); kb 1 / trapz(x_mesh, integrand); end积分用trapz做数值积分就可以了不需要上符号积分。关键是x_mesh的离散密度我建议一个啮合周期至少取300个位置点每个齿轮廓在积分方向的离散点也要在100以上太疏了曲线会有锯齿。剪切刚度的表达式为1/k_s ∫ 0^d 1.2F_a^2 / (GA(x)) dx这里系数1.2是矩形截面的剪切修正系数。G E / (2*(1nu))。同样含裂纹时A(x)要替换成有效截面积。轴向压缩刚度公式1/k_a ∫ 0^d F_a^2 / (E*A(x)) dx实际计算时这个分量占比很小但仍建议保留因为严谨性需要。F_a是法向力分解出的轴向分量。基体弹性刚度我采用Sainsot等文献给出的拟合公式处理轮体基体柔度1/k_f cos^2(alpha) / (EB) * [ L(u_f/S_f)^2 M*(u_f/S_f) P*(1 Q*tan^2(alpha)) ]这里L、M、P、Q是拟合系数u_f和S_f由齿根圆半径、齿根圆弧和齿厚计算得到。这个公式看着繁琐但好处是不用建轮体模型就能考虑基体柔度效率很高。编写时为这几个几何量单独写一个计算函数会清爽很多。3.4 时变啮合刚度主循环与单双齿组合将齿轮副一个啮合周期内各啮合位置的刚度拼装起来是整个程序的主线。这里有个细节啮合力作用线和齿廓渐开线的角度在不同位置略有不同但很多程序为了简化直接按标准压力角处理。对于精度要求不高的情况可以接受如果要更严谨就应该在循环内重新计算瞬时啮合角。单齿区和双齿区的组合方式齿对1和齿对2是并联关系总弹性变形等于各对齿弹性变形之和。所以双齿区总柔度等于两对齿柔度相加再取倒数得到总刚度k_total 1 / (1/k_pair1 1/k_pair2)而单齿区直接取那一对齿的总刚度即可。主循环的大致逻辑% 归一化转角0到1为一个啮合周期 N 501; % 啮合位置采样数 theta_mesh linspace(0, 2*pi/ z1, N); k_total zeros(1, N); for i 1:N % 根据转角确定当前啮合位置计算齿对1的啮合点半径 r_mesh1 calc_mesh_radius(theta_mesh(i)); % 判断是否处于双齿区 if in_double_contact(theta_mesh(i), epsilon) % 齿对1 齿对2 k_pair1 calc_pair_stiffness(r_mesh1, crack_params, ...); k_pair2 calc_pair_stiffness(r_mesh2, crack_params, ...); k_total(i) 1 / (1/k_pair1 1/k_pair2); else k_pair1 calc_pair_stiffness(r_mesh1, crack_params, ...); k_total(i) k_pair1; end end绘图部分我习惯把无裂纹和有裂纹的曲线画在同一张图里对比这样故障的影响范围一目了然figure(Color,w); plot(theta_mesh*180/pi, k_health, k-, LineWidth, 1.5); hold on; plot(theta_mesh*180/pi, k_crack, r--, LineWidth, 1.5); xlabel(主动轮转角 (deg)); ylabel(时变啮合刚度 (N/mm)); legend(无裂纹, 含裂纹); grid on;从我实际跑出来的结果看裂纹深度30%时刚度曲线在裂纹齿对应区间会出现约8%~15%的局部下降下降幅度和齿数、重合度有关。如果裂纹放在从动轮上凹坑的位置会偏移这个相位信息在故障定位里非常有用。4. 常见问题排查、验证方法与实操避坑4.1 刚度曲线形状异常先查几何边界如果出来的曲线单双齿过渡点位置不对或者双齿区的刚度比单齿区还低几乎可以断定是啮合区间划分或者啮合起始点出问题了。排查顺序先核对重合度计算结果。手算一遍确认程序里sqrt(r_a^2 - r_b^2)这部分取的是同一齿轮的数值别把主动轮和从动轮的半径混用。再核对啮合起始点半径。正确表达式是由配对齿轮齿顶圆确定的不是基圆。最后检查单双齿区间的边界点换算。要把啮合线长度比例换算成主动轮的转角范围这个换算用到基圆半径别用分度圆半径。我第一版程序就是栽在第三个问题上出来的双齿区宽度明显不对反复排查才发现是转角换算写错了。4.2 结果可信度怎么验证没有裂纹的模型最好验证。找几篇经典文献里的标准齿轮算例把参数输进去对比平均啮合刚度和刚度波动幅度。一般来说解析法和势能法结果差异在5%以内是正常的。如果差异大优先检查基体柔度项是否没加以及齿根支撑位置是否取错了。含裂纹的结果验证稍微麻烦些。可以拿有限元二维模型做几个典型深度点对标比如10%、30%、50%三个深度对比刚度下降百分比。我的经验是趋势一致就算合格绝对值的误差控制在10%以内已经很理想了。当裂纹深度接近穿透齿根时势能法计算会出现数值不稳定因为悬臂梁假设在极端损伤下已经失真这个区间就不要强行用它了。4.3 几个容易忽略但影响很大的细节第一个细节是齿根过渡圆角。很多初始版本程序直接把齿根支撑点放在齿根圆上完全不考虑过渡圆角这样算出来的基体刚度会偏大。处理办法是把支撑点沿过渡圆弧稍微向内移动一个距离或者用等效法把过渡圆角的影响折进齿根厚度里。第二个细节是矩阵化加速。单个子程序用for循环慢慢算也能跑但参数扫描的时候要跑几百次速度差别就出来了。建议对齿廓离散、积分计算做向量化处理尽量用trapz替代复杂的循环累加。第三个细节是裂纹表达式的连续性。裂纹深度从0逐渐增加时刚度曲线应当平滑过渡。如果发现曲线明显跳变八成是裂纹与齿廓相交的判断条件写得不连续检查逻辑分支有没有覆盖所有几何可能性。第四个细节是绘图线型。我习惯无裂纹用实线看全局裂纹用虚线叠加对比时能明显看到凹陷位置和深度。线宽建议设置1.5以上否则导出到论文里会显得很淡。4.4 这个模型的扩展场景算出来的时变啮合刚度可以直接接到MATLAB的动力学求解流程里用ode45求解齿轮副的扭转振动模型就能得到考虑故障的动态响应。再进一步把刚度曲线的下降幅度作为故障特征可以做不同裂纹深度的模式识别。另一个方向是把刚度结果用于裂纹扩展寿命预测。虽然势能法不能直接算出裂纹尖端的应力强度因子但可以从刚度退化反推载荷幅度结合Paris公式估算剩余寿命这在状态检修里很有工程价值。如果后面要往斜齿轮上扩展思路也不变只是把接触线从“一条直线”变成“斜线”需要把齿宽方向分成多个薄片每个薄片按直齿轮处理再叠加求总刚度。代码架构上只需要把主循环改成双重循环外层遍历齿宽切片内层走原来的单齿计算逻辑。写在最后的实操心得这个程序前前后后我改过三版最大的体会是势能法本身公式并不复杂难点全在齿轮几何的边界条件上。尤其含裂纹的时候每个截面的有效面积和惯性矩都要仔细判断稍不注意就会出现不连续点。代码里每个几何量我都建议把公式来源写到注释里不然隔几周回来看就容易懵。另外算出来的刚度曲线不要只看总刚度最好把弯曲、剪切、基体这几项分别画出来观察。裂纹对弯曲项的削弱最明显如果总曲线变化不大先看弯曲项有没有真的下降这能帮你快速定位是模型问题还是裂纹参数设置问题。你要是也在做齿轮故障诊断或者动力学仿真建议把这个程序当作一个基础工具先把无裂纹模型校准准确再逐步加入裂纹参数。希望这些经验能帮你少走一些弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价