[关键词] 渐开线齿轮 公法线长度 跨棒(球)距
前言
在日常生产的设备及装备维修或只有样件的齿轮类零件的首期开发过程中,常常需要对齿轮类零件进行测绘。但是此类零件的各部分尺寸很多,有些尺寸不能直接得到。例如对于渐开线圆柱齿轮,表征其几何特点的基本参数即基圆直径 和螺旋角 (其余参数可依这两参数及其它相关的可测量参数确定)就较难确定。本文重点对基圆直径 和螺旋角 的准确确定提出两种求解方法。
1 基于两组公法线长度值和一组跨棒距值的 、 确定方法
1.1 方法的提出
公法线 的长度是在基圆柱切平面(公法线平面)上跨k个齿(对外齿轮)或k个齿槽(对内齿轮)在接触到一个齿的右齿面和另一个齿的左齿面的两个平行平面间测得的距离。公法线长度尺寸由下列公式给出:
(1.1)
测量得到两组公法线长度
和
:
(1.2)
则有:
(1.3)
将
代入式(1.2)可得
。
根据测量的一组跨棒距M,可以通过换算求得棒心所在圆的直径 及棒心处的压力角 。
因为
(1.4)
棒心处的渐开线函数值: (1.5)
由式(1.4)导出
,并将其代入(1.5)式可得:
(1.6)
又
(1.7)
和
已求得,
为量棒直径,则联立 (1.6)和(1.7) 式可求得
。
由于 (1.8)
则可得:
(1.9)
又
,则
(1.10)
至此,我们确定了
、
和
。
1.2方法的适用范围及注意事项
基于公法线长度和一组跨棒距的测量法对内斜齿轮或齿数较少的外齿轮是不适合的。
对普通外斜齿轮而言,该方法受齿轮齿宽的限制,因为齿宽太小时可能得不到公法线长度值。此处给出了判别准则,只有满足下式时才可以测量:
这里或 (1.11)
或
(1.12)
如果有齿廓或螺旋线修形,公法线测量应该在未经修形的齿面部分进行。对斜齿鼓形齿,斜齿公法线中的公称齿厚应予以修正。对直齿鼓形齿,应在鼓形的顶点进行测量。
2 基于三组跨棒(球)距的测量法
2.1方法的提出
采用三个直径大小不同的量棒(球)进行测量,经简单换算可得到三组量棒(球)中心所在圆的直径值 、 、 ,设 、 、 分别为球心处的压力角。则有下式成立:
(2.1)
对于外齿轮有:
(2.2)
则: (2.3)
因 (2.4)
则有 (2.5)
联立(2.1)和(2.5)式,可以得:
(2.6)
2.2 算法求解
非线性方程组(2.6) 由5个方程组成,含5个未知数 、 、 、 、 ,则方程组封闭可解,将方程组变形为一般形式:
即
(2.7)
本文采用拟牛顿法求解该非线性方程组,算法主程序附后。
3 结论
由于研究对象存在制造误差或不规则磨损等因素,使得我们的测量值不可避免地存在偏差。为了更准确地获得其特征参数,必要时,在求解过程中对 按基节表进行修正。下面对方法①的修正过程予以介绍:
(1)由(1.3)式得到 ,按基节表对其进行修正,得到 ;
(2)将 代入式(1.2)可得 ;
(3)同理联立(1.6)和(1.7)式,可求得 ,进而得到 和 。
方法②的修正过程与此类似,不再赘述。
方法①比较简便,但是对于齿宽太小的齿轮,不允许直接作公法线测量,此方法便不再适用。此外它不适合用于内斜齿轮。方法②具有通用性,它除了适用于方法①能够测绘的齿轮,还不受齿宽的限制。值得注意的是方法②需要测量的尺寸较多,必须考虑适当的方法使测量值尽可能精确。另外,方法②用到了量棒(球)直径的差值,根据实际应用经验可知:为减小运算误差,应尽量使三个量棒(球)的直径有一定的级差。
4 结束语
着眼于实际生产需要,本文给出了两种齿轮测绘方法。这两种方法对测量设备要求不高,易于操作,编写的算法程序具有通用性,在实际中得到了检验,实践证明两种方法具有较高的应用价值。作为专家系统,本文有许多地方有待进一步完善,故此命题取为《齿轮测绘专家系统方案》。由于作者水平和经验等原因,文中难免有不足之处,恳切希望同行提出宝贵的完善意见。
参考文献:
1.张民安主编.圆柱齿轮精度[M].北京:中国标准出版社,2002
2.徐士良主编.C常用算法程序集[M].北京:清华大学出版社,1996
3.蔡志侯等编.齿轮工工艺学[M].北京:科学普及出版社,1981
附主程序:
#include "stdio.h"
#include "math.h"
#define pi 3.1415926
#include "dnetn.c"
#include "agaus.c"
double A,B,C,Da,Db,Dc;
main( )
{
int i,k;
double eps,t,h;
static double x[5]={0.3,0.4,0.4,115,0.3};
t=0.1; h=0.01; eps=0.000001; k=100;
A=115.9375006; B=118.7349801; C=121.2134001; Da=5; Db=6; Dc=7;
i=dnetn(5,eps,t,h,x,k);
printf("n");
printf("i=%dn",i);
printf("n");
for(i=0;i<=4;i++)
printf("x(%d)=%fn",i,x[i]);
printf("n");
}
void dnetnf(x,y,n)
int n;
double x[],y[];
{ y[0]=A*cos(x[0])-x[3];
y[1]=B*cos(x[1])-x[3];
y[2]=C*cos(x[2])-x[3];
y[3]=tan(x[0])-x[0]-tan(x[1])+x[1]-(Da-Db)/(x[3]*cos(x[4]));
y[4]=tan(x[1])-x[1]-tan(x[2])+x[2]-(Db-Dc)/(x[3]*cos(x[4]));
n=n;
return;
}