• 直流电机调速仿真作业


    直流电机调速仿真作业

    左学敏 机卓1301 U201310892

    一、 重写调速控制器模型Controller

    使用速度环和电流环双环控制,原理图如下:

    现有模型中,仅使用速度环,且控制器内仅使用P控制。

    首先,引入电流环,因为电流传感器测得电压值已经定义为SensorCurrent直接使用该变量。将控制器内反馈变量feedback改为两个反馈变量feedbackv和feedbacki,分别用于表示转速和电流的反馈值。

    电流环和速度环均使用PI控制,分别定义常数Kp和Ki的值,列出相关方程,修改后控制器模型如下:

    block Controller

    InPort command(n=1);

    InPort feedbackv(n=1);

    InPort feedbacki(n=1);

    OutPort outPort(n=1);

    Real errorv;

    Real errorvi;

    Real errori;

    Real errorii;

    Real vout;

    Real pout;

    parameter Real Kp1=80;

    parameter Real Ki1=15;

    parameter Real Kp2=20;

    parameter Real Ki2=5;

    parameter Real Max_Output_Pos = 10;

    parameter Real Max_Output_Neg = -10;

    equation

    errorv = command.signal[1] - feedbackv.signal[1];

    errorv = der(errorvi);

    vout = Kp1 * errorv + Ki1 * errorvi;

    errori = vout - feedbacki.signal[1];

    errori = der(errorii);

    pout = Kp2 * errori + Ki2 * errorii;

    if pout > Max_Output_Pos then

    outPort.signal[1] = Max_Output_Pos;

    elseif pout < Max_Output_Neg then

    outPort.signal[1] = Max_Output_Neg;

    else

    outPort.signal[1] = pout;

    end if;

    end Controller;

    重写控制器后,由于控制器内额外增加了电流环的内容,所以在最后的调速系统DCMotorControlSystem中添加接口定义,修改后的代码为:

    model DCMotorControlSystem

    Ground ground1;

    Inertia inertia1(J = 3, w(fixed = true));

    DCMotor motor1(J = 1,R = 0.6,L = 0.01,Kt=1.8, Ke= 1.8,rotFlange_b(phi(fixed = true)));

    CommandSignalGenerator sg1;

    Controller con1;

    PWMVoltageSource PowerSource1;

    equation

    connect(sg1.outPort, con1.command);

    connect(con1.feedbackv, motor1.SensorVelocity);

    connect(con1.feedbacki, motor1.SensorCurrent);

    connect(con1.outPort, PowerSource1.Command);

    connect(PowerSource1.p, motor1.p);

    connect(motor1.rotFlange_b, inertia1.rotFlange_a);

    connect(PowerSource1.n, ground1.p);

    connect(ground1.p, motor1.n);

    end DCMotorControlSystem;

    进行参数整定,直到获得较理想的转速图和电流图,运行后图像为:

    此时,稳态速度误差较小,电流平稳变化,满足要求。

    二、 提高要求——引入阻尼弹簧系统

    电机和惯量负载通过阻尼弹簧系统相连,阻尼系数d=0.2,弹簧系数c=10。首先在单位定义模块新增两个新数据类型:

    type DampingFactor = Real(quantity = "DampingFactor", unit = "N.m/(rad/s)");

    type SpringConstant = Real(quantity = "SpringConstant", unit = "N.m/rad");

    原模型中,电机和惯量负载通过法兰刚性连接,连接部分定义为Rigid,引入阻尼弹簧系统后,重新定义连接部分,新写了一个连接,定义为Dampingspring,其内容如下:

    partial model Dampingspring

    parameter DampingFactor d = 0.2;

    parameter SpringConstant c = 10;

    Angle phi;

    Angle phic;

    Angle phid;

    equation

    phi = phic + phid;

    end Dampingspring;

    本次控制中使用的是较为常见的弹簧 – 质量 – 阻尼模型,电机轴接弹簧,弹簧接惯量负载,惯量负载再接阻尼器。

    模型中,phi对应电机轴转过角度,phic对应弹簧两端转过角度之差,phid对应阻尼器两端转过角度之差。

    分别将惯量负载模型Inertia和电机模型DCmotor中引入的刚性连接Rigid模型改为阻尼弹簧模型Dampingspring,重写转矩平衡方程。

    对于惯量负载模型Inertia

    model Inertia "1D rotational component with inertia"

    extends Dampingspring;

    parameter MomentOfInertia J = 1 "Moment of inertia";

    AngularVelocity w "Absolute angular velocity of component";

    AngularAcceleration a "Absolute angular acceleration of component";

    equation

    w = der(phid);

    a = der(w);

    J*a = c*phic - d*w;

    end Inertia;

    对于电机模型DCmotor

    model DCMotor "DC Motor"

    extends TwoPin;

    extends Dampingspring;

    OutPort SensorVelocity(n=1);

    OutPort SensorCurrent(n=1);

    parameter MomentOfInertia J"Total Inertia";

    parameter Resistance R"Armature Resistance";

    parameter Inductance L"Armature Inductance";

    parameter Real Kt"Torque Constant";

    parameter Real Ke"EMF Constant";

    AngularVelocity w "Angular velocity of motor";

    AngularAcceleration a "Absolute angular acceleration of motor";

    Torque tau_motor;

    equation

    w = der(phi);

    a = der(w);

    v = R*i+Ke*w+L*der(i);

    tau_motor = Kt*i;

    J*a = tau_motor - c*phic;

    SensorVelocity.signal[1] = w;

    SensorCurrent.signal[1] = i;

    end DCMotor;

    控制器结构不变,调速系统接口定义稍作调整,如下:

    model DCMotorControlSystem

    Ground ground1;

    Inertia inertia1(J = 3, w(fixed = true));

    DCMotor motor1(J = 1,R = 0.6,L = 0.01,Kt=1.8, Ke= 1.8, phi(fixed = true));

    CommandSignalGenerator sg1;

    Controller con1;

    PWMVoltageSource PowerSource1;

    equation

    connect(sg1.outPort, con1.command);

    connect(con1.feedbackv, motor1.SensorVelocity);

    connect(con1.feedbacki, motor1.SensorCurrent);

    connect(con1.outPort, PowerSource1.Command);

    connect(PowerSource1.p, motor1.p);

    connect(motor1.phi, inertia1.phi);

    connect(motor1.phic, inertia1.phic);

    connect(PowerSource1.n, ground1.p);

    connect(ground1.p, motor1.n);

    end DCMotorControlSystem;

    运行成功后,进行控制器参数整定,最终在Kp1=75Ki1=5Kp2=50Ki2=15时得到较理想图像,如下图:

    由图像可看出,增加了阻尼弹簧系统之后,电流变得不稳定,出现较大波动,转速则出现上漂现象,调大增益值Kp之后上漂现象有所缓解,但是电流值图像出现较多毛刺。

    三、附完整代码

    1. 仅重写控制器,未引入阻尼弹簧:

    type ElectricPotential = Real;

    type ElectricCurrent = Real(quantity = "ElectricCurrent", unit = "A");

    type Resistance = Real(quantity = "Resistance", unit = "Ohm", min = 0);

    type Inductance = Real(quantity = "Inductance", unit = "H", min = 0);

    type Voltage = ElectricPotential;

    type Current = ElectricCurrent;

     

    type Force = Real(quantity = "Force", unit = "N");

    type Angle = Real(quantity = "Angle", unit = "rad", displayUnit = "deg");

    type Torque = Real(quantity = "Torque", unit = "N.m");

    type AngularVelocity = Real(quantity = "AngularVelocity", unit = "rad/s", displayUnit = "rev/min");

    type AngularAcceleration = Real(quantity = "AngularAcceleration", unit = "rad/s2");

    type MomentOfInertia = Real(quantity = "MomentOfInertia", unit = "kg.m2");

     

    type Time = Real (final quantity="Time", final unit="s");

     

    connector RotFlange_a "1D rotational flange (filled square)"

    Angle phi "Absolute rotational angle of flange";

    flow Torque tau "Torque in the flange";

    end RotFlange_a; //From Modelica.Mechanical.Rotational.Interfaces

     

    connector RotFlange_b "1D rotational flange (filled square)"

    Angle phi "Absolute rotational angle of flange";

    flow Torque tau "Torque in the flange";

    end RotFlange_b; //From Modelica.Mechanical.Rotational.Interfaces

     

    connector Pin "Pin of an electrical component"

    Voltage v "Potential at the pin";

    flow Current i "Current flowing into the pin";

    end Pin; //From Modelica.Electrical.Analog.Interfaces

     

    connector PositivePin "Positive pin of an electrical component"

    Voltage v "Potential at the pin";

    flow Current i "Current flowing into the pin";

    end PositivePin; //From Modelica.Electrical.Analog.Interfaces

     

    connector NegativePin "Negative pin of an electrical component"

    Voltage v "Potential at the pin";

    flow Current i "Current flowing into the pin";

    end NegativePin; //From Modelica.Electrical.Analog.Interfaces

     

     

     

    connector InPort "Connector with input signals of type Real"

    parameter Integer n = 1 "Dimension of signal vector";

    input Real signal[n] "Real input signals";

    end InPort; // From Modelica.Blocks.Interfaces

     

    connector OutPort "Connector with output signals of type Real"

    parameter Integer n = 1 "Dimension of signal vector";

    output Real signal[n] "Real output signals";

    end OutPort; // From Modelica.Blocks.Interfaces

    partial model Rigid // Rotational class Rigid

    "Base class for the rigid connection of two rotational 1D flanges"

    Angle phi "Absolute rotation angle of component";

    RotFlange_a rotFlange_a "(left) driving flange (axis directed into plane)";

    RotFlange_b rotFlange_b "(right) driven flange (axis directed out of plane)";

    equation

    rotFlange_a.phi = phi;

    rotFlange_b.phi = phi;

    end Rigid; // From Modelica.Mechanics.Rotational.Interfaces

     

    model Inertia "1D rotational component with inertia"

    extends Rigid;

    parameter MomentOfInertia J = 1 "Moment of inertia";

    AngularVelocity w "Absolute angular velocity of component";

    AngularAcceleration a "Absolute angular acceleration of component";

    equation

    w = der(phi);

    a = der(w);

    J*a = rotFlange_a.tau + rotFlange_b.tau;

    end Inertia; //From Modelica.Mechanics.Rotational

     

    partial model TwoPin // Same as OnePort in Modelica.Electrical.Analog.Interfaces

    "Component with two electrical pins p and n and current i from p to n"

    Voltage v "Voltage drop between the two pins (= p.v - n.v)";

    Current i "Current flowing from pin p to pin n";

    PositivePin p;

    NegativePin n;

    equation

    v = p.v - n.v;

    0 = p.i + n.i;

    i = p.i;

    end TwoPin;

     

    model DCMotor "DC Motor"

    extends TwoPin;

    extends Rigid;

    OutPort SensorVelocity(n=1);

    OutPort SensorCurrent(n=1);

    parameter MomentOfInertia J"Total Inertia";

    parameter Resistance R"Armature Resistance";

    parameter Inductance L"Armature Inductance";

     

    parameter Real Kt"Torque Constant";

    parameter Real Ke"EMF Constant";

     

    AngularVelocity w "Angular velocity of motor";

    AngularAcceleration a "Absolute angular acceleration of motor";

    Torque tau_motor;

    RotFlange_b rotFlange_b; // Rotational Flange_b

    equation

     

    w = der(rotFlange_b.phi);

    a = der(w);

    v = R*i+Ke*w+L*der(i);

    tau_motor = Kt*i;

    J*a = tau_motor + rotFlange_b.tau;

    SensorVelocity.signal[1] = w;

    SensorCurrent.signal[1] = i;

    end DCMotor;

     

     

     

    class Resistor "Ideal linear electrical Resistor"

    extends TwoPin; // Same as OnePort

    parameter Real R(unit = "Ohm") "Resistance";

    equation

    R*i = v;

    end Resistor; // From Modelica.Electrical.Analog.Basic

     

    class Inductor "Ideal linear electrical Inductor"

    extends TwoPin; // Same as OnePort

    parameter Real L(unit = "H") "Inductance";

    equation

    v = L*der(i);

    end Inductor; // From Modelica.Electrical.Analog.Basic

     

    class Ground "Ground node"

    Pin p;

    equation

    p.v = 0;

    end Ground; // From Modelica.Electrical.Analog.Basic

     

    model PWMVoltageSource

    extends TwoPin;

    InPort Command(n=1);

     

     

    parameter Time T = 0.003;

    parameter Voltage Vin = 200;

    equation

     

    T*der(v)+ v = Vin*Command.signal[1]/10;

     

    end PWMVoltageSource;

     

    block Controller

    InPort command(n=1);

    InPort feedbackv(n=1);

    InPort feedbacki(n=1);

    OutPort outPort(n=1);

     

    Real errorv;

    Real errorvi;

    Real errori;

    Real errorii;

    Real vout;

    Real pout;

     

    parameter Real Kp1=80;

    parameter Real Ki1=15;

    parameter Real Kp2=20;

    parameter Real Ki2=5;

     

    parameter Real Max_Output_Pos = 10;

    parameter Real Max_Output_Neg = -10;

     

    equation

     

    errorv = command.signal[1] - feedbackv.signal[1];

    errorv = der(errorvi);

    vout = Kp1 * errorv + Ki1 * errorvi;

    errori = vout - feedbacki.signal[1];

    errori = der(errorii);

    pout = Kp2 * errori + Ki2 * errorii;

     

     

    if pout > Max_Output_Pos then

    outPort.signal[1] = Max_Output_Pos;

    elseif pout < Max_Output_Neg then

    outPort.signal[1] = Max_Output_Neg;

    else

    outPort.signal[1] = pout;

    end if;

    end Controller;

     

    block CommandSignalGenerator

    OutPort outPort(n=1);

    Real acc;

    equation

     

    if time <= 1 then

    acc =60;

    elseif time <3 then

    acc = 0;

    elseif time <4 then

    acc = -60;

    else

    acc = 0;

    end if;

     

    der(outPort.signal[1]) = acc;

    end CommandSignalGenerator;

    model DCMotorControlSystem

     

    Ground ground1;

    Inertia inertia1(J = 3, w(fixed = true));

    DCMotor motor1(J = 1,R = 0.6,L = 0.01,Kt=1.8, Ke= 1.8,rotFlange_b(phi(fixed = true)));

    CommandSignalGenerator sg1;

    Controller con1;

    PWMVoltageSource PowerSource1;

    equation

    connect(sg1.outPort, con1.command);

    connect(con1.feedbackv, motor1.SensorVelocity);

    connect(con1.feedbacki, motor1.SensorCurrent);

    connect(con1.outPort, PowerSource1.Command);

    connect(PowerSource1.p, motor1.p);

    connect(motor1.rotFlange_b, inertia1.rotFlange_a);

    connect(PowerSource1.n, ground1.p);

    connect(ground1.p, motor1.n);

    end DCMotorControlSystem;

    simulate( DCMotorControlSystem, stopTime=5 )

    plot({motor1.i,motor1.w})

    2. 引入阻尼弹簧系统

    type ElectricPotential = Real;

    type ElectricCurrent = Real(quantity = "ElectricCurrent", unit = "A");

    type Resistance = Real(quantity = "Resistance", unit = "Ohm", min = 0);

    type Inductance = Real(quantity = "Inductance", unit = "H", min = 0);

    type Voltage = ElectricPotential;

    type Current = ElectricCurrent;

     

    type Force = Real(quantity = "Force", unit = "N");

    type Angle = Real(quantity = "Angle", unit = "rad", displayUnit = "deg");

    type Torque = Real(quantity = "Torque", unit = "N.m");

    type AngularVelocity = Real(quantity = "AngularVelocity", unit = "rad/s", displayUnit = "rev/min");

    type AngularAcceleration = Real(quantity = "AngularAcceleration", unit = "rad/s2");

    type MomentOfInertia = Real(quantity = "MomentOfInertia", unit = "kg.m2");

     

    type Time = Real (final quantity="Time", final unit="s");

     

    type DampingFactor = Real(quantity = "DampingFactor", unit = "N.m/(rad/s)");

    type SpringConstant = Real(quantity = "SpringConstant", unit = "N.m/rad");

     

    connector RotFlange_a "1D rotational flange (filled square)"

    Angle phi "Absolute rotational angle of flange";

    flow Torque tau "Torque in the flange";

    end RotFlange_a; //From Modelica.Mechanical.Rotational.Interfaces

     

    connector RotFlange_b "1D rotational flange (filled square)"

    Angle phi "Absolute rotational angle of flange";

    flow Torque tau "Torque in the flange";

    end RotFlange_b; //From Modelica.Mechanical.Rotational.Interfaces

     

    connector Pin "Pin of an electrical component"

    Voltage v "Potential at the pin";

    flow Current i "Current flowing into the pin";

    end Pin; //From Modelica.Electrical.Analog.Interfaces

     

    connector PositivePin "Positive pin of an electrical component"

    Voltage v "Potential at the pin";

    flow Current i "Current flowing into the pin";

    end PositivePin; //From Modelica.Electrical.Analog.Interfaces

     

    connector NegativePin "Negative pin of an electrical component"

    Voltage v "Potential at the pin";

    flow Current i "Current flowing into the pin";

    end NegativePin; //From Modelica.Electrical.Analog.Interfaces

     

     

     

    connector InPort "Connector with input signals of type Real"

    parameter Integer n = 1 "Dimension of signal vector";

    input Real signal[n] "Real input signals";

    end InPort; // From Modelica.Blocks.Interfaces

     

    connector OutPort "Connector with output signals of type Real"

    parameter Integer n = 1 "Dimension of signal vector";

    output Real signal[n] "Real output signals";

    end OutPort; // From Modelica.Blocks.Interfaces

    partial model Dampingspring

    parameter DampingFactor d = 0.2;

    parameter SpringConstant c = 10;

    Angle phi;

    Angle phic;

    Angle phid;

    equation

    phi = phic + phid;

    end Dampingspring;

    model Inertia "1D rotational component with inertia"

    extends Dampingspring;

    parameter MomentOfInertia J = 1 "Moment of inertia";

    AngularVelocity w "Absolute angular velocity of component";

    AngularAcceleration a "Absolute angular acceleration of component";

    equation

    w = der(phid);

    a = der(w);

    J*a = c*phic - d*w;

    end Inertia; //From Modelica.Mechanics.Rotational

     

    partial model TwoPin // Same as OnePort in Modelica.Electrical.Analog.Interfaces

    "Component with two electrical pins p and n and current i from p to n"

    Voltage v "Voltage drop between the two pins (= p.v - n.v)";

    Current i "Current flowing from pin p to pin n";

    PositivePin p;

    NegativePin n;

    equation

    v = p.v - n.v;

    0 = p.i + n.i;

    i = p.i;

    end TwoPin;

     

    model DCMotor "DC Motor"

    extends TwoPin;

    extends Dampingspring;

    OutPort SensorVelocity(n=1);

    OutPort SensorCurrent(n=1);

    parameter MomentOfInertia J"Total Inertia";

    parameter Resistance R"Armature Resistance";

    parameter Inductance L"Armature Inductance";

     

    parameter Real Kt"Torque Constant";

    parameter Real Ke"EMF Constant";

     

    AngularVelocity w "Angular velocity of motor";

    AngularAcceleration a "Absolute angular acceleration of motor";

    Torque tau_motor;

    equation

    w = der(phi);

    a = der(w);

    v = R*i+Ke*w+L*der(i);

    tau_motor = Kt*i;

    J*a = tau_motor - c*phic;

    SensorVelocity.signal[1] = w;

    SensorCurrent.signal[1] = i;

    end DCMotor;

     

     

     

    class Resistor "Ideal linear electrical Resistor"

    extends TwoPin; // Same as OnePort

    parameter Real R(unit = "Ohm") "Resistance";

    equation

    R*i = v;

    end Resistor; // From Modelica.Electrical.Analog.Basic

     

    class Inductor "Ideal linear electrical Inductor"

    extends TwoPin; // Same as OnePort

    parameter Real L(unit = "H") "Inductance";

    equation

    v = L*der(i);

    end Inductor; // From Modelica.Electrical.Analog.Basic

     

    class Ground "Ground node"

    Pin p;

    equation

    p.v = 0;

    end Ground; // From Modelica.Electrical.Analog.Basic

     

    model PWMVoltageSource

    extends TwoPin;

    InPort Command(n=1);

     

     

    parameter Time T = 0.003;

    parameter Voltage Vin = 200;

    equation

     

    T*der(v)+ v = Vin*Command.signal[1]/10;

     

    end PWMVoltageSource;

     

    block Controller

    InPort command(n=1);

    InPort feedbackv(n=1);

    InPort feedbacki(n=1);

    OutPort outPort(n=1);

     

    Real errorv;

    Real errorvi;

    Real errori;

    Real errorii;

    Real vout;

    Real pout;

     

    parameter Real Kp1=75;

    parameter Real Ki1=5;

    parameter Real Kp2=50;

    parameter Real Ki2=15;

     

    parameter Real Max_Output_Pos = 10;

    parameter Real Max_Output_Neg = -10;

     

    equation

     

    errorv = command.signal[1] - feedbackv.signal[1];

    errorv = der(errorvi);

    vout = Kp1 * errorv + Ki1 * errorvi;

    errori = vout - feedbacki.signal[1];

    errori = der(errorii);

    pout = Kp2 * errori + Ki2 * errorii;

     

     

    if pout > Max_Output_Pos then

    outPort.signal[1] = Max_Output_Pos;

    elseif pout < Max_Output_Neg then

    outPort.signal[1] = Max_Output_Neg;

    else

    outPort.signal[1] = pout;

    end if;

    end Controller;

     

    block CommandSignalGenerator

    OutPort outPort(n=1);

    Real acc;

    equation

     

    if time <= 1 then

    acc =60;

    elseif time <3 then

    acc = 0;

    elseif time <4 then

    acc = -60;

    else

    acc = 0;

    end if;

     

    der(outPort.signal[1]) = acc;

    end CommandSignalGenerator;

    model DCMotorControlSystem

     

    Ground ground1;

    Inertia inertia1(J = 3, w(fixed = true));

    DCMotor motor1(J = 1,R = 0.6,L = 0.01,Kt=1.8, Ke= 1.8, phi(fixed = true));

    CommandSignalGenerator sg1;

    Controller con1;

    PWMVoltageSource PowerSource1;

    equation

    connect(sg1.outPort, con1.command);

    connect(con1.feedbackv, motor1.SensorVelocity);

    connect(con1.feedbacki, motor1.SensorCurrent);

    connect(con1.outPort, PowerSource1.Command);

    connect(PowerSource1.p, motor1.p);

    connect(motor1.phi, inertia1.phi);

    connect(motor1.phic, inertia1.phic);

    connect(PowerSource1.n, ground1.p);

    connect(ground1.p, motor1.n);

    end DCMotorControlSystem;

    simulate( DCMotorControlSystem, stopTime=5 )

    plot({motor1.i,motor1.w})

  • 相关阅读:
    CentOS 6 + bochs-2.6 + gdb 调试 linux 0.11 —— 成功
    操作系统原理——互斥同步
    CentOS 6 bochs-2.6 gdb 调试 linux 0.11——bochsrc-fd1-gdb.bxrc
    vim+xxd=强大的十六进制编辑器
    【t043】成绩查询
    【u251】心灵的抚慰
    【t041】距离之和
    【t086】防护伞
    Java Web整合开发(37) -- SVN
    ubuntu命令
  • 原文地址:https://www.cnblogs.com/christiana/p/5597502.html
Copyright © 2020-2023  润新知