Example #1
0
        public override AbstractAnalyticalAnalyser GetAnalyticalAnalyser()
        {
            if (!isPointsCoordCalculated)
            {
                CalcPointsCoordinates();
            }

            if (analyticalAnalyser == null)
            {
                analyticalAnalyser = new PMAnalyticalAnalyser();
            }

            // General
            analyticalAnalyser.L = GeneralParams.MotorLength;

            // Stator
            // count of teeth that have flux lines go through
            double Nz = Rotor.GammaM / 180 * Stator.Q / (2 * Rotor.p);
            // teeth length
            double lz = Stator.HS0 + Stator.HS1 + Stator.HS2 + Stator.RS;
            // teeth width
            double wz = Stator.alpha * (2 * Stator.Rinstator + 2 * Stator.HS0 + 2 * Stator.HS1 + Stator.HS2) - (Stator.BS1 + Stator.BS2) / 2;
            // yoke width
            double wy = Stator.Rstator - Stator.xF;
            // yoke length
            double ly = 0.5 * (Stator.DiaYoke - wy) * Math.PI / (2 * Rotor.p);
            // slot width
            double wslot = 2 * Stator.Rinstator * Math.PI / Stator.Q - wz;

            analyticalAnalyser.Sz    = Nz * wz * GeneralParams.MotorLength * 1e-6;
            analyticalAnalyser.Sy    = 2 * wy * GeneralParams.MotorLength * 1e-6;
            analyticalAnalyser.lz    = lz * 1e-3;
            analyticalAnalyser.ly    = ly * 1e-3;
            analyticalAnalyser.Pslot = Constants.mu_0 * wslot * GeneralParams.MotorLength / lz * 1e-3;

            // Rotor
            /////assign for shorten variables
            //material
            double Br   = Rotor.Br;
            double mu_0 = Constants.mu_0;
            double mu_M = Rotor.mu_M;
            double Hc   = Rotor.Hc;
            //stator (may be use a general class to store general data)
            double L = GeneralParams.MotorLength;

            // magnet
            double wm = (Rotor.GammaM / 180 * 2 * Rotor.alpha) * (Rotor.RGap + Rotor.Rrotor) / 2;
            double lm = Rotor.ThickMag;

            // magnet parameters
            analyticalAnalyser.phiR = Br * wm * L * 1e-6;
            analyticalAnalyser.PM   = mu_0 * mu_M * wm * L / lm * 1e-3;
            analyticalAnalyser.Fc   = Hc * lm * 1e-3;

            // leakage path parameters
            analyticalAnalyser.phiHFe = 0;
            analyticalAnalyser.PFe    = 0;
            analyticalAnalyser.Pb     = 0;

            // some sizes (rotor)
            analyticalAnalyser.wm     = wm;
            analyticalAnalyser.lm     = lm;
            analyticalAnalyser.gammaM = Rotor.GammaM;

            // Airgap
            analyticalAnalyser.delta = Airgap.delta;
            analyticalAnalyser.wd    = Rotor.GammaM / 180 * (Rotor.RGap + Airgap.delta / 2) * 2 * Math.PI / (2 * Rotor.p);
            analyticalAnalyser.Pd    = mu_0 * analyticalAnalyser.wd * GeneralParams.MotorLength / (Airgap.delta * Airgap.Kc) * 1e-3;

            // Material (stator considering only)
            analyticalAnalyser.Barray = Stator.BH.Select(p => p.b).ToArray();
            analyticalAnalyser.Harray = Stator.BH.Select(p => p.h).ToArray();

            //other
            analyticalAnalyser.p       = Rotor.p;
            analyticalAnalyser.Q       = Stator.Q;
            analyticalAnalyser.Nstrand = Stator.NStrands;

            // magnet and airgap together
            double wPd = (2 * Rotor.alpha) * (Rotor.RGap + Rotor.Rrotor) / 2;//all arc
            double lPd = lm + Airgap.delta * Airgap.Kc;

            analyticalAnalyser.PMd = mu_0 * mu_M * wPd * L / lPd * 1e-3;
            analyticalAnalyser.PMq = analyticalAnalyser.PMd;

            // set motor
            analyticalAnalyser.Motor = this;

            return(analyticalAnalyser);
        }
Example #2
0
        public override AbstractAnalyticalAnalyser GetAnalyticalAnalyser()
        {
            if (!isPointsCoordCalculated)
            {
                CalcPointsCoordinates();
            }

            if (analyticalAnalyser == null)
            {
                analyticalAnalyser = new PMAnalyticalAnalyser();
            }

            // General
            analyticalAnalyser.L = GeneralParams.MotorLength;

            // Stator
            // count of teeth that have flux lines go through
            double Nz = Rotor.gammaMedeg / 180 * Stator.Q / (2 * Rotor.p);
            // teeth length
            double lz = Stator.HS0 + Stator.HS1 + Stator.HS2 + Stator.RS;
            // teeth width
            double wz = Stator.alpha * (2 * Stator.Rinstator + 2 * Stator.HS0 + 2 * Stator.HS1 + Stator.HS2) - (Stator.BS1 + Stator.BS2) / 2;
            // yoke width
            double wy = Stator.Rstator - Stator.xF;
            // yoke length
            double ly = 0.5 * (Stator.DiaYoke - wy) * Math.PI / (2 * Rotor.p);
            // slot width
            double wslot = 2 * Stator.Rinstator * Math.PI / Stator.Q - wz;

            Console.WriteLine("alphaM = " + (Rotor.alphaM * 180 / Math.PI * 2));

            analyticalAnalyser.Sz    = Nz * wz * GeneralParams.MotorLength * 1e-6;
            analyticalAnalyser.Sy    = 2 * wy * GeneralParams.MotorLength * 1e-6;
            analyticalAnalyser.lz    = lz * 1e-3;
            analyticalAnalyser.ly    = ly * 1e-3;
            analyticalAnalyser.Pslot = Constants.mu_0 * wslot * GeneralParams.MotorLength / lz * 1e-3;

            // Rotor
            /////assign for shorten variables
            //material
            double Br   = Rotor.Br;
            double mu_0 = Constants.mu_0;
            double mu_M = Rotor.mu_M;
            double Bsat = Rotor.Bsat;
            double Hc   = Rotor.Hc;
            //stator (may be use a general class to store general data)
            double L = GeneralParams.MotorLength;

            // magnet
            double wm = Rotor.WidthMag;
            double lm = Rotor.ThickMag;

            //calc sizes of barrier
            double wb1 = Rotor.HRib / 2;
            double lb1 = Math.Sqrt(Math.Pow(Rotor.xA - Rotor.xC, 2) + Math.Pow(Rotor.yA - Rotor.yC, 2));//AC

            if (lb1 < wb1)
            {
                lb1 = wb1;
            }
            double wb2 = Math.Sqrt(Math.Pow(Rotor.xB - Rotor.xE, 2) + Math.Pow(Rotor.yB - Rotor.yE, 2)); //BE
            double lb2 = Rotor.B1;
            double wb3 = Math.Sqrt(Math.Pow(Rotor.xH - Rotor.xJ, 2) + Math.Pow(Rotor.yH - Rotor.yJ, 2)); //GJ
            double lb3 = Rotor.B1;
            double wb4 = (Rotor.yJ + Rotor.yK) / 2;
            double lb4 = Rotor.xK - Rotor.xJ;

            //steel bridge
            double wFe = Rotor.Rrotor - Rotor.R1;
            double lFe = Math.Sqrt(Math.Pow(Rotor.xA - Rotor.xC, 2) + Math.Pow(Rotor.yA - Rotor.yC, 2));//AC

            if (lFe < wFe)
            {
                lFe = wFe;
            }
            double wFe2 = Rotor.yK + Rotor.yJ;
            double lFe2 = Rotor.xK - Rotor.xJ;

            //refine by poletype:
            if (Rotor.Poletype == VPMRotor.PoleType.MiddleAir)//middle is air then no steel
            {
                wFe2 = 0;
            }
            else
            {
                wb4 = 0; //else, no air
            }
            // magnet parameters
            analyticalAnalyser.phiR = Br * wm * L * 1e-6;
            analyticalAnalyser.PM   = mu_0 * mu_M * wm * L / lm * 1e-3;
            analyticalAnalyser.Fc   = Hc * lm * 1e-3;

            // leakage path parameters
            analyticalAnalyser.phiHFe = Bsat * 2 * wFe * L * 1e-6;
            analyticalAnalyser.PFe    = mu_0 * 2 * wFe * L / lFe * 1e-3;
            double Pb1 = mu_0 * wb1 * L / lb1;
            double Pb2 = mu_0 * wb2 * L / lb2;
            double Pb3 = mu_0 * wb3 * L / lb3;
            double Pb4 = mu_0 * wb4 * L / lb4;

            analyticalAnalyser.Pb = 2 * (Pb1 + Pb2 + Pb3 + Pb4) * 1e-3;

            // some sizes (rotor)
            analyticalAnalyser.wm  = wm;
            analyticalAnalyser.lm  = lm;
            analyticalAnalyser.wm2 = 2 * (Math.Sqrt(Math.Pow(Rotor.xC - Rotor.xK, 2) + Math.Pow(Rotor.yC - Rotor.yK, 2))) + 2 * wFe;

            // Airgap
            // calc Kc from other parameters
            //double tz = 2 * Stator.Rinstator * Math.PI / Stator.Q;
            //double bp = wslot;
            //double bp_on_delta = bp / Airgap.delta;
            //double cp = bp_on_delta * bp_on_delta / (5 + bp_on_delta);
            //double kc = tz / (tz - cp * Airgap.delta);
            double kc = Airgap.Kc;

            analyticalAnalyser.delta  = Airgap.delta;
            analyticalAnalyser.wd     = Rotor.gammaMedeg / 180 * (Rotor.Rrotor + Airgap.delta / 2) * 2 * Math.PI / (2 * Rotor.p);
            analyticalAnalyser.Pd     = Constants.mu_0 * analyticalAnalyser.wd * GeneralParams.MotorLength / (Airgap.delta * kc) * 1e-3;
            analyticalAnalyser.gammaM = Rotor.gammaMedeg;

            // Material (stator considering only)
            analyticalAnalyser.Barray = Stator.BH.Select(p => p.b).ToArray();
            analyticalAnalyser.Harray = Stator.BH.Select(p => p.h).ToArray();

            //other
            analyticalAnalyser.p       = Rotor.p;
            analyticalAnalyser.Q       = Stator.Q;
            analyticalAnalyser.Nstrand = Stator.NStrands;

            double wf     = (180 - Rotor.gammaMedeg) / 180.0 * 2 * Rotor.alpha * Rotor.Rrotor;
            double pp     = mu_0 * wf * L / lm * 1e-3;
            double Pdelta = analyticalAnalyser.Pd;// * 180 / Rotor.gammaM;

            analyticalAnalyser.PMd = 1 / (1 / (analyticalAnalyser.PM + analyticalAnalyser.Pb + pp) + 1 / Pdelta);
            analyticalAnalyser.PMq = Pdelta;

            // set motor
            analyticalAnalyser.Motor = this;

            return(analyticalAnalyser);
        }