Документация Engee
Notebook

Определение параметров синхронного двигателя с постоянными магнитами (PMSM) на экспериментальном стенде

При работе c реальными двигателями часто бывает, что в технической документации указаны не все необходимые параметры. В этом примере показано, как определить коэффициент противо-ЭДС и постоянную крутящего момента синхронного двигателя с постоянными магнитами (PMSM), если его потокосцепление неизвестно.

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

In [ ]:
angular_velocity = 5; # рад/с

Экспериментальный стенд представлен в модели PMSMParameterization.engee маскированной подсистемой.
Как и при реальных экспериментальных измерениях, сигнал напряжения зашумлен.

PMSMParameterization--1790948367664.png

Ниже показана модель на основе блока PMSM (библиотека Физическое моделирование/Электричество/Электрические машины/С постоянными магнитами).

Недостающие параметры блока PMSM мы определим в этом примере.

image_2.png

В настройках блока можно выбрать способ Параметризации магнитного потока постоянных магнитов. Можно задать:

  • потокосцепление (Specify flux linkage),
  • постоянную крутящего момента (Specify torque constant)
  • коэффициент противо-ЭДС (Specify back EMF constant).

Выберем Задать коэффициент противо-ЭДС. Коэффициент противо-ЭДС неизвестен, поэтому сначала зададим ему произвольное значение:

In [ ]:
Ke = 0.1;  # В*с/рад.

Запуск модели:

In [ ]:
engee.addpath(@__DIR__)
if "PMSMParameterization" in [m.name for m in engee.get_all_models()]
    m = engee.open( "PMSMParameterization" ) # загрузка модели
else
    m = engee.load( "PMSMParameterization.engee" )
end
results1 = engee.run(m, verbose=true)
Building...
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    run_id => 1,
    "I_exp" => WorkspaceArray{Float64}("PMSMParameterization/I_exp")
,
    "T_exp" => WorkspaceArray{Float64}("PMSMParameterization/T_exp")
,
    "V_model" => WorkspaceArray{Float64}("PMSMParameterization/V_model")
,
    "V_exp" => WorkspaceArray{Float64}("PMSMParameterization/V_exp")
,
    "I_model" => WorkspaceArray{Float64}("PMSMParameterization/I_model")

)

Чтение данных из модели:

In [ ]:
t = collect(results1["V_exp"]).time;             # Время
V_model  = collect(results1["V_model"]).value;   # Напряжение измеренное в модели PMSM
V_exp = collect(results1["V_exp"]).value;        # Напряжение c экспериментальной установки

Построим графики напряжения на обмотке фазы a экспериментального двигателя и его модели. Амплитуды напряжений заметно различаются, поскольку значение коэффициента противо-ЭДС задано произвольно.

In [ ]:
using Plots
plotlyjs();
plot(t, V_exp, title="Эксперимент", xlabel="Время, c", ylabel="Напряжение, В", w = 2, label="Экспериментальная установка")
plot!(t, V_model, title="Модель", xlabel="Время, c", ylabel="Напряжение, В", w = 2, label="Модель PMSM")
Out[0]:

Расчет коэффициента противо-ЭДС

Коэффициент противо-ЭДС можно рассчитать по формуле:


– пиковое значение напряжения на обмотке фазы a;
– угловая скорость вращения ротора.

Формула справедлива при пренебрежимо малом токе в обмотках статора. В модели каждая фаза соединена с землёй через сопротивление Ом, что приближает условия измерения к режиму разомкнутой цепи.

Пиковое значение напряжения оценивают как половину разности максимального и минимального значений сигнала. Для уменьшения влияния высокочастотного шума предварительно отфильтруем измеренное напряжение.

In [ ]:
# фильтрация измеряемого сигнала напряжения:
using DSP
window_size = 100;
# Расчёт пикового значения напряжения на обмотке фазы a
V_exp_filt = filt(ones(window_size) / window_size, 1, V_exp);
V_a_peak = (maximum(V_exp_filt)-minimum(V_exp_filt))/2;

Рассчитаем коэффициент противо-ЭДС:

In [ ]:
Ke = V_a_peak / angular_velocity;
println("Коэффициента противо-ЭДС: $Ke В∙с/рад")
Коэффициента противо-ЭДС: 0.18476486146112153 В∙с/рад

Запустим модель с рассчитанным значением коэффициента противо-ЭДС.

In [ ]:
results2 = engee.run(m, verbose=true)
Building...
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    run_id => 2,
    "I_exp" => WorkspaceArray{Float64}("PMSMParameterization/I_exp")
,
    "T_exp" => WorkspaceArray{Float64}("PMSMParameterization/T_exp")
,
    "V_model" => WorkspaceArray{Float64}("PMSMParameterization/V_model")
,
    "V_exp" => WorkspaceArray{Float64}("PMSMParameterization/V_exp")
,
    "I_model" => WorkspaceArray{Float64}("PMSMParameterization/I_model")

)
In [ ]:
if "PMSMParameterization" in [m.name for m in engee.get_all_models()]
    m = engee.open("PMSMParameterization") # загрузка модели
else
    m = engee.load("PMSMParameterization.engee")
end
results2 = engee.run(m, verbose=true)
Building...
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    run_id => 3,
    "I_exp" => WorkspaceArray{Float64}("PMSMParameterization/I_exp")
,
    "T_exp" => WorkspaceArray{Float64}("PMSMParameterization/T_exp")
,
    "V_model" => WorkspaceArray{Float64}("PMSMParameterization/V_model")
,
    "V_exp" => WorkspaceArray{Float64}("PMSMParameterization/V_exp")
,
    "I_model" => WorkspaceArray{Float64}("PMSMParameterization/I_model")

)

Чтение данных из модели:

In [ ]:
t = collect(results2["V_exp"]).time;             # Время
V_model  = collect(results2["V_model"]).value;   # Напряжение измеренное в модели PMSM
V_exp = collect(results2["V_exp"]).value;        # Напряжение c экспериментальной установки
In [ ]:
plot(t, V_exp, title="Эксперимент", xlabel="Время, c", ylabel="Напряжение, В", w = 2, label="Экспериментальная установка")
plot!(t, V_model, title="Модель", xlabel="Время, c", ylabel="Напряжение, В", w = 2, label="Модель PMSM")
Out[0]:

После расчёта коэффициента противо-ЭДС напряжения на обмотке фазы a экспериментального двигателя и модели близки по форме и амплитуде.

Расчет постоянной крутящего момента

Другой способ параметризовать потокосцепление - выбрать в настройках блока PMSM для Permanent magnet flux linkage parameterization константу крутящего момента (Specify torque constant).
В этом примере, мы не будем менять эту настройку в модели, но рассмотрим процесс расчета константы крутящего момента:

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

— пиковое значение тока в обмотке фазы a ;

—крутящий момент, приложенный к валу двигателя.

Чтение данных из модели:

In [ ]:
I_model  = collect(results2["I_model"]).value;   # Ток измеренное в модели PMSM
I_exp = collect(results2["I_exp"]).value;        # Ток c экспериментальной установки
T_exp = collect(results2["T_exp"]).value;        # Момент на реальном двигателе
In [ ]:
using Statistics
T = abs(mean(T_exp));
window_size = 1000;
I_exp_filt = filt(ones(window_size) / window_size, 1, I_exp);
I_exp_peak = (maximum(I_exp_filt)-minimum(I_exp_filt))/2;
Kt = 2/3*T/I_exp_peak;
println("Константа крутящего момента: $Kt Н∙м/А")
Константа крутящего момента: 0.1816540795303888 Н∙м/А

Сравним токи в обмотке фазы a экспериментального двигателя и модели:

In [ ]:
plot(t, I_exp, title="Эксперимент", xlabel="Время, c", ylabel="Ток, А", w = 2, label="Экспериментальная установка")
plot!(t, I_model, title="Модель", xlabel="Время, c", ylabel="Ток, А", w = 2, label="Модель PMSM")
Out[0]:

Рассчитанные коэффициент противо-ЭДС и постоянная крутящего момента имеют близкие численные значения: и , так как они связаны с потокосцеплением постоянных магнитов через число пар полюсов двигателя :