ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

斜齿轮时变啮合刚度计算:Matlab势能法+切片法实现

斜齿轮时变啮合刚度计算:Matlab势能法+切片法实现 做齿轮动力学仿真的人大多绕不开一条时变啮合刚度曲线。斜齿轮的时变啮合刚度用Matlab配合势能法和切片法来求解是目前工程和学术圈都很主流的做法。我最初接触这套模型时论文里的公式又长又绕程序跑出来还不收敛折腾了挺长时间才把整个链路理清楚。这篇文章会把我的实现思路、关键代码、验证手段和踩过的坑全部摊开讲适合正在做齿轮动力学、故障诊断、修形优化或者需要给有限元模型提供刚度输入的研究生和工程师参考。1. 时变啮合刚度是什么为什么斜齿轮非要用数值程序算1.1 传动系统仿真里刚度曲线是绕不开的核心输入齿轮啮合过程中参与啮合的齿对数量随啮合位置变化轮齿的接触点也在不断移动所以一对齿轮副的啮合刚度并不是常数而是随转角周期性变化这就是“时变啮合刚度”。它直接决定了齿轮系统的固有频率、动态响应、振动激励力也是故障诊断里齿根裂纹、齿面剥落特征分析的基础。对直齿轮来说啮合过程是整条齿宽同时接触刚度曲线呈现典型的“矩形波加凹陷”形态单双齿交替时刚度跳变很明显。而斜齿轮因为齿向有螺旋角啮合是逐渐切入、逐渐退出参与啮合的接触线沿齿宽方向斜向延伸不同轴向位置的啮合状态并不同步所以整体刚度曲线比直齿轮平滑得多激励能量也比直齿轮分散这也是斜齿轮传动更安静的重要原因之一。1.2 有限元慢、经验公式不可控自编脚本才有自由度有人会问ANSYS、ABAQUS里直接建一对斜齿轮接触模型不就能提取刚度了吗可以但代价很大。斜齿轮接触分析需要精细网格、接触非线性迭代一个工况算下来动辄几个小时而且每改变一组参数就要重新建模。搞参数化研究、优化螺旋角、做裂纹故障模拟时有限元根本跑不起批量计算。另一个选择是找文献里的现成公式和系数但不同文献的假设差别很大适用范围懵懵懂懂改参数容易得到奇怪的结果。所以对研究型和设计型工作来说自己用Matlab写一套基于解析模型的程序是最可控的方案。势能法提供齿根变形的物理模型切片法解决螺旋齿的轴向耦合两者结合就能在几秒内算出一条可靠的刚度曲线方便批量计算和二次开发。1.3 势能法加切片法本质上是“梁模型加叠加积分”这套方法一句话概括把轮齿当成齿根固支的变截面悬臂梁用能量法求出单个齿对在任意啮合位置的刚度再把斜齿轮沿齿宽切成很多薄片每个薄片近似看成直齿轮按螺旋角导致的相位差错开最后把所有薄片的刚度叠加积分就得到斜齿轮整体的时变啮合刚度。听起来不复杂但落地实现的时候几何换算、相位计算、多齿对叠加这些环节都藏着不少细节。下面从势能法开始拆解。2. 势能法的物理图景一个轮齿就是一根变截面悬臂梁2.1 悬臂梁模型与齿根圆处的固支边界势能法把轮齿抽象为从齿根圆固支伸出的悬臂梁。啮合力作用在齿廓接触点上齿根处固定载荷使齿产生弯曲变形、剪切变形和轴向压缩变形。这和跳水板的受力很类似只不过跳水板是等截面轮齿是宽度和高度都随位置变化的变截面。建模时先要把渐开线齿廓离散成沿齿高方向的一系列截面。每个截面的面积、惯性矩都不同所以刚度要沿齿高积分。论文里常写的“将齿轮齿廓离散成微段”说的就是这个过程。这个离散和后面切片法沿齿宽离散是两个维度的操作初学者最容易混淆先记住这里沿齿高积分是为了算单齿对的变截面梁刚度。齿根圆以下的部分也就是轮体柔性通常忽略或者用修正系数补偿。我们这里先按刚性轮体和齿根固支处理后续需要更精确时可以引入轮体变形项。2.2 四个刚度分量与串联关系一对啮合齿的变形能按势能法分成四部分弯曲、剪切、轴向压缩、赫兹接触。总刚度是这四个分量串联也就是柔度相加1/k_total 1/k_b 1/k_s 1/k_a 1/k_h其中弯曲刚度k_b来源于弯矩产生的弯曲变形是四者中占比最大的一项。剪切刚度k_s来源于剪力产生的剪切变形齿短而粗时占比明显。轴向压缩刚度k_a来源于载荷沿齿厚方向的压缩分量。赫兹接触刚度k_h来源于两齿面接触区的局部弹性变形与接触线长度和材料参数有关。以弯曲刚度为例积分公式写出来是这样的1/k_b 积分 [ ( (d - x)*cos(alpha_m) - h_x*sin(alpha_m) )^2 / (E * I_x) ] dx这里x是从齿根到截面的距离d是载荷作用点到齿根的距离alpha_m是载荷方向与齿对称线之间的夹角h_x是截面形心到中性轴的距离I_x是截面惯性矩。积分从齿根积到载荷作用点。剪切和压缩项类似1/k_s 积分 [ 1.2 * cos(alpha_m)^2 / (G * A_x) ] dx 1/k_a 积分 [ sin(alpha_m)^2 / (E * A_x) ] dx赫兹接触刚度在单位宽度下的近似式为1/k_h 4*(1 - nu^2) / (pi * E * L)其中L是接触线长度在切片法中取该切片的齿宽微段长度。这个公式是线接触的赫兹近似对斜齿轮切片模型是够用的。2.3 为什么用能量法而不是直接受力分析直接受力分析需要知道齿根危险截面的实际应力分布和变形这依赖弹性力学复杂计算对变截面、变载荷角度的齿廓来说很难做。能量法绕开了这个麻烦只要给定位移和力的关系用虚功或能量守恒把变形能积分算出来再反解刚度就行。那alpha_m和力臂怎么变呢啮合点沿齿廓移动时啮合力方向始终垂直于齿面也就是沿着啮合线方向但相对于齿对称轴的角度一直在变。程序里必须根据当前接触点在齿廓上的位置动态计算不能用一个固定压力角代替否则算出来的刚度曲线趋势会错。2.4 边界条件和几何简化的几个坑实际齿廓在齿根圆和基圆之间不是渐开线而是过渡曲线。严格建模需要刀具齿顶圆角产生的过渡曲线方程但很多工程程序直接把它简化为直线连接齿根圆到基圆。这个简化会让齿根附近截面面积偏大、刚度偏大实测下来整个刚度曲线均值会偏高几个百分点。另外一个容易翻车的地方是齿根圆直径、基圆直径谁大谁小在不同齿数下不一定。比如齿数很少时齿根圆可能小于基圆齿数多时齿根圆大于基圆。程序里做齿廓离散时必须判断从哪个圆开始取渐开线不然会出现截面越界。3. 切片法的本质把斜齿轮切成一组错相位的直齿薄片3.1 斜齿轮接触线的几何真相斜齿轮啮合时两齿面的接触线是一条倾斜的直线近似。在基圆柱展开面上看接触线与轴线之间的夹角就是基圆螺旋角beta_b。这意味着不同轴向位置的截面进入啮合的时间是不一样的一端先接触另一端后接触接触线长度也从短到长再变短。如果用模数、压力角、螺旋角算一下纵向重合度epsilon_beta B*sin(beta)/(pi*mn)当它大于1时接触线在轴向好几颗齿的范围内分布所以任意时刻总有不止一条接触线存在。这就是斜齿轮刚度曲线平滑的根本原因。3.2 沿齿宽切片每个薄片相当于一个直齿轮切片法的操作是把齿宽B切成Nslices个薄片每片厚度dl B/Nslices。对每一个薄片来说螺旋角的效应只剩一个“相位差”齿形本身可以按直齿轮处理。于是整个斜齿轮的刚度等于这一堆直齿薄片的刚度按相位错开后的叠加。这里必须再强调一下切片法里的“切片”是沿齿宽方向而势能法积分里的“微段”是沿齿高方向。一个是轴向切片一个是径向分段两者是完全独立的操作。3.3 相位差的计算啮合线位置偏移ds z * tan(beta_b)这是整篇文章里我认为最核心的几何关系。在基圆柱展开面上接触线沿轴向方向前进距离z在切向也就是啮合线方向上对应的偏移量是ds z * tan(beta_b)这个偏移量直接以毫米为单位加在啮合线位置s上。如果一个参考端面的啮合点位置是s那么在轴向位置z处该薄片对应的啮合位置就是s - z*tan(beta_b)。用这个关系程序实现变得非常清爽只需要以啮合线位置s为主变量生成单齿对刚度表然后在叠加循环里对每个薄片做一次坐标平移查表得到该薄片的啮合刚度。有的实现会把这个偏移换成角度偏移phi_off z*tan(beta_b)/rb本质一样。我更喜欢直接用s变量因为和重合度、基圆齿距的直接对比更直观。3.4 多齿对叠加同一薄片也可能单双齿交替每个薄片虽然是直齿轮模型但在一个端面啮合周期内仍然会经历双齿区、单齿区、双齿区交替。斜齿轮的总重合度等于端面重合度加纵向重合度epsilon_gamma epsilon_alpha epsilon_beta在实现时对每个薄片如果当前啮合位置与自己齿距内相邻的前一对齿都在实际啮合线范围内就要把两对齿的刚度串联后再参与叠加k_slice 1 / (1/k_pair(s) 1/k_pair(s - pb))否则直接取k_pair(s)。这里pb是基圆齿距也就是相邻两对齿沿啮合线的间隔。把所有薄片的k_slice乘以厚度dl再求和就得到整个斜齿轮在某个转角位置的总啮合刚度。4. Matlab程序框架与关键代码从端面参数起步4.1 程序总框架五个模块写程序之前先定好模块边界。我的实现分五块参数输入与端面几何换算齿廓离散沿齿高方向积分准备单齿对刚度扫描表生成势能法积分切片相位偏移与整轮刚度叠加主循环绘图、验证与后处理下面按这个顺序给出核心代码和解释。4.2 参数输入与端面几何换算标题里“根据端面”这几个字很关键。斜齿轮的标准参数是法面的但啮合几何全部发生在端面内所以第一步必须把法面参数换算成端面参数端面模数、端面压力角、基圆直径、基圆螺旋角。clear; clc; close all; % 法面输入参数 mn 2; % 法面模数mm z1 23; z2 47; % 主动轮、从动轮齿数 alpha_n 20; % 法面压力角deg beta 18; % 分度圆螺旋角deg B 30; % 齿宽mm x1 0; x2 0; % 变位系数 E 206e3; % 弹性模量MPa即 N/mm^2 nu 0.3; % 泊松比 G E / (2*(1nu)); % 剪切模量 % 换算到端面 alpha_t atan(tan(alpha_n*pi/180) / cos(beta*pi/180)); mt mn / cos(beta*pi/180); d1 mt * z1; d2 mt * z2; db1 d1 * cos(alpha_t); db2 d2 * cos(alpha_t); rb1 db1 / 2; rb2 db2 / 2; ra1 d1/2 mn; ra2 d2/2 mn; % 齿顶圆默认齿顶高系数1 rf1 d1/2 - 1.25*mn; rf2 d2/2 - 1.25*mn; % 齿根圆默认顶隙系数0.25 beta_b atan(tan(beta*pi/180) * cos(alpha_t)); % 基圆螺旋角rad % 中心距与端面重合度 aa mt*(z1z2)/2; pb pi*mt*cos(alpha_t); % 端面基圆齿距mm L_alpha sqrt(ra1^2 - rb1^2) sqrt(ra2^2 - rb2^2) - aa*sin(alpha_t); epsilon_alpha L_alpha / pb; epsilon_beta B * sin(beta*pi/180) / (pi*mn); epsilon_gamma epsilon_alpha epsilon_beta; fprintf(端面压力角 %.3f deg\n, alpha_t*180/pi); fprintf(基圆螺旋角 %.3f deg\n, beta_b*180/pi); fprintf(端面重合度 %.4f\n, epsilon_alpha); fprintf(纵向重合度 %.4f\n, epsilon_beta); fprintf(总重合度 %.4f\n, epsilon_gamma);这里的齿顶圆、齿根圆我用了标准齿顶高系数1、顶隙系数0.25实际有变位时要用含变位量的公式。重点是自己心里有个清单所有后续计算都基于端面齿形不要再用法面模数去算直径。4.3 单齿对刚度扫描表势能法积分这个函数输入是当前啮合位置s沿啮合线方向的距离0表示刚进入啮合输出是该位置下单齿对的总柔度倒数。核心工作是沿齿高方向离散对每个截面计算面积、惯性矩、力臂和载荷角然后积分。function k_pair pairStiffness(s, geom) % geom: 结构体包含rb1, rb2, ra1, ra2, rf1, alpha_t, E, nu等 % s: 啮合点距离啮合线起点的距离mm % 返回单个齿对的总啮合刚度 N/mm % 接触点到两轮齿基圆切点的距离 s1 s; % 主动轮齿面接触点参数 s2 L_total - s; % 从动轮对应参数L_total为实际啮合线长度 % 对主动轮和从动轮分别计算轮齿刚度然后串联 k1 gearToothStiffness(s1, geom, pinion); k2 gearToothStiffness(s2, geom, gear); % 赫兹接触刚度 kh pi * E / (4*(1-nu^2)); % 单位宽度N/mm^2 % 总体两个轮齿串联后再与接触刚度串联 k_pair 1 / (1/k1 1/k2 1/kh); endgearToothStiffness内部实现势能法积分。关键不是把一个标准函数贴完整而是明白里面几件事第一沿齿高取足够多积分点第二每个截面的面积和惯性矩由齿廓坐标计算第三alpha_m和力臂随着接触点位置变化。轮齿刚度的核心积分可以写成这样function k gearToothStiffness(sp, geom, which) % 沿齿高方向离散 Nint 60; k_b_acc 0; k_s_acc 0; k_a_acc 0; for i 1:Nint x_i ...; % 当前截面离齿根的距离 A_i ...; % 截面面积由该处齿厚决定 I_i ...; % 截面惯性矩 alpha_m ...; % 载荷方向与齿对称线夹角随接触点变化 h_i ...; % 截面形心位置 d_i ...; % 载荷点到该截面的力臂 M_i cos(alpha_m)*(d_i) - sin(alpha_m)*h_i; k_b_acc k_b_acc (M_i^2) / (E * I_i) * dx; k_s_acc k_s_acc 1.2*cos(alpha_m)^2 / (G * A_i) * dx; k_a_acc k_a_acc sin(alpha_m)^2 / (E * A_i) * dx; end k 1 / (k_b_acc k_s_acc k_a_acc); end这个完整函数里还有大量齿廓坐标计算比如基圆展角、渐开线坐标、截面齿厚的求解。建议在实现时分步验证先画齿廓形状确认与设计齿轮一致再算刚度。如果齿廓画出来是错的后面一切免谈。4.4 整轮刚度主循环切片叠加扫描表做好之后主循环就简单了对每个输出转角遍历所有薄片计算轴向位置z对应的啮合线位置偏移然后查表叠加。Nslices 100; dz B / Nslices; % 一个基圆齿距对应的转角作为刚度周期 theta_p 2*pi / z1; % 主动轮基圆齿距角rad Ntheta 200; % 每个周期内的采样点数 theta_vec linspace(0, theta_p, Ntheta); % 预计算单齿对刚度扫描表 s_vec linspace(0, L_alpha, 200); k_pair_vec zeros(size(s_vec)); for idx 1:length(s_vec) k_pair_vec(idx) pairStiffness(s_vec(idx), geom); end K_total zeros(size(theta_vec)); for it 1:Ntheta theta theta_vec(it); % 参考端面的啮合位置按基圆半径线性换算 s_ref rb1 * theta; % 啮合点从起点沿啮合线移动 k_sum 0; for j 1:Nslices z_j (j - 0.5) * dz; s_j s_ref - z_j * tan(beta_b); % 相位偏移核心 % 先折算进实际啮合线范围 s_j mod(s_j, L_alpha); % 查单齿对刚度 k_pair_j interp1(s_vec, k_pair_vec, s_j, pchip); % 如果与前一相邻齿对同时啮合则并联 s_j_prev s_j - pb; if s_j_prev 0 s_j_prev L_alpha k_pair_prev interp1(s_vec, k_pair_vec, s_j_prev, pchip); k_slice_j 1 / (1/k_pair_j 1/k_pair_prev); else k_slice_j k_pair_j; end k_sum k_sum k_slice_j * dz; % 厚度加权 end K_total(it) k_sum; end % 可视化 figure; plot(theta_vec*180/pi, K_total, LineWidth, 1.6); xlabel(主动轮转角 (deg)); ylabel(啮合刚度 (N/mm)); title(斜齿轮时变啮合刚度曲线); grid on;这里mod的作用是把偏移后的s_j折算到实际啮合线长度L_alpha内。因为斜齿轮接触线跨越的总长度可能超过端面实际啮合线长度同一个薄片在轴向不同位置相当于处于啮合周期内不同阶段取模后查表是合理做法。需要提醒的是用s_ref rb1*theta时转角零点要和单齿对刚度表的零点对齐否则画出来的曲线相位会整体偏移。我的做法是先跑一次纯直齿轮退化算例把刚度曲线的双齿区位置和理论啮合位置对比对齐零点。5. 验证、收敛性调优与工程坑位排查5.1 切片数和积分点的收敛性切片数Nslices直接决定曲线平滑度。我试过从10片到400片的变化少于30片时曲线上有明显阶梯感波动幅度偏大。80到150片时曲线已经比较光滑均值稳定。超过300片时计算时间增加而且因为每片太薄赫兹接触刚度在叠加中占比越来越大结果会轻微上漂。齿高方向积分点Nint也有影响。少于30个积分点单齿对刚度在进入啮合和退出啮合位置会出现锯齿状的小波动典型表现是曲线端部毛刺。我一般取60到80个积分点足够稳定。建议的做法是先把Nslices固定为100花几分钟调整Nint看单齿对刚度曲线然后固定Nint为60扫一遍Nslices看整轮曲线收敛情况。每次改动只动一个变量别混合调参。5.2 三个必做的验证算例第一个是退化验证把螺旋角beta设成0程序应该自动退化为直齿轮刚度曲线。此时所有薄片相位偏移都是0叠加后和直接按直齿轮势能法计算的结果一致。如果螺旋角为0时曲线形态不对说明切片叠加逻辑有bug别急着算斜齿轮。第二个是重合度验证把epsilon_gamma和曲线形态对照。总重合度越大曲线波动越小当纵向重合度较大时比如大于2曲线看上去几乎是准常值带轻微波动这是正常现象不是程序出错。第三个是有限元或者文献对比。我自己用ABAQUS建过一个简化的斜齿轮静接触模型对比中载工况下平均刚度误差在6%以内。对比时重点查刚度均值不要过于纠结局部波动因为解析模型本身忽略了一些非线性接触因素。如果你没有有限元条件也可以找几篇公开论文里的算例参数复现他们的几何参数对比刚度曲线的均值和波动范围。文献里Ma等、Chen和Shao的切片法模型参数都比较完整适合做基准。5.3 常见问题排查表下面这个表是我实际排查过程整理出的高频问题。现象可能原因处理办法刚度曲线整体偏低齿根圆和基圆之间过渡处理太粗齿根截面偏弱改用过渡曲线近似或把齿根截面厚度适当修正曲线有明显周期跳变薄片相位偏移符号反了检查s_j s_ref - z*tan(beta_b)的正负号用旋向验证曲线端部毛刺多齿高积分点数太少Nint提高到80以上曲线不够平滑Nslices太少增加到100到150数值量级对不上单位混乱长度用mm力用N弹性模量用MPa刚度自然是N/mm螺旋角设为0后结果和直齿轮不一致扫描表零点没有对齐统一以啮合线起点为扫描表零点并用同样零点驱动主循环5.4 关于摄动量的取值再提醒一点还有一类小问题判断“当前是否双齿啮合”时代码里用s_j_prev 0做边界判断。由于插值误差边界处常常会出现轻微的刚度跳变曲线在进入双齿区瞬间有一点点不连续。解决方法是把边界判断的判断条件设为 -1e-9同时在边界处做微小过渡区的线性平滑。如果不处理虽然对均值影响不大但如果你后续拿这条刚度曲线去激励振动方程这些小的不连续点会引入高频虚假响应。5.5 程序扩展方向这套程序写完后后续扩展非常顺手。比如齿廓修形在扫描表阶段把齿廓坐标修形量减掉重新算单齿对刚度就能看修形对刚度曲线的影响。齿根裂纹把裂纹深度和位置加入到悬臂梁截面面积削弱中可以直接模拟故障齿轮的刚度下降。轴向变位和鼓形齿只需要在每个薄片处附加不同的变位量或齿厚偏移叠加逻辑完全不用改。实际上我就是在这套程序的基础上做了不同修形方案的对比才算真正理解斜齿轮设计参数对激励的影响。个人经验是写这类数值模型最忌讳一上来就追求“和有限元一模一样”。先跑通退化验证和重合度一致性再逐步增加复杂度。毕竟时变啮合刚度只是齿轮动力学链条上的一环前面几何错了后面模态分析、响应预测都是白算。等这一套程序稳定了它带来的复用价值远远超过当时排查bug花掉的时间。
返回列表