next up previous contents
Next: Conclusions Up: Software description Previous: Geometry dialog

Formula engine

There are very little decidions or tests to be done for calculation of the planetary geometry. Formulas described in chapter gif 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) ) ;
}



Leon Kos
Tue Dec 2 10:35:04 CET 1997