There are very little decidions or tests to be done for calculation of the planetary geometry. Formulas described in chapter 2 can be directly coded in C++. Description in C++ language follows. Some intermediate results which are not important for final results are listed under DEBUG clauses.
void
pgEditFile::Calculate()
{
char buf[100];
char *gear[] = { "Sun", "Ring", "Carrier" };
#define PRIN1(string) sprintf(buf, string "\r\n"); Insert(buf)
#define PRINT(fmt, vars) sprintf(buf, "\t" fmt "\r\n", vars); Insert(buf)
#define kd kinematic
#define gd geometry
PRIN1("Analysis of Planetary Transmissions\r\n\r\n");
PRIN1("INPUT DATA:\r\n");
PRIN1("Kinematics:\r\n");
PRINT("Input\t->\t%s", gear[kd.iInput]);
PRINT("Fixed\t->\t%s", gear[kd.iFixed]);
PRINT("Output\t->\t%s\r\n", gear[kd.iOutput]);
PRINT("Number of teeth of the Sun gear: \t%3d", kd.iTeethSun);
PRINT("Number of the Planets : \t%3d", kd.iNoPlanets);
PRINT("Number of teeth of the Ring gear:\t%3d", kd.iTeethRing);
PRIN1("\r\nGeometry:\r\n");
PRINT("Normal modul:\t\t%5.2lf mm", gd.dNorModul);
PRINT("Helix angle:\t\t%4.0lf deg", gd.dHelAng);
PRINT("Normal angle:\t\t%5.1lf deg", gd.dNorAng);
PRINT("Addendum of basic rack:\t%5.2lf of module", gd.dBasicRack);
PRINT("Bottom clearance:\t\t%5.2lf of module ", gd.dCoeff);
PRINT("Face width:\t\t%6.2lf mm", gd.dFaceWidth);
PRINT("Gear quality:\t\t%3.0lf", gd.dGearQuality);
PRIN1("\r\nRESULTS");
#define R kd.iTeethRing
#define S kd.iTeethSun
// int P = int(floor(double(R-S)/2.0));
int P ;
#ifdef DEBUG
PRIN1( "\r\n*******************" ) ;
PRINT( "\r\n(z3-z1)/2 = %lg", 0.5*(R - S) ) ;
PRIN1( "\r\n******************" ) ;
#endif
if( S < 12 ) {
/* in case that the sun has less than 12 teeth */
/* to calculate: (R-S)/2 - P = 1 or 1.5 */
P = int( 0.5*(R - S) ) - 1 ;
} else {
/* in case that the sun has 12 or more teeth */
/* to calculate: (R-S)/2 - P = 0.5 or 1 */
P = int( 0.5*(R - S) - 0.5 ) ;
}
kd.iTeethPlanet = P ;
PRINT("Number of teeth of the Planet gears: %d", P);
#define alpha (double(R)/double(S))
double ratio;
switch (kd.iInput)
{
case SEL_SUN:
if (kd.iFixed == SEL_RING)
ratio = 1.0 + alpha;
else
ratio = -alpha;
break;
case SEL_RING:
if (kd.iFixed == SEL_SUN)
ratio = (1.0 + alpha)/alpha;
else
ratio = -1.0/alpha;
break;
case SEL_CARRIER:
if (kd.iFixed == SEL_SUN)
ratio = alpha /(1.0 + alpha);
else
ratio = 1.0 /( 1.0 + alpha);
break;
default:
MessageBox("calculate input");
}
PRINT("Transmission ratio:\t\t%lg", ratio);
#define deg2rd( deg ) (M_PI*deg/180)
#define rd2deg( rd ) (180*rd/M_PI)
#define sqr( x ) (x*x)
#define alfa_n deg2rd( gd.dNorAng )
#define beta deg2rd( gd.dHelAng )
#define X2 results.x2
#define X3 results.x3
#define X1 results.x1
#define D1 results.d1
#define D2 results.d2
#define D3 results.d3
#define Da1 results.da1
#define Da2 results.da2
#define Da3 results.da3
int z1 = kd.iTeethSun ;
int z2 = kd.iTeethPlanet ;
int z3 = - kd.iTeethRing ;
X3 = 0 ;
double mt = gd.dNorModul/cos(beta) ;
double alfa_t = atan( tan(alfa_n)/cos(beta) ) ;
//
// calculation for gears z1 and z2
//
results.b2 = gd.dFaceWidth;
results.b1 = results.b2 + gd.dNorModul ;
double ad12 = 0.5*mt*double(z1 + z2) ;
double a12 = (mt * (7*abs(z3) - 6*z2 + z1)) / 16.0 ;
a12 = 0.1*( (int)(10*a12 + 0.5) ) ;
double ad23 = 0.5*mt*(z2 + z3) ;
double a23 = -a12 ;
double alfa_wt12 = acos(ad12*cos(alfa_t)/a12) ;
double alfa_wt23 = acos(ad23*cos(alfa_t)/a23) ;
double sum_x1 = (inv(alfa_wt12)-inv(alfa_t))*double(z1+z2)/
(2*tan(alfa_t)*cos(beta)) ;
double sum_x2 = (inv(alfa_wt23)-inv(alfa_t))*double(z2+z3)/
(2*tan(alfa_t)*cos(beta)) ;
X2 = sum_x2 - X3 ;
X1 = sum_x1 - X2 ;
D1 = mt*z1 ;
D2 = mt*z2 ;
double df1 = D1-2*gd.dNorModul*(gd.dBasicRack+gd.dCoeff-X1) ;
double df2 = D2-2*gd.dNorModul*(gd.dBasicRack+gd.dCoeff-X2) ;
double teethHeight = a12 - gd.dNorModul*gd.dCoeff - 0.5*(df1+df2) ;
Da1 = df1 + 2*teethHeight ;
Da2 = df2 + 2*teethHeight ;
#ifdef DEBUG
double mount = 1.0*(S+R)/kd.iNoPlanets ;
double db1 = D1*cos(alfa_t) ;
double db2 = D2*cos(alfa_t) ;
double g_alfa ;
g_alfa = 0.5*( sqrt( sqr(Da1) - sqr(db1) ) - db1*tan(alfa_t) ) +
gd.dNorModul*(1-X1)/sin(alfa_t) ;
double p_et = gd.dNorModul*M_PI*cos(alfa_t)/cos(beta) ;
double conRatio = g_alfa / p_et ;
double overlapRatio = gd.dFaceWidth*sin(beta)/
(M_PI*gd.dNorModul) ;
double totalRatio = conRatio + overlapRatio ;
double dv1 = D1 + 2*X1*gd.dNorModul ;
double dv2 = D2 + 2*X2*gd.dNorModul ;
#endif
double alfa_vt1 = acos( z1*cos(alfa_t)/
(z1 + 2*X1*cos(beta) ) ) ;
double alfa_vt2 = acos( z2*cos(alfa_t)/
(z2 + 2*X2*cos(beta) ) ) ;
double beta_b = asin( sin(beta)*cos(alfa_n) ) ;
double k1 ;
k1 = z1/M_PI*( tan(alfa_vt1)/sqr(cos(beta_b))-2*X1*tan(alfa_n)/z1 -
inv( alfa_t ) ) + 0.5*z1/abs( z1 ) ;
results.k1 = floor( k1 + 0.5 ) ;
double k2 ;
k2 = z2/M_PI*( tan(alfa_vt2)/sqr(cos(beta_b))-2*X2*tan(alfa_n)/z2 -
inv( alfa_t ) ) + 0.5*z2/abs( z2 ) ;
results.k2 = floor( k2 + 0.5 ) ;
results.wk1 = gd.dNorModul*cos(alfa_n)*
( (results.k1 - 0.5*z1/abs(z1))*M_PI + z1*inv(alfa_t) ) +
2*X1*gd.dNorModul*sin(alfa_n) ;
results.wk2 = gd.dNorModul*cos(alfa_n)*
( (results.k2 - 0.5*z2/abs(z2))*M_PI + z2*inv(alfa_t) ) +
2*X2*gd.dNorModul*sin(alfa_n) ;
double fi = gd.dGearQuality < 9 ? 1.4 : 1.6 ;
results.ff = 1.5 + 0.25*(gd.dNorModul + 9*sqrt(gd.dNorModul) ) ;
results.ff *= pow( fi, max( 0, (int) (gd.dGearQuality-6) ) ) ;
results.fr1 = 1.68+2.18*sqrt(gd.dNorModul)+
(2.3+1.2*log10(gd.dNorModul))*sqrt(sqrt(D1)) ;
results.fr1 *= pow( 1.4, max( 0, (int) (gd.dGearQuality - 6) ) ) ;
results.fr2 = 1.68+2.18*sqrt(gd.dNorModul)+
(2.3+1.2*log10(gd.dNorModul))*sqrt(sqrt(D2)) ;
results.fr2 *= pow( 1.4, max( 0, (int) (gd.dGearQuality - 6) ) ) ;
results.fb = 0.8*sqrt(gd.dFaceWidth) + 4 ;
results.fb *= pow( 1.6, max( 0, (int) (gd.dGearQuality - 6) ) ) ;
//
// calculation for gears z2 and z3
//
#ifdef DEBUG
double x0 = 0.15 ;
int z0 = 40 ;
#endif
results.b3 = gd.dFaceWidth + 2*gd.dNorModul ;
#ifdef DEBUG
double d0 = mt*z0 ;
double db0 = d0*cos(alfa_t) ;
double da0 = d0 + 2*gd.dNorModul*(gd.dBasicRack+gd.dCoeff+x0) ;
double df0 = d0-2*gd.dNorModul*(gd.dBasicRack+gd.dCoeff-x0) ;
double alfa_wt0 = ainv( inv(alfa_t)
+2.0*tan(alfa_n)*double(x0+X3)/double(z0+z3) ) ;
double a0 = gd.dNorModul*(z0+z3)*cos(alfa_t)/
(2*cos(beta)*cos(alfa_wt0)) ;
#endif
D3 = mt*z3 ;
#ifdef DEBUG
double db3 = D3*cos(alfa_t) ;
double df30 = 2*a0 - da0 ;
#endif
Da3 = 2*a23 - df2 - 2*gd.dCoeff*gd.dNorModul ;
#ifdef DEBUG
double dnf32 = 1.0*z3/abs(z3)*sqrt(
sqr(2*a23*sin(alfa_wt23)-sqrt(sqr(Da2)-sqr(db2))) + sqr(db3) ) ;
double dnf30 = 1.0*z3/abs(z3)*sqrt(
sqr(2*a0*sin(alfa_wt0)-sqrt(sqr(da0)-sqr(db0))) + sqr(db3) ) ;
g_alfa = 0.5*( sqrt( sqr(Da2) - sqr(db2) ) +
1.0*z3/abs(z3)*sqrt( sqr(Da3)-sqr(db3) ) )
- (db2+db3)*tan(alfa_wt23) ;
p_et = gd.dNorModul*M_PI*cos(alfa_t)/cos(beta) ;
conRatio = g_alfa / p_et ;
overlapRatio = gd.dFaceWidth*sin(beta)/(M_PI*gd.dNorModul) ;
totalRatio = conRatio + overlapRatio ;
#endif
results.dm = floor( 1.5*gd.dNorModul + 0.5 ) ;
double alfa_kt ;
alfa_kt = ainv( results.dm/(z3*gd.dNorModul*cos(alfa_n)) -
0.5*(M_PI-4*X3*tan(alfa_n))/z3 + inv(alfa_t) ) ;
double dk = D3*cos(alfa_t)/cos(alfa_kt) ;
if( z3 % 2 == 0 ) {
results.mdk = dk + results.dm ;
} else {
results.mdk = dk*cos(0.5*M_PI/z3) + results.dm ;
}
results.fr3 = 1.68+2.18*sqrt(gd.dNorModul)+
(2.3+1.2*log10(gd.dNorModul))*sqrt(sqrt(-D3)) ;
results.fr3 *= pow( 1.4, max( 0, (int) (gd.dGearQuality - 6) ) ) ;
PRINT( "Center distance (a):\t\t%lg mm", a12 ) ;
PRIN1( "\r\n\tWidths (b):" ) ;
PRINT( "\tSun\t\t%6.2lf mm", results.b1 ) ;
PRINT( "\tPlanet\t\t%6.2lf mm", results.b2 ) ;
PRINT( "\tRing\t\t%6.2lf mm", results.b3 ) ;
PRIN1( "\r\n\tAddendum modification coefficients (x):" ) ;
PRINT( "\tSun\t\t%6.4lf of module", results.x1 ) ;
PRINT( "\tPlanet\t\t%6.4lf of module", results.x2 ) ;
PRINT( "\tRing\t\t%6.4lf of module", results.x3 ) ;
PRIN1( "\r\n\tReference diameter (d):" ) ;
PRINT( "\tSun\t\t%8.4lf mm", results.d1 ) ;
PRINT( "\tPlanet\t\t%8.4lf mm", results.d2 ) ;
PRINT( "\tRing\t\t%8.4lf mm", results.d3 ) ;
PRIN1( "\r\n\tTip diameter (da):" ) ;
PRINT( "\tSun\t\t%8.4lf mm", results.da1 ) ;
PRINT( "\tPlanet\t\t%8.4lf mm", results.da2 ) ;
PRINT( "\tRing\t\t%8.4lf mm", results.da3 ) ;
PRIN1( "\r\n\tNumber of teeth in a span (k):" ) ;
PRINT( "\tSun\t\t%4.0lf", results.k1 ) ;
PRINT( "\tPlanet\t\t%4.0lf", results.k2 ) ;
// PRINT( "\t\tRing\t\t%4.0lf", results.k3 ) ;
PRIN1( "\r\n\tBase tangent length for \"k\" teeth (Wk):" ) ;
PRINT( "\tSun\t\t%8.4lf mm", results.wk1 ) ;
PRINT( "\tPlanet\t\t%8.4lf mm", results.wk2 ) ;
// PRINT( "\t\tRing\t\t%f", results.wk3 ) ;
PRINT( "\r\nDiameter of measuring sphere (Dm):\t%8.4lf mm", results.dm ) ;
PRINT( "\r\nDimension over balls (Mdk):\t%8.4lf mm", results.mdk ) ;
PRINT( "\r\nProfile form error (ƒf):\t%d µm", (int) floor(results.ff+0.5) ) ;
PRIN1( "\r\nRadial run-out (Fr):" ) ;
PRINT( "\tSun\t\t%d µm", (int) floor(results.fr1+0.5) ) ;
PRINT( "\tPlanet\t\t%d µm", (int) floor(results.fr2+0.5) ) ;
PRINT( "\tRing\t\t%d µm", (int) floor(results.fr3+0.5) ) ;
PRINT( "\r\nTotal aligment error (Fb): %d µm", (int) floor(results.fb+0.5) ) ;
}