Моделирование математической блочной модели электродвигателя с управляемым током методом modellica.

В своем проекте я управляю двигателем BLDC с его собственным регулятором тока.

Чтобы спроектировать контроллер для двигателя, я применил некоторые временные диаграммы к текущей функции:

для захвата динамики всей системы, а именно двигателя, контроллера / драйвера тока и нагрузки.

J - инерция ротора, [кг * м ^ 2]

r константа демпфирования (линейное трение)

tau - постоянная крутящего момента [Нм / А]

u [t] текущий ввод

der (der (phi)) - угловое ускорение

der (phi) угловая скорость

Установленные значения представляют всю систему более чем достаточно хорошо для «непрерывного» приближения двигателя, нагрузки и регулятора тока / драйвера двигателя. Используя схему управления, я подаю сигнал u (t) в амперах и ожидаю на выходе крутящий момент и угловую скорость. В то время мне нужна была только угловая скорость, но я отвлекся, этот метод работал фантастически, но был адаптирован и разработан в математике.

Я хотел бы построить гораздо более крупную и значительно более сложную роботизированную систему в рамках modelica (в частности, Systemmodeler, библиотеки modelica 3.2.x), однако у меня возникли некоторые проблемы.

Моя первая попытка была:

введите описание изображения здесь

Однако при моделировании этого с другой внешней нагрузкой (внешней моделью) у меня есть много проблем, от некоторых, более опытных, чем я, мне сказали, что эта форма моделирования является «односторонней», а не «методом моделирования», но больше simulink в форме.

А именно, он должен быть двунаправленным, а не только числовым, чтобы правильно реагировать с многотельной внешней моделью, к которой она будет подключаться.

Моя вторая попытка была:

введите описание изображения здесь

Что при подключении к моей более крупной многотельной модели действительно работает больше, чем ожидалось, есть реакция этой модели при приложении внешних крутящих моментов / нагрузок. Однако при моделировании этой модели, чтобы увидеть, как она работает по сравнению с чистой блочной моделью, они никоим образом не совпадают. Мне пришлось потратить много времени, пытаясь подогнать данные по инерции и трению, чтобы получить аналогичные результаты.

Итак, мой вопрос: каков наилучший метод превратить чистые блочные модели (математические) или, по крайней мере, мою чистую блочную модель, в более реалистичную модель или, по крайней мере, соединительные выходы в более реалистичные, или, я думаю, «случайные».

Я бы предпочел не использовать свою вторую попытку, так как я не могу доверять значениям, которые мне пришлось корректировать по сравнению с блоком, чтобы они были действительно правильными, поскольку они не соответствовали значениям реальных данных по сравнению с моей первой моделью.


person morbo    schedule 12.05.2021    source источник


Ответы (1)


В целом затрудняюсь ответить. По сути, вам нужно понять, какая модель соответствует той части системы / уравнения, которую вы хотите моделировать, а затем объединить их, чтобы привести к одинаковому общему поведению.

Исходная модель / уравнение, кажется, состоит из (поправьте меня, если я неправильно понимаю уравнение):

  1. Инерция, соответствующая J * dot(dot(phi))
  2. Линейная модель трения, соответствующая r * dot(phi)
  3. Крутящий момент, возникающий в результате умножения входного сигнала на константу (в данном случае, вероятно, постоянную крутящего момента, умноженную на входной ток), соответствующий tau * u(t)

Если вы не знаете компоненты, я думаю, что нет другого выхода, кроме как потратить время на понимание кода Modelica или, по крайней мере, документации каждого компонента.

Я бы использовал следующие компоненты для описания поведения

  1. Modelica.Mechanics.Rotational.Components.Inertia
  2. Modelica.Mechanics.Rotational.Components.Damper
  3. Это можно сделать, комбинируя Modelica.Blocks.Math.Gain и Modelica.Mechanics.Rotational.Sources.Torque.

Результат:  SignalControlledMotor

В качестве расширения я бы предложил использовать физическую величину (ток) в качестве входных данных. Это можно сделать, изменив модель на:

CurrentControlledMotor

Расширение модели двумя более значимыми компонентами (сопротивление и индуктивность, как указано в первом комментарии) приводит к:

DC_Motor

Примечание. Модель на самом деле представляет собой однофазное представление трехфазного двигателя. Я думаю, что параметры оконечного сопротивления / индуктивности все еще должны быть действительными, но я настоятельно рекомендую проверить модель, например, вычисление скоростей при работе без нагрузки и номинальной нагрузке.

Если вам нужен код, из которого были созданы приведенные выше снимки экрана (с использованием MSL 4.0.0):

package MotorExamples
  model SignalControlledMotor
    extends Modelica.Electrical.Machines.Icons.Machine;

    parameter Real k "Gain value multiplied with input signal";
    parameter Modelica.Units.SI.Inertia J "Moment of inertia";
    parameter Modelica.Units.SI.RotationalDampingConstant d "Damping constant";

    Modelica.Blocks.Interfaces.RealInput u(final unit="A")
      annotation (Placement(transformation(extent={{-140,-20},{-100,20}}), iconTransformation(extent={{-140,-20},{-100,20}})));
    Modelica.Blocks.Math.Gain gain(k=k)
      annotation (Placement(transformation(extent={{-80,-10},{-60,10}})));
    Modelica.Mechanics.Rotational.Sources.Torque torque
      annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));
    Modelica.Mechanics.Rotational.Components.Inertia inertia(J=J)
      annotation (Placement(transformation(extent={{0,-10},{20,10}})));
    Modelica.Mechanics.Rotational.Components.Damper damper(d=d)
      annotation (Placement(transformation(
          extent={{-10,-10},{10,10}},
          rotation=270,
          origin={60,-30})));
    Modelica.Mechanics.Rotational.Interfaces.Flange_a flange "Mechanical flange of motor"
      annotation (Placement(transformation(extent={{90,-10},{110,10}})));
    Modelica.Mechanics.Rotational.Components.Fixed fixed
      annotation (Placement(transformation(extent={{50,-70},{70,-50}})));

  equation 
    connect(gain.u, u) annotation (Line(points={{-82,0},{-120,0}}, color={0,0,127}));
    connect(torque.tau, gain.y) annotation (Line(points={{-42,0},{-59,0}}, color={0,0,127}));
    connect(inertia.flange_a, torque.flange) annotation (Line(points={{0,0},{-20,0}}, color={0,0,0}));
    connect(inertia.flange_b, damper.flange_a) annotation (Line(points={{20,0},{60,0},{60,-20}},
                                                                                        color={0,0,0}));
    connect(damper.flange_a, flange) annotation (Line(points={{60,-20},{60,0},{100,0}},
                                                                               color={0,0,0}));
    connect(damper.flange_b, fixed.flange) annotation (Line(points={{60,-40},{60,-60}}, color={0,0,0}));
    annotation (Icon(graphics={Line(points={{-60,0},{-100,0}}, color={0,0,0})}));
  end SignalControlledMotor;

  model CurrentControlledMotor
    extends Modelica.Electrical.Machines.Icons.Machine;

    parameter Modelica.Units.SI.ElectricalTorqueConstant k "Transformation coefficient";
    parameter Modelica.Units.SI.Inertia J "Moment of inertia";
    parameter Modelica.Units.SI.RotationalDampingConstant d "Damping constant";

    Modelica.Units.SI.Voltage v = p.v - n.v "Terminal voltage";

    Modelica.Electrical.Analog.Basic.RotationalEMF
                                                 emf(k=k)
      annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));
    Modelica.Mechanics.Rotational.Components.Inertia inertia(J=J)
      annotation (Placement(transformation(extent={{0,-10},{20,10}})));
    Modelica.Mechanics.Rotational.Components.Damper damper(d=d)
      annotation (Placement(transformation(
          extent={{-10,-10},{10,10}},
          rotation=270,
          origin={60,-30})));
    Modelica.Mechanics.Rotational.Interfaces.Flange_a flange "Mechanical flange of motor"
      annotation (Placement(transformation(extent={{90,-10},{110,10}})));
    Modelica.Mechanics.Rotational.Components.Fixed fixed
      annotation (Placement(transformation(extent={{50,-70},{70,-50}})));

    Modelica.Electrical.Analog.Interfaces.PositivePin p "Positive electrical pin"
      annotation (Placement(transformation(extent={{-110,50},{-90,70}})));
    Modelica.Electrical.Analog.Interfaces.NegativePin n "Negative electrical pin"
      annotation (Placement(transformation(extent={{-110,-70},{-90,-50}})));
  equation 
    connect(inertia.flange_a, emf.flange) annotation (Line(points={{0,0},{-20,0}}, color={0,0,0}));
    connect(inertia.flange_b, damper.flange_a) annotation (Line(points={{20,0},{60,0},{60,-20}},
                                                                                        color={0,0,0}));
    connect(damper.flange_a, flange) annotation (Line(points={{60,-20},{60,0},{100,0}},
                                                                               color={0,0,0}));
    connect(damper.flange_b, fixed.flange) annotation (Line(points={{60,-40},{60,-60}}, color={0,0,0}));
    connect(emf.p, p) annotation (Line(points={{-30,10},{-30,60},{-100,60}}, color={0,0,255}));
    connect(emf.n, n) annotation (Line(points={{-30,-10},{-30,-60},{-100,-60}}, color={0,0,255}));
    annotation (                                 Icon(graphics={Line(points={{-60,40},{-80,40},{-80,60},{-100,60}},
                                                                                                color={28,108,200}),
                                                                Line(points={{-60,-40},{-80,-40},{-80,-60},{-100,-60}},
                                                                                                color={28,108,200})}));
  end CurrentControlledMotor;

  model DC_Motor
    extends Modelica.Electrical.Machines.Icons.Machine;

    parameter Modelica.Units.SI.ElectricalTorqueConstant k "Transformation coefficient";
    parameter Modelica.Units.SI.Resistance R "Terminal Resistance";
    parameter Modelica.Units.SI.Inductance L "Terminal Inductance";
    parameter Modelica.Units.SI.Inertia J "Moment of inertia";
    parameter Modelica.Units.SI.RotationalDampingConstant d "Damping constant";

    Modelica.Units.SI.Voltage v = p.v - n.v "Terminal voltage";

    Modelica.Electrical.Analog.Basic.RotationalEMF
                                                 emf(k=k)
      annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
    Modelica.Mechanics.Rotational.Components.Inertia inertia(J=J)
      annotation (Placement(transformation(extent={{30,-10},{50,10}})));
    Modelica.Mechanics.Rotational.Components.Damper damper(d=d)
      annotation (Placement(transformation(
          extent={{-10,-10},{10,10}},
          rotation=270,
          origin={70,-30})));
    Modelica.Mechanics.Rotational.Interfaces.Flange_a flange "Mechanical flange of motor"
      annotation (Placement(transformation(extent={{90,-10},{110,10}})));
    Modelica.Mechanics.Rotational.Components.Fixed fixed
      annotation (Placement(transformation(extent={{60,-70},{80,-50}})));

    Modelica.Electrical.Analog.Interfaces.PositivePin p "Positive electrical pin"
      annotation (Placement(transformation(extent={{-110,50},{-90,70}})));
    Modelica.Electrical.Analog.Interfaces.NegativePin n "Negative electrical pin"
      annotation (Placement(transformation(extent={{-110,-70},{-90,-50}})));
    Modelica.Electrical.Analog.Basic.Resistor resistor(R=R) annotation (Placement(transformation(extent={{-80,50},{-60,70}})));
    Modelica.Electrical.Analog.Basic.Inductor inductor(L=L) annotation (Placement(transformation(extent={{-40,50},{-20,70}})));
  equation 
    connect(inertia.flange_a, emf.flange) annotation (Line(points={{30,0},{10,0}}, color={0,0,0}));
    connect(inertia.flange_b, damper.flange_a) annotation (Line(points={{50,0},{70,0},{70,-20}},
                                                                                        color={0,0,0}));
    connect(damper.flange_a, flange) annotation (Line(points={{70,-20},{70,0},{100,0}},
                                                                               color={0,0,0}));
    connect(damper.flange_b, fixed.flange) annotation (Line(points={{70,-40},{70,-60}}, color={0,0,0}));
    connect(emf.n, n) annotation (Line(points={{0,-10},{0,-60},{-100,-60}},     color={0,0,255}));
    connect(resistor.p, p) annotation (Line(points={{-80,60},{-100,60}}, color={0,0,255}));
    connect(emf.p, inductor.n) annotation (Line(points={{0,10},{0,60},{-20,60}}, color={0,0,255}));
    connect(inductor.p, resistor.n) annotation (Line(points={{-40,60},{-60,60}}, color={0,0,255}));
    annotation (                                 Icon(graphics={Line(points={{-60,40},{-80,40},{-80,60},{-100,60}},
                                                                                                color={28,108,200}),
                                                                Line(points={{-60,-40},{-80,-40},{-80,-60},{-100,-60}},
                                                                                                color={28,108,200})}));
  end DC_Motor;

  model Test
    extends Modelica.Icons.Example;
    MotorExamples.SignalControlledMotor signalControlledMotor(
      k=1,
      J=0.1,
      d=1) annotation (Placement(transformation(extent={{-12,70},{8,90}})));
    Modelica.Blocks.Sources.Step step(height=10, startTime=0.1) annotation (Placement(transformation(extent={{-90,70},{-70,90}})));
    CurrentControlledMotor currentControlledMotor(
      k=1,
      J=0.1,
      d=1) annotation (Placement(transformation(extent={{-12,-10},{8,10}})));
    Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrent
      annotation (Placement(transformation(
          extent={{-10,-10},{10,10}},
          rotation=0,
          origin={-40,6})));
    Modelica.Electrical.Analog.Basic.Ground ground annotation (Placement(transformation(extent={{-70,-28},{-50,-6}})));
    DC_Motor               dC_Motor(
      k=1,
      R=1.39,
      L=0.572e-3,
      J=0.1,
      d=1) annotation (Placement(transformation(extent={{-12,-76},{8,-56}})));
    Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrentDC
      annotation (Placement(transformation(
          extent={{-10,-10},{10,10}},
          rotation=0,
          origin={-40,-60})));
    Modelica.Electrical.Analog.Basic.Ground ground1
                                                   annotation (Placement(transformation(extent={{-70,-94},{-50,-72}})));
    Modelica.Blocks.Continuous.FirstOrder firstOrder(T=1e-3) annotation (Placement(transformation(extent={{-60,74},{-48,86}})));
  equation 
    connect(signalCurrent.n, currentControlledMotor.p) annotation (Line(points={{-30,6},{-12,6}},     color={0,0,255}));
    connect(signalCurrent.p, currentControlledMotor.n)
      annotation (Line(points={{-50,6},{-60,6},{-60,-6},{-12,-6}},       color={0,0,255}));
    connect(signalCurrent.p, ground.p) annotation (Line(points={{-50,6},{-60,6},{-60,-6}},      color={0,0,255}));
    connect(signalCurrentDC.p, dC_Motor.n) annotation (Line(points={{-50,-60},{-60,-60},{-60,-72},{-12,-72}}, color={0,0,255}));
    connect(signalCurrentDC.p, ground1.p) annotation (Line(points={{-50,-60},{-60,-60},{-60,-72}}, color={0,0,255}));
    connect(signalCurrentDC.n, dC_Motor.p) annotation (Line(points={{-30,-60},{-12,-60}}, color={0,0,255}));
    connect(step.y, firstOrder.u) annotation (Line(points={{-69,80},{-61.2,80}}, color={0,0,127}));
    connect(firstOrder.y, signalControlledMotor.u) annotation (Line(points={{-47.4,80},{-14,80}}, color={0,0,127}));
    connect(firstOrder.y, signalCurrent.i) annotation (Line(points={{-47.4,80},{-40,80},{-40,18}}, color={0,0,127}));
    connect(firstOrder.y, signalCurrentDC.i)
      annotation (Line(points={{-47.4,80},{-40,80},{-40,40},{-80,40},{-80,-40},{-40,-40},{-40,-48}}, color={0,0,127}));
    annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(coordinateSystem(preserveAspectRatio=false)));
  end Test;
  annotation (uses(Modelica(version="4.0.0")));
end MotorExamples;
person Markus A.    schedule 13.05.2021