Симисторный диммер
Генерация кода для TI C2000 (Диммер)¶
В этом демонстрационном примере рассмотрена разработка модели Engee для симисторного диммера, управляемого микроконтроллером Texas Instruments TMS320F28379D.
Введение¶
Цель этого примера - реализовать в Engee модель симисторного диммера с последующей генерацией кода и выполнением на микроконтроллере Texas Instruments TMS320F28379D. На устройстве воспроизводится работа системы импульсно-фазового управления (СИФУ), которая получает сигналы пересечения нуля сетевого напряжения и аналоговой величины выходного действующего напряжения. Выходной сигнал СИФУ - управляющие импульсы для симистора, смещенные на величину угла открытия симистора.
Аппаратная часть¶
Устройство, физически воспроизводящее работу модели в этом примере - это отладочная плата LAUNCHXL-F28379D на базе микроконтроллера TMS320F28379D из семейства С2000 от компании Texas Instruments. Для этого примера используются следующие входы/выходы отладочной платы:
- Коннектор J5, пин 41 "3V3" - питание 3.3 В.
- Коннектор J7, пин 61 "5V" - питание 5 В.
- Коннектор J3, пин 22 "GND" - общий.
- Коннектор J4, пин 40 - цифровой вход GPIO 0 прерываний по сигналу пересечения нуля.
- Коннектор J3, пин 30 - аналоговый вход ADCIN A0 задания напряжения.
- Коннектор J1, пин 2 - цифровой выход GPIO 32 импульсов СИФУ.
Помимо функции управления, отладочная плата обеспечивает электрическое питание электронной схемы, приведённой на рисунке ниже.
Задание напряжения происходит по аналоговому сигналу "Alpha" от потенциометра 10 кОм, получающего также питание 3.3 В от отладочной платы.
Сигнал пересечения нуля "ZX" формируется оптотранзистором 4N25 по сигналу выпрямленного сетевого напряжения от резисторного делителя напряжения. Для выпрямления сетевого напряжения используется однофазный диодный мост.
Сигнал импульсов СИФУ "Pulses" поступает на вход оптосимистора MOC3023, который формирует сигналы для открытия силового симистора BT136-800E. Этот симистор и служит для регулирования напряжения на нагрузке - лампе накаливания мощностью 60 Вт.
Между силовыми выходами симистора включена защитная RC-цепь сопротивлением 39 Ом и ёмкостью 1 нФ.
Для контроля процесса регулирования используется цифровой осциллограф Hantek DSO.
Для сборки аппаратного комплекса, описанного в этом примере, мы настоятельно рекомендуем следовать требованиям регламентов в области охраны труда и техники безопасности, электробезопасности, пожарной безопасности. При отсутствии необходимых компетенций, средств индивидуальной защиты, исправных и безопасных компонентов мы настоятельно рекомендуем обратиться к специалистам в соответствующей области.
Описание модели¶
В модели данного примера dimmer_model.engee
в качестве симистора используются два включенных встречно-параллельно тиристора (блоки Thyristor (Piecewise Linear)
), в качестве нагрузки используется резистор с сопротивлением 1 кОм. На контактах блока регулируемого источника напряжения моделируется сетевое напряжение с действующим значением 220 В и частотой 50 Гц. В цепи измеряются падение напряжения V_load
и ток I_load
.
Открытие симистора происходит по сигналу сравнения текущего значения счётчика полупериода сетевого напряжения и угла открытия тиристоров α. При этом сигнал управления должен быть преобразован из логического уровня в уровень напряжения управляющего входа. Угол открытия тиристоров задаётся системой импульсно-фазового управления Firing_angle_controller
. Также для целей моделирования из этой подсистемы выводится сигнал заданного действующего напряжения U.
Подсистема импульсно-фазового управления¶
Подсистема Firing_angle_controller
используется не только для моделирования системы управления диммера, но и для генерации кода. Работа микроконтроллера и его периферии определяется кодом, записанным в блоках C Function
:
CPU_Init
- инициализирует центральный процессор контроллера и модуль периферийных прерываний.XINT1
- конфигурирует и включает модуль аппаратных прерываний, в том числе определяет канал сигнала прерываний, активирующее событие и обработчик прерываний.ADC_A0
- конфигурирует и инициализирует канал АЦП A0 и триггер начала преобразования (SOC), опрашивает канал АЦП для получения нового значения заданного напряжения.GPIO_32U_Output
- конфигурирует контакт GPIO 32 как цифровой выход, формирует выходной сигнал с заданной задержкой.
Помимо блоков взаимодействия с периферией контроллера в подсистеме содержатся блоки преобразования сигнала заданного напряжения adcA0Result
.
Выходной сигнал 12-разрядного АЦП - заданное напряжение adcA0Result
в диапазоне [0, 4095]. При этом сигнал регулирования - это угол открытия тиристоров Alpha
с соответствующим диапазоном значений [4375, 0], определяющийся функцией:
$$Alpha = \frac{4375}{\pi} \cdot \arccos \left( \frac{2 \cdot adcA0Result}{4095}-1 \right)$$
В целом, система управления работает следующим образом. После запуска микроконтроллер конфигурирует и запускает используемую периферию. Затем в бесконечном цикле осуществляется ожидание и считывание нового значения заданного напряжения adcA0Result
. В случае возникновения события прерывания INT_XINT1
(пересечение нуля сетевым напряжением) процессор вызывает процедуру обработки прерываний, устанавливающую флаг прерывания XINT1State
. После этого прерывание прекращается, а основная программа выполняет цикл условия наличия флага прерывания. При выполнении цикла условия формируется задержка, равная углу открытия симистора для обеспечения заданного на момент прерывания напряжения. После прохождения задержки на цифровом выходе контроллера формируется управляющий импульс, симистор открывается, флаг прерывания сбрасывается, а процессор возвращается в выполнение цикла ожидания нового значения заданного напряжения.
Подробное описание принципов работы блоков взаимодействия с периферией даны в соответствующих комментариях к коду. Далее остановимся на отдельных специфических вопросах работы системы управления.
Подключаемые файлы¶
Для корректной генерации кода и дальнейшей правильной компиляции сгенерированных файлов необходимо подключить файлы, использующиеся в основной программе для инициализации периферии микроконтроллера.
Это файлы device.h
и driverlib.h
из папки device
данного проекта. Они не используются при моделировании, и нужны только для их подключения в сгенерированных файлах.
Их подключение производится в настройках блока XINT1
, вкладка Build options
:
Обработка прерываний¶
В блоке XINT1
настраивается модуль прерываний. Наибольший интерес здесь представляет содержимое вкладок </> StartCode
и </> TerminateCode
.
Во вкладке </> StartCode
конфигурируется и включается модуль аппаратных прерываний. Здесь же подключается процедура обслуживания прерываний (ISR). Происходит это посредством вызова функции:
Interrupt_register(INT_XINT1, dimmer_model_Firing_angle_controller_term);
Второй аргумент функции - dimmer_model_Firing_angle_controller_term
и выполняет роль ISR. Он представляет собой функцию терминации подсистемы Firing_angle_controller
разработанной модели, которая получится в результате генерации кода. В этой модели все вкладки терминации блоков C Function
, за исключением блока XINT1
, пусты.
Во вкладке </> TerminateCode
описана процедура обслуживания прерываний.
Она заключается в изменении значения флага прерывания XINT1State
и очистке аккумулятора прерываний.
Угол открытия симистора¶
Текущее значение флага прерываний в основном цикле программы передается в блок GPIO_32U_Output
, где в условном цикле с заданной задержкой формируется импульс открытия симистора.
Формирование импульса описывает код, приведенной во вкладке </> OutputCode
блока:
//
// Проверка флага прерывания
//
if(XINT1Flag){
//
// Установка отсчёта в точку естественной коммутации
//
DEVICE_DELAY_US(500);
//
// Формирование задержки на величину угла открытия
//
DEVICE_DELAY_US(dimmer_model_Firing_angle_controller_Y.Alpha);
//
// Управляющий импульс
//
GPIO_writePin(32U, 1);
DEVICE_DELAY_US(15);
GPIO_writePin(32U, 0);
//
// Сброс флага прерывания
//
XINT1State=!XINT1State;
}
В случае наличия флага прерывания XINT1Flag
в этом блоке происходит выполнение условия. В первую очередь здесь формируется задержка для перевода отсчёта угла открытия симистора в точку естественной коммутации. Это необходимо ввиду того, что аппаратное определение пересечения нуля оптроном 4N25 происходит приблизительно на 1 мс раньше действительного пересечения нуля в точке естественной коммутации.
За этим формируется задержка на величину угла открытия симистора. При этом величина задержки dimmer_model_Firing_angle_controller_Y.Alpha
- это выходная переменная подсистемы Firing_angle_controller
, получаемая в результате генерации кода.
После прохождения задержки формируется управляющий импульс и инвертируется состояние флага прерывания XINT1State
.
Результаты моделирования¶
Для моделирования регулирования симистором выходного напряжения в блоке ADC_A0
формируется линейно возрастающее выходное значение заданного действующего напряжения.
Для моделирования процесса регулирования загрузим и запустим модель dimmer_model
:
if "dimmer_model" in [m.name for m in engee.get_all_models()]
m = engee.open( "dimmer_model" );
else
m = engee.load( "$(@__DIR__)/dimmer_model.engee" );
end
data = engee.run(m);
Из полученных данных моделирования построим графики заданного действующего напряжения и формируемого угла открытия тиристора в условных единицах:
using Plots
gr( format=:png )
plot(data["Заданное действующее напряжение U, pu"].time,
data["Заданное действующее напряжение U, pu"].value,
label="Заданное напряжение U, pu", size=(900,300),
lw=2, legend=:right)
plot!(data["Угол открытия тиристоров α, pu"].time,
data["Угол открытия тиристоров α, pu"].value,
label="Угол открытия α, pu", lw=2)
Построим график падения напряжения на нагрузке:
plot(data["V_load"].time, data["V_load"].value,
label="Напряжение U, pu", size=(900,300),
lw=2, legend=:topleft)
Как видно из полученных графиков, по заданию действующего напряжения происходит корректное формирования угла открытия симистора.
Генерация кода¶
Сгенерируем код из подсистемы с алгоритмом импульсно-фазового управления Firing_angle_controller
:
engee.generate_code( "$(@__DIR__)/dimmer_model.engee",
"$(@__DIR__)/TI_dimmer_code";
subsystem_name="Firing_angle_controller" )
Для корректной работы СИФУ в сгенерированных фалах Си необходимо внести следующие корректировки:
В заголовочном файле dimmer_model_Firing_angle_controller.h
:
Заменим ключевое слово extern
для прототипа функции extern void dimmer_model_Firing_angle_controller_term();
на ключевое слово interrupt
, чтобы данная функция компилятором воспринималась как ISR.
В файле dimmer_model_Firing_angle_controller.c
:
Добавим в самом начале кода строку директивы #define LAUNCHXL_F28379D
для определения макроса LAUNCHXL_F28379D
. Этот макрос необходим для выполнения условных компиляций, ограниченных в сгенерированных файлах директивами #ifdef...#else...#endif
.
Основная программа и проект¶
Код основной программы приведён в файле dimmer.h
. В нем подключаются необходимые для проекта заголовочные файлы (в том числе, сгенерированный), объявляются глобальные переменные, вызываются функции инициализации и расчета модели.
Для программирования контроллера используется среда разработки Code Composer Studio 12.7.1 (далее - CCStudio) от компании Texas Instruments.
Для начала работы с разработанной программой и контроллером необходимо выполнить шаги для настройки среды, подключения и проекта, а именно:
- выбор рабочей области проекта;
- выбор отладочной платы, процессора и его характеристик;
- выбор подключения;
- создание пустого проекта
dimmer
.
В созданный пустой проект в среде CCStudio добавим файл основной программы и сгенерированные файлы. Дерево проекта будет выглядеть подобным образом:
Выполнение кода на микроконтроллере¶
После добавления файлов в проект выполним следующие действия:
- подключим отладочную плату к компьютеру по USB;
- запустим сборку проекта в CCStudio (Build) для выбранного процессора и области памяти - данном проекте это CPU1_RAM;
- запустим отладку проекта (Debug), в результате чего, в том числе, произойдет загрузка кода в процессор;
- запустим программу (Run).
После запуска программы можно наблюдать изменение яркости лампы накаливания, регулирование переменной угла открытия симистора в CCStudio и осциллограмму падения напряжения на лампе. Запись работы диммера представлена в файле dimmer.gif
этого примера.
Для построения графика угла открытия симистора в CCStudio необходимо добавить переменную FiringAngle
в область просмотра переменных "Expressions" и выбрать построение графика ("Graph") для данной переменной. В окне построения графика "Single Time -0" можно включить непрерывное обновление, настроить частоту опроса значений и величину буфера значений.
Для передачи на компьютер осциллограмм, снятых цифровым осциллографом Hantek DSO, используется программа DSO Controller.
Вывод¶
В данном демонстрационном примере была разработана модель симисторного диммера с последующей генерацией кода системы импульсно-фазового управления для микроконтроллера TMS320F28379D. Результаты работы системы управления показаны в модели Engee с использованием блоков физического моделирования и на симисторном диммере с нагрузкой в виде лампы накаливания.