Слайд 1 Современные методы эффективного управления инверторами напряжения в приводах переменного тока
Структура
типового инвертора напряжения
Классические методы ШИМ-управления инверторами – ассимметричная (фронтовая) и симметричная (центрированная) ШИМ
Принцип широтно-импульсной модуляции базовых векторов («векторной» ШИМ)
Основные состояния инвертора и базовые вектора
ШИМ базовых векторов
Сектора, внутри-секторный угол, компоненты базового вектора
Реализация «векторной» ШИМ на базе центрированной
Реализация «векторной» ШИМ с привязкой к верхней или нижней шине
Преимущества «векторной» ШИМ-модуляции
Слайд 2 ШИМ-модуляция базовых векторов
Структура типового инвертора для управления 3-х фазным двигателем
Слайд 3ШИМ-генератор
Выбор между классической и «векторной» ШИМ-модуляцией
Слайд 4Модуль ШИМ контроллера F28x
Таймер Т1 – является базовым для менеджера событий
A, на базе которого реализуется векторная ШИМ.
T1CON – регистр управления таймером T1.
COMCONA – регистр управления модулем сравнения.
ACTRA – регистр управления блоком формирования вектора и выходной логикой:
– биты 12÷14 (D2, D1, D0) определяют начальный базовый вектор;
– бит 15 (SVRDIR) определяет последовательность перебора базовых векторов (против/по часовой стрелке);
– остальные биты определяют полярность работы выходов PWM1-PWM6
DBTCONA – регистр управления генератором «мёртвого» времени.
Слайд 5Асимметричная ШИМ
Задержка переднего фронта для активного высокого!
Слайд 6Центрированная ШИМ
Задержка заднего фронта для активного низкого!
Слайд 7Состояния инвертора и базовые вектора
Слайд 8Состояния инвертора и базовые вектора
Слайд 9
Векторная ШИМ
Из условия инвариантности мгновенных значений электрических величин:
Слайд 10 ШИМ-модуляция базовых векторов
Базовые вектора- в одной стойке включен только один
ключ
Слайд 12Векторная ШИМ
Для получения синусоидального напряжения постоянной амплитуды годографом вектора напряжения должна
являться вписанная в шестиугольник окружность, при этом:
Слайд 13Сравнение эффективности центрированной и векторной ШИМ-модуляции
Классическое управление в режиме
центированной ШИМ-модуляции
Управление
в режиме «векторной» ШИМ-модуляции
Слайд 14Реализация «векторной» ШИМ на базе центрированной
Слайд 15Реализация одного вектора двумя способами
Слайд 20Бутстрепное питание
драйвера ключа
Слайд 22Определение сектора и скважностей
Вектор напряжения в относительных единицах:
В матричной форме (в
Слайд 23Определение сектора и скважностей
Для каждого сектора величины U*k,α, U*k+60,β, U*k+60,α, U*k,β
являются постоянными:
Слайд 24Определение сектора и скважностей
Введём вспомогательные переменные:
Тогда
Свяжем однозначно каждый базовый вектор с
определённым сектором:
С учётом этого, а также того, что γ≥0 и γ1≥0 можно определить знаки λ1, λ2 и λ3 для каждого сектора
Слайд 25Определение сектора и скважностей
В соответствии с этим можно составить итоговую таблицу,
согласно которой работает алгоритм определения сектора и скважностей базовых векторов по вычисленным значениям λ:
Слайд 26Ограничение вектора напряжения
Ограничение вектора на уровне максимальной амплитуды (постоянство фазы)
Слайд 27Инициализация Таймера 1
void PWM6SECT_Init(int period)
{
// Инициализируем регистр периода
Таймера 1
EvaRegs.T1PR = period;
// Настраиваем работу Таймера 1
// Вариант 1 (побитовая установка)
EvaRegs.T1CON.all = 0;
EvaRegs.T1CON.bit.TMODE = 1; // непрерывный счёт вверх-вниз
EvaRegs.T1CON.bit.TPS = 0; // делитель частоты = x/1
EvaRegs.T1CON.bit.TENABLE = 1; // разрешить работу таймера
// Вариант 2 (запись целиком всего регистра)
EvaRegs.T1CON.all =
TIMER_CONT_UPDN + \ // непрерывный счёт вверх-вниз
TIMER_CLK_PRESCALE_X_1 + \ // делитель частоты = x/1
TIMER_ENABLE; // разрешить работу таймера
Слайд 28Настройка «мёртвого» времени
// Настраиваем модуль генератора "мёртвого" времени
EvaRegs.DBTCONA.all =
DBT_VAL_15 + \ // период генерации "мёртвого" времени (12 мкс)
EDBT1_EN + \ // разрешить генерацию "мёртвого" времени для PWM1/PWM2
EDBT2_EN + \ // разрешить генерацию "мёртвого" времени для PWM3/PWM4
EDBT3_EN + \ // разрешить генерацию "мёртвого" времени для PWM5/PWM6
DBTPS_X32; // делитель частоты = x/32
Слайд 29Настройка полярности выходов ШИМ
// Настраиваем поведение (полярность работы) выходов ШИМ
EvaRegs.ACTRA.all
=
COMPARE1_AH + \ // PWM1 - активно "высокий" уровень
COMPARE2_AL + \ // PWM2 - активно "низкий" уровень
COMPARE3_AH + \ // PWM3 - активно "высокий" уровень
COMPARE4_AL + \ // PWM4 - активно "низкий" уровень
COMPARE5_AH + \ // PWM5 - активно "высокий" уровень
COMPARE6_AL; // PWM6 - активно "низкий" уровень
Слайд 30Инициализация модуля сравнения
// Настраиваем модуль сравнения
EvaRegs.COMCONA.all =
CMPR_ENABLE + \
// разрешить операцию сравнения
CMPR_LD_ON_ZERO + \ // перегружать регистры сравнения при T1CNT = 0 (underflow)
SVENABLE + \ // разрешить режим векторной ШИМ
ACTR_LD_ON_ZERO + \ // перегружать регистр ACTRA при T1CNT = 0 (underflow)
FCOMPOE; // разрешить выходы сравнения
// Инициализируем регистры сравнения
// Особенность модуля векторной ШИМ такова, что устройство сравнения не работает, если
// и CMPR1 = 0, и CMPR2 = 0, либо если CMPR1 > CMPR2; поэтому:
EvaRegs.CMPR1 = 1;
EvaRegs.CMPR2 = 2;
Слайд 31Инициализация портов ввода/вывода
// Настраиваем нужные дискретные порты ввода/вывода на выполнение
спецфункций
EALLOW; // разрешить доступ к защищённым регистрам
GpioMuxRegs.GPAMUX.all = 0x003F; // PWM1-PWM6 выходы
EDIS; // запретить доступ к защищённым регистрам
Слайд 32//Основная процедура модуля векторной ШИМ
void PWM6SECT_Update(
_iq UaRef,
// задание выходного напряжения по оси Alpha (отн.ед.)
_iq UbRef // задание выходного напряжения по оси Beta (отн.ед.)
)
{
long tmp;
_iq lambda1;
_iq lambda2;
_iq lambda3;
_iq knorm;
// Приводим компоненты заданного вектора напряжения к масштабу окружности,
// ограниченной базовыми векторами
UaRef = _IQmpy(UaRef, _IQ(0.866));
UbRef = _IQmpy(UbRef, _IQ(0.866));
// Проверяем и при необходимости ограничиваем вектор напряжения на уровне
// максимальной амплитуды синусоидального напряжения
knorm = _IQmag(UaRef, UbRef); // получаем текущую амплитуду вектора
if (knorm >= _IQ(0.866))
{
knorm = _IQdiv(_IQ(0.866), knorm); // получаем коэффициент коррекции
UaRef = _IQmpy(knorm, UaRef);
UbRef = _IQmpy(knorm, UbRef);
}
// Рассчитываем скважности базовых векторов непосредственно в единицах
// загрузки регистров сравнения
tmp = _IQmpy(_1_SQRT3, UbRef);
lambda1 = _IQmpy(EvaRegs.T1PR, (UaRef - tmp));
lambda2 = _IQmpy(EvaRegs.T1PR, 2*tmp);
lambda3 = lambda1 + lambda2;
Слайд 33 // По расчитанным скважностям определяем номер сектора, величины загрузки
// регистров сравнения и порядок перебора базовых векторов модуля векторной ШИМ
if (lambda1 <= 0)
{
if (lambda3 > 0) // Сектор 1
{
EvaRegs.CMPR1 = lambda3;
EvaRegs.CMPR2 = -lambda1+lambda3+1;
EvaRegs.ACTRA.all = 0x3666;
}
else if (lambda2 > 0) // Сектор 2
{
EvaRegs.CMPR1 = -lambda3;
EvaRegs.CMPR2 = -lambda3+lambda2+1;
EvaRegs.ACTRA.all = 0xE666;
}
else if (lambda1 != 0) // Сектор 3
{
EvaRegs.CMPR1 = -lambda1;
EvaRegs.CMPR2 = -lambda2-lambda1+1;
EvaRegs.ACTRA.all = 0x6666;
}
else // Сектор 4
{
EvaRegs.CMPR1 = lambda1;
EvaRegs.CMPR2 = lambda1-lambda3+1;
EvaRegs.ACTRA.all = 0xD666;
}
}
Слайд 34else
{
if (lambda2 > 0)
{
// Сектор 0
EvaRegs.CMPR1 = lambda2;
EvaRegs.CMPR2 = lambda2+lambda1+1;
EvaRegs.ACTRA.all = 0xB666;
}
else if (lambda3 < 0)
{
// Сектор 4
EvaRegs.CMPR1 = lambda1;
EvaRegs.CMPR2 = lambda1-lambda3+1;
EvaRegs.ACTRA.all = 0xD666;
}
else
{
// Сектор 5
EvaRegs.CMPR1 = -lambda2;
EvaRegs.CMPR2 = lambda3-lambda2+1;
EvaRegs.ACTRA.all = 0x5666;
}
}
}
Слайд 35Коррекция амплитуды вектора
// Приводим компоненты заданного вектора напряжения к
масштабу окружности,
// ограниченной базовыми векторами
UaRef = _IQmpy(UaRef, _IQ(0.866));
UbRef = _IQmpy(UbRef, _IQ(0.866));
// Проверяем и при необходимости ограничиваем вектор напряжения на уровне
// максимальной амплитуды синусоидального напряжения
knorm = _IQmag(UaRef, UbRef); // получаем текущую амплитуду вектора
if (knorm >= _IQ(0.866))
{
knorm = _IQdiv(_IQ(0.866), knorm); // получаем коэффициент коррекции
UaRef = _IQmpy(knorm, UaRef);
UbRef = _IQmpy(knorm, UbRef);
}
Слайд 36Расчёт скважности базовых векторов
// Рассчитываем скважности базовых векторов непосредственно
в единицах
// загрузки регистров сравнения
tmp = _IQmpy(_1_SQRT3, UbRef);
lambda1 = _IQmpy(EvaRegs.T1PR, (UaRef - tmp));
lambda2 = _IQmpy(EvaRegs.T1PR, 2*tmp);
lambda3 = lambda1 + lambda2;
#define _1_SQRT3 _IQ(0.5773503)
Слайд 37Определение номера сектора и скважностей
// По расчитанным скважностям определяем
номер сектора, величины загрузки
// регистров сравнения и порядок перебора базовых векторов модуля векторной ШИМ
if (lambda1 <= 0)
{
if (lambda3 > 0)
{
// Сектор 1
EvaRegs.CMPR1 = lambda3;
EvaRegs.CMPR2 = -lambda1+lambda3+1;
EvaRegs.ACTRA.all = 0x3666;
}
else if (lambda2 > 0)
{
// Сектор 2
……………………………………………………………
Слайд 38Настройка ШИМ для сектора 0
// Сектор 0
// Загружаем регистры сравнения
EvaRegs.CMPR1 = lambda2;
EvaRegs.CMPR2 = lambda2+lambda1+1;
// Задаём начальный базовый вектор и направление обхода
// Вариант 1 (инициализируем регистр через битовые поля)
EvaRegs.ACTRA.bit.D = 0x3; // 011b (U60)
EvaRegs.ACTRA.bit.SVRDIR = 1; // обход по часовой стрелке
// Вариант 2 (инициализируем сразу весь регистр целиком)
EvaRegs.ACTRA.all = 0xB666;