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