НИИЭТ К1921ВГ1Т : Пространственно-векторная ШИМ
SVPWM: заполнение одного канала
Введение
При синусоидальной модуляции фазные заполнения получаются непосредственно из трёх синусоид. В SVPWM к ним можно добавить общий сигнал, не меняющий разностей между фазами. Это позволяет по-другому распределить интервалы переключения и использование диапазона заполнения.
В проекте вычислим такую общую добавку методом min–max и рассмотрим заполнение одной фазы. Для расчёта понадобятся три опоры со сдвигом 120°, а аппаратный результат выведем на один канал PA4. Так удобно изучить форму управляющего сигнала до перехода к многоплечевой силовой схеме.
Постановка задачи и исходные данные
Для фазных опор примем частоту 50 Гц и единичную амплитуду. Фаза A начинается с нуля, B отстаёт на 120°, C опережает на 120°. Несущая аппаратного выхода PA4 равна 20 кГц. Сначала сравним синусоидальную опору и общую добавку, затем посмотрим, какой закон заполнения получается после их сложения.
Для воспроизведения откройте эту папку в Engee. Расчётная модель находится в NIIET05_svpwm_sim.engee, версия для платы – в NIIET05_svpwm_target.engee. Кодовые ячейки ниже выполняются последовательно; путь к моделям определяется каталогом самого скрипта.
Алгоритм
Метод общей min–max добавки является несущей реализацией SVPWM. Опоры нормированы на единицу; ограничение заполнения не достигается при этих настройках.
При данной нормировке диапазон d_A примерно 6,7…93,3%. Общая добавка содержит третью гармонику, но разности a+z-(b+z)=a-b сохраняются. Выход B и C физически не выводятся.
Рисунок 1. Алгоритм работы устройства.
Построение модели в Engee
Три Sine Wave задают опоры: Frequency = 2π·50, Amplitude = 1, SampleTime = 0.0001. Их Phase равны 0, −2π/3 и +2π/3. Понадобятся все три значения, хотя в этом опыте наружу выводится только фаза A.
В MaxABC и MinABC выбираем функции max и min и задаём Inputs = 3. После сложения экстремумов Gain с коэффициентом −0.5 формирует общую добавку z. Затем Modulated_A складывает a и z.
Gain с 50 и Bias с 50 переводят результат в проценты. После ограничения 0…100 и перевода в UInt32 заполнение поступает на PWM. Расчётная модель дополнительно показывает импульсы несущей, чтобы сопоставить изменение z с длительностью высокого уровня.
Рисунок 2. Расчётная модель `NIIET05_svpwm_sim`.Запуск расчёта
Теперь запустим сохранённую модель. Первая ячейка открывает её и задаёт исходные параметры примера, чтобы значения в коде можно было сопоставить с настройками блоков. После engee.run станут доступны временные ряды измеряемых сигналов.
using Plots
demo_dir = @__DIR__
model_name = "NIIET05_svpwm_sim"
if !any(m -> string(m.name) == model_name, engee.get_all_models())
engee.load(joinpath(demo_dir, model_name * ".engee"))
end
engee.open(model_name)
f_signal = 50.0
f_pwm = 20_000.0
for phase in ["A", "B", "C"]
engee.set_param!(model_name * "/Ref_" * phase,
"Frequency" => "2*pi*$(f_signal)")
end
engee.set_param!(model_name * "/CarrierFrequency", "Gain" => string(f_pwm))
engee.run(model_name)
Считаем результаты моделирования. Каждый временной ряд содержит время и значение сигнала.
measurements = Dict(
"Offset" => collect(NIIET05_svpwm_sim_Offset),
"DutyA" => collect(NIIET05_svpwm_sim_DutyA),
"PWMA" => collect(NIIET05_svpwm_sim_PWMA),
"ReferenceA" => collect(NIIET05_svpwm_sim_ReferenceA)
)
nothing
Разбор результатов
На первом графике сопоставим опору с заполнением и общей min–max добавкой.
reference = measurements["ReferenceA"]
offset = measurements["Offset"]
duty = measurements["DutyA"]
p_ref = plot(reference.time, reference.value; ylabel="Опора A", label=false)
p_z = plot(offset.time, offset.value; ylabel="Добавка z", label=false)
p_duty = plot(duty.time, duty.value;
xlabel="Время, с", ylabel="Заполнение A, %", label=false)
niiet_overview = plot(p_ref, p_z, p_duty; layout=(3,1), size=(1100,850), margin=6Plots.mm)
Рисунок 3. Управляющие сигналы и заполнение ШИМ.
Общая добавка меняется в пределах примерно −0,25…0,25. Вместо чистой синусоиды получается характерная форма SVPWM-заполнения. В расчёте минимум dA составил 6,701%, максимум – 93,299%. Разница с округлёнными теоретическими границами определяется временной сеткой 100 мкс.
Смысл общей добавки становится виден при вычитании фаз: z сокращается, и разность остаётся равной a − b. Поэтому изменение фазных заполнений не означает изменения заданной разности опор. Один канал PA4 позволяет наблюдать сам закон заполнения; трёхфазная силовая схема потребует соответствующих выходов остальных плеч.
Рассмотрим 0,5 мс импульсов. На этом коротком окне хорошо различим период несущей 50 мкс. На физическом выходе такие импульсы формирует PWM-периферия микроконтроллера.
panels = []
for phase in ["A"]
pwm = measurements["PWM" * phase]
window = 0.001 .<= pwm.time .<= 0.0015
push!(panels, plot(pwm.time[window], pwm.value[window];
ylabel="PWM " * phase, label=false, seriestype=:steppost))
end
plot!(panels[end]; xlabel="Время, с")
niiet_detail = plot(panels...; layout=(1,1), size=(1100,400), margin=6Plots.mm)
Рисунок 4. Импульсы расчётной ШИМ на увеличенном участке.
Перенос на НИИЭТ
После моделирования перейдём к плате K1921VG1T. В таргетной версии заполнение в процентах поступает в аппаратную PWM-периферию. Математическая часть определяет те же состояния и переходы, которые мы только что рассмотрели на графиках.
Таблица 1. Параметры моделей.
| Параметр | Расчёт в Engee | Выполнение на плате |
|---|---|---|
| Решатель | Euler, фиксированный шаг | Euler, фиксированный шаг |
| Шаг | 5 мкс | 100 мкс |
| Начало | 0 с | 0 с |
| Конец | 0.06 с | 600 с |
Таблица 2. Подключение сигналов платы.
| Сигнал | Вывод микроконтроллера | Назначение |
|---|---|---|
| PWM A | PA4 | Заполнение фазы A, 20 кГц |
В PWM укажем m_port = A, m_pin = 4, m_freq = 20000. Вход duty_percent принимает UInt32: 0 означает 0%, 100 – 100%. Частоту несущей формирует периферия, а модель обновляет заполнение каждые 100 мкс. Номера PA/PB/PC обозначают выводы микроконтроллера. Их расположение на разъёмах следует найти в схеме своей ревизии платы. Для измерения PWM осциллограф подключают между сигнальным выводом и общей землёй.
Перед сборкой настроим EDM-Target-NIIETK1921VG1T. Путь к тулчейну должен указывать на установленную инфраструктуру компьютера стенда. Настройки запуска приведены отдельно, в таблице 3.
Таблица 3. Параметры EDM-Target.
| Поле | Значение |
|---|---|
| Таргет | Niietk1921vg1t |
toolchain_root |
D:\DEMO\NIIET\niietk1291vg1t_infrastructure |
programmer_type |
jlink |
toolchain_via |
auto |
code_gen_path |
. |
com_port |
COM10 |
Для прошивки подключим J-Link и установим соединение с платой в Engee.Интеграциях. Пример запускается независимо от обмена измеренными сигналами с компьютером. Время выполнения таргетной модели задано как StopTime = 600 с; его можно увеличить перед новой сборкой.
Рисунок 5. Таргетная модель `NIIET05_svpwm_target`.В следующей ячейке показана вся последовательность аппаратного запуска: открытие модели, выбор K1921VG1T, генерация кода, сборка, прошивка и старт. Для выполнения на подключённой плате установите PROGRAM_TARGET = true. При обычном повторном расчёте графиков оставьте значение false.
PROGRAM_TARGET = false
if PROGRAM_TARGET
target_name = "NIIET05_svpwm_target"
if !any(m -> string(m.name) == target_name, engee.get_all_models())
engee.load(joinpath(demo_dir, target_name * ".engee"))
end
engee.open(target_name)
model = engee.gcm()
target = Main.EngeeDeviceManager.Targets.NIIETK1921VG1T.Niietk1921vg1t()
Main.EngeeDeviceManager.Targets.generate_executable_code(target, model, false)
Main.EngeeDeviceManager.Targets.compile_model(target, model)
Main.EngeeDeviceManager.Targets.upload_model(target, model)
Main.EngeeDeviceManager.Targets.start_model(target, model, false)
end
Для сравнения с расчётом наблюдайте PA4 осциллографом. На короткой развёртке видна несущая 20 кГц; для оценки огибающей заполнения нужен интервал не менее 20 мс. Приведённые графики получены при моделировании в Engee; результаты измерений физических выходов можно сопоставить с ними в том же масштабе времени.
Выводы
SVPWM-заполнение можно получить через общую min–max добавку. По сравнению с чистой синусоидой меняется форма фазного заполнения, но разности фазных опор сохраняются. Пример одного канала позволяет подробно рассмотреть этот эффект на графиках и на выходе PA4.