Estudio de un motor de continua.

 

Durante mi estudio de Modelica ,tratando de simular un control PID de un motor de contina con un campo formado por un iman permanente,me encuentro ante la necesidad de escribir el modelo del motor.

Trabajar con Modelica es muy complejo, esto se debe que esta tecnologia es reciente y es una forma de programación orientada a objetos, a pesar de esto el metodo presenta muchas ventajas al disenar modelos que combinen sistemas eléctricos y mecánicos, una diferencia se obtiene al escribir las ecuaciones y luego realizar la simulación, que puede llevar muchas horas de trabajo.

En el siguiente codigo se ha resaltado en azul el nombre de los modelos, esto lo he realizado asi para que el lector siga con mas facilidad la cadena de modelos  por ejemplo  model AirGapDC, que a vez depende de otros modelos.

Ver http://www.galileog.com/tecnologia/simulaciones/modelica1.htm ,para una intoduccion en el tema.

 

Se estudia un modelo de un motor de continua, tomado de http://www.control.isy.liu.se/student/tsrt62/Modelica_2_2_1/help/Modelica_Electrical_Machines_BasicMachines_DCMachines.html , el siguiente dibujo seria el modelo a estudiar,

 

 

 

 

La simulacion se arma de la siguiente manera:

 

model AirGapDC "Linear airgap model of a DC machine"

parameter Modelica.SIunits.Inductance Le "Excitation inductance";

parameter Real TurnsRatio

"Ratio of armature turns over number of turns of the excitation winding";

Modelica.SIunits.AngularVelocity w "Angluar velocity";

Modelica.SIunits.Voltage vei

"Voltage drop across field excitation inductance";

Modelica.SIunits.Current ie "Excitation current";

Modelica.SIunits.MagneticFlux psi_e "Excitation flux";

Modelica.SIunits.Voltage vai "Induced armature voltage";

Modelica.SIunits.Current ia "Armature current";

output Modelica.SIunits.Torque tau_electrical;

Modelica.Mechanics.Rotational.Interfaces.Flange_a flange_a;

Modelica.Mechanics.Rotational.Interfaces.Flange_a support

"support at which the reaction torque is acting";

Modelica.Electrical.Analog.Interfaces.PositivePin pin_ap;

Modelica.Electrical.Analog.Interfaces.PositivePin pin_ep;

Modelica.Electrical.Analog.Interfaces.NegativePin pin_an;

Modelica.Electrical.Analog.Interfaces.NegativePin pin_en;

equation

// armature pins

vai = pin_ap.v - pin_an.v;

ia = + pin_ap.i;

ia = - pin_an.i;

// excitation pins

vei = pin_ep.v - pin_en.v;

ie = + pin_ep.i;

ie = - pin_en.i;

// excitation flux: linearly dependent on excitation current

psi_e = Le * ie;

// induced voltage across field excitation inductance

vei = der(psi_e);

// mechanical speed

w = der(flange_a.phi)-der(support.phi);

// induced armature voltage

vai = TurnsRatio * psi_e * w;

// electrical torque (ia is perpendicular to flux)

tau_electrical = TurnsRatio * psi_e * ia;

flange_a.tau = -tau_electrical;

support.tau = tau_electrical;

end AirGapDC;

 

partial model PartialBasicMachine "Partial machine model"

parameter Modelica.SIunits.Inertia J_Rotor "rotor's moment of inertia";

output Modelica.SIunits.Angle phi_mechanical = flange_a.phi

"mechanical angle of rotor against stator";

output Modelica.SIunits.AngularVelocity w_mechanical = der(phi_mechanical)

"mechanical angular velocity of rotor against stator";

output Modelica.SIunits.Conversions.NonSIunits.AngularVelocity_rpm

rpm_mechanical = Modelica.SIunits.Conversions.to_rpm(w_mechanical)

"mechanical speed of rotor against stator [rpm]";

output Modelica.SIunits.Torque tau_electrical = inertiaRotor.flange_a.tau

"electromagnetic torque";

output Modelica.SIunits.Torque tau_shaft = -flange_a.tau "shaft torque";

Modelica.Mechanics.Rotational.Interfaces.Flange_a flange_a;

Modelica.Mechanics.Rotational.Inertia inertiaRotor(final J=J_Rotor);

Modelica.Mechanics.Rotational.Fixed fixedHousing(final phi0=0);

protected

Modelica.Mechanics.Rotational.Interfaces.Flange_b internalSupport;

equation

connect(inertiaRotor.flange_b, flange_a);

connect(internalSupport, fixedHousing.flange_b);

end PartialBasicMachine;

 

model PartialBasicDCMachine "Partial model for DC machine"

extends PartialBasicMachine(J_Rotor=0.15);

output Modelica.SIunits.Voltage va = pin_ap.v-pin_an.v "armature voltage";

output Modelica.SIunits.Current ia = pin_ap.i "armature current";

Modelica.Electrical.Analog.Interfaces.PositivePin pin_ap;

Modelica.Electrical.Analog.Interfaces.NegativePin pin_an;

end PartialBasicDCMachine;

 

model DC_PermanentMagnet "Permanent magnet DC machine"

extends PartialBasicDCMachine;

parameter Modelica.SIunits.Voltage VaNominal=100

"|Nominal parameters|nominal armature voltage";

parameter Modelica.SIunits.Current IaNominal=100

"|Nominal parameters|nominal armature current";

parameter Modelica.SIunits.Conversions.NonSIunits.AngularVelocity_rpm

rpmNominal = 1425 "|Nominal parameters|nominal speed";

parameter Modelica.SIunits.Resistance Ra=0.05

"|Nominal resistances and inductances|warm armature resistance";

parameter Modelica.SIunits.Inductance La=0.0015

"|Nominal resistances and inductances|armature inductance";

protected

constant Modelica.SIunits.Current IeNominal=1 "equivalent excitation current";

constant Modelica.SIunits.Inductance Le=1 "arbitrary excitation inductance";

parameter Real TurnsRatio=

(VaNominal-Ra*IaNominal)/(Modelica.SIunits.Conversions.from_rpm(rpmNominal)*Le*IeNominal)

"Ratio of armature turns over number of turns of the excitation winding";

public

Modelica.Electrical.Analog.Basic.Resistor ra(final R=Ra);

Modelica.Electrical.Analog.Basic.Inductor la(final L=La);

 

AirGapDC airGapDC(final Le=Le, final

TurnsRatio=TurnsRatio);

 

Modelica.Electrical.Analog.Basic.Ground eGround;

Modelica.Electrical.Analog.Sources.ConstantCurrent ie(I=IeNominal);

 

equation

assert(VaNominal > Ra*IaNominal, "VaNominal has to be > (Ra+Re)*IaNominal");

connect(la.p, ra.n);

connect(pin_ap, ra.p);

connect(la.n, airGapDC.pin_ap);

connect(airGapDC.pin_an, pin_an);

connect(airGapDC.pin_en, eGround.p);

connect(airGapDC.pin_ep, ie.n);

connect(eGround.p, ie.p);

connect(airGapDC.flange_a, inertiaRotor.flange_a);

connect(airGapDC.support, internalSupport);

end DC_PermanentMagnet;

 

 

model motor

DC_PermanentMagnet M;

Modelica.Electrical.Analog.Basic.Ground ground;

Modelica.Electrical.Analog.Sources.ConstantVoltage constantVoltage;

equation

connect(constantVoltage.n, ground.p) ;

connect(constantVoltage.p, M.pin_ap) ;

connect(M.pin_an, ground.p) ;

end motor;

 

luego cuando realizo la simulacion con Open Source Edition version 4.3.2, tomado de Modelica research at PELAB,

http://www.ida.liu.se/labs/pelab/modelica/index.shtml , tenga en cuenta el lector que primero hago un copy-paste del anterior codigo y luego le agrego lo siguiente,

 

Ok

>> loadModel(Modelica)

true

 

>> simulate (motor)

record

resultFile = "motor_res.plt"

end record

>> plot (M.w_mechanical)

true

 

 

 

Esta representación es igual a la obtenida con Dymola , que permite probar una versión grafica muy limitada.

 

Eduardo Ghershman , 30.8.08