Similar presentations:
Методы эффективного управления инверторами напряжения в приводах переменного тока
1. Современные методы эффективного управления инверторами напряжения в приводах переменного тока
1. Структура типового инвертора напряжения2. Классические методы ШИМ-управления инверторами –
ассимметричная (фронтовая) и симметричная (центрированная) ШИМ
3. Принцип широтно-импульсной модуляции базовых векторов
(«векторной» ШИМ)
• Основные состояния инвертора и базовые вектора
• ШИМ базовых векторов
• Сектора, внутри-секторный угол, компоненты базового вектора
4. Реализация «векторной» ШИМ на базе центрированной
5. Реализация «векторной» ШИМ с привязкой к верхней или нижней шине
6. Преимущества «векторной» ШИМ-модуляции
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. Векторная ШИМ
Из условияинвариантности
мгновенных значений
электрических
величин:
*
*
u ua
1 * 2 *
*
u
ua
ub
3
3
10. ШИМ-модуляция базовых векторов
Базовые вектора- в одной стойке включен только один ключ11. 6 состояний, 6 базовых векторов
12. Векторная ШИМ
usTk
TШИМ
U k
Tk 60
T
U k 60 0 O
TШИМ
TШИМ
Tk длительность включения базового вектора U k
Tk 60 длительность включения базового вектора U k 60
T0 TШИМ Tk Tk 60 длительность включения нулевого базового вектора O (000) или O (111)
Обозначим " скважности":
TШИМ период несущей частоты ШИМ
Tk
TШИМ
Tk 60
1 TШИМ
Тогда :
u s U k 1 U k 60
Для получения синусоидального
напряжения постоянной амплитуды
годографом вектора напряжения должна
являться вписанная в шестиугольник
окружность, при этом:
um _ sin
2
U dc cos 30 0.577 U dc
3
13. Сравнение эффективности центрированной и векторной ШИМ-модуляции
Сравнение эффективности центрированной и векторной ШИМмодуляцииКлассическое управление в режиме
центированной ШИМ-модуляции
Управление в режиме «векторной»
ШИМ-модуляции
14. Реализация «векторной» ШИМ на базе центрированной
15. Реализация одного вектора двумя способами
16.
17.
18.
19.
20. Бутстрепное питание драйвера ключа
21. 6-секторная векторная ШИМ
22. Определение сектора и скважностей
u s U k 1 U k 60Вектор напряжения в относительных
единицах:
U k*,
U k* 60,
u *
В матричной форме (в осях
* * 1 *
- ):
*
u
или
U k ,
u * U k*,
* *
u U k ,
Тогда
:
*
U k ,
*
1 U k ,
или
*
*
U k 60,
U k* 60,
*
U k 60, 1
1
U k* 60, u *
*
*
U k 60, u
1
U * U *
*
*
U
U
1
k ,
k 60,
k 60,
k ,
U k* 60, U k* 60, u *
*
*
*
U k , U k ,
u
23. Определение сектора и скважностей
Для каждого сектора величины U*k, , U*k+60, , U*k+60, , U*k, являютсяпостоянными:
24. Определение сектора и скважностей
Введём вспомогательныепеременные:
*
u
*
1 u
3
2 u *
2
3
*
u
3 1 2 u *
3
Тогда
Свяжем однозначно каждый базовый вектор с определённым
сектором:
С учётом этого, а также того, что 0 и 1 0 можно определить знаки 1, 2 и
3 для каждого сектора
25. Определение сектора и скважностей
В соответствии с этим можно составить итоговую таблицу, согласно которойработает алгоритм определения сектора и скважностей базовых векторов по
вычисленным значениям :
26. Ограничение вектора напряжения
Ограничение вектора на уровне максимальной амплитуды (постоянство фазы)1) Проверяется условие : u
*
s
u u
* 2
* 2
0.866
2) Если требуется ограничение, рассчитывается коэффициен т k норм
u * _ огр k норм u *
3) Рассчитываются скорректированные составляющие : *
*
u _ огр k норм u
4) Согласно найденным u * _ огр , u * _ огр рассчитываются скважности
0.866
u s*
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;
}
}
34.
else{
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. Расчёт скважности базовых векторов
*u
*
1 u
3
2 u *
2
3
u *
*
3 1 2 u
3
#define _1_SQRT3
_IQ(0.5773503)
// Рассчитываем скважности базовых векторов непосредственно в единицах
// загрузки регистров сравнения
tmp = _IQmpy(_1_SQRT3, UbRef);
lambda1 = _IQmpy(EvaRegs.T1PR, (UaRef - tmp));
lambda2 = _IQmpy(EvaRegs.T1PR, 2*tmp);
lambda3 = lambda1 + lambda2;
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
CMPR1 1pwm 2CMPR2 pwm pwm 1pwm 1 2
Начальный сектор : U 60( 011)
// Сектор 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;