Пример проектирования систем реального времени
Разработаем программу управления тиристорами трехфазного полного моста автоматным подходом.
После включения питания программа производит инициализацию устройств микроконтроллера, проверку исправности датчиков тока и напряжения и ожидает включения тумблера пользователем. Если датчики тока и напряжения исправны и тумблер выключен, на индикаторе сообщение «Готов» (m1). Иначе если какой-либо датчик неисправен (показания больше 10А и 10В соответственно при выключенной нагрузке), на индикаторе «ДТ неисправен» (e1) или «ДН неисправен» (e2), иначе если тумблер включен, на индикаторе «Не готов» (e3), программа ожидает выключения тумблера, после чего переходит в состояние готовности с сообщением «Готов».
После включения тумблера на нагрузку подается трехфазное напряжение пилообразной формы (см. ниже). Напряжение регулируется потенциометром от 20 до 220 В. На индикаторе «Работа ХХХВ ХХХА» (m2), где ХХХВ — текущее значение напряжения, ХХХА — текущее значение тока, измеренные датчиками напряжения и тока.
После выключения тумблера напряжение выключается и на индикаторе «Готов». При включении тумблера цикл работы повторяется.
Электрическая схема подключения нагрузки
Временные диаграммы напряжений на нагрузке при начальном,
среднем и конечном углах управления тиристорами
Структурная схема системы управления тиристорами моста
Таблица переходов и выходов главного автомата A1
state | Проверка готовности | Ожидание | Работа |
ПГ | (SW) Z1(e3) | (!SW) Z1(m1) | - |
ОЖ | - | ДТ? ДН? (ДТ>10) Z1(e1) (ДН>10) Z1(e2) | (SW) Z1(m2) |
РБ | - | (!SW) {Z1(m1), Z7} | Z6(6,6мс), A2, ДТ? ДН? Z2(10), Z4, Z2(15), Z3 |
Таблица переходов и выходов автомата, управляющего тиристорами A2
tm | ПП1 | ПП2 | ПП3 |
ПП1 | (T=T(A)) Z8 | (TI) {Z7, Z6(6,6мс)} | - |
ПП2 | - | (T=T(A)) Z9 | (TI) {Z7, Z6(6,6мс)} |
ПП3 | (T=T(A)) {Z10, Z7} | - | - |
Код программы
const char PG = 1; // Код состояния
const char IDLE = 2;
const char WORK = 3;
const char DT = 1; // Каналы АЦП
const char DN = 2;
const char ANGLE = 3;
char state=PG; // переменная для режима
char tm=0; // счетчик частей периода
char Buf[17]; // буфер вывода
unsigned int ccpr1; // для загрузки в регистр сравнения
void main(void)
{
GIE = 0; // отключаем все прерывания
Init(); // инициализация МК
GIE = 1; // включаем прерывания
while(1) {
while (SS != 0) continue; // ждем срез СС
while (SS != 1) continue; // ждем фронт СС
switch(state) { // выбор режима
case PG: // режим проверки готовности
if(!SW) {printf(“Готов”); state=IDLE;} // если тумблер отключен
else printf(“Не готов”);
break;
case IDLE: // режим ожидания
if(SW) {sprintf(“Работа В А”,Buf); state=WORK;} //если тумблер включен
else {
adc_read(DT);
if(ADRES>10) printf(“Неисправен ДТ”);
adc_read(DN);
if(ADRES>10) printf(“Неисправен ДН”);
}
break;
case WORK: // рабочий режим
GIE=0; // нельзя прерывать иниц-ю таймера и имп. на тир-ры
tm=0; // первая часть периода
TMR1ON=0; TMR1=-6600; TMR1ON=1;
GIE=1;
adc_read(ANGLE); // чтение угла упр-я с АЦП
CCP1IE = 0; // запрет прерывания на время загрузки регистров
ccpr1=-6600+ANGLE_0+12*ADRES; // загрузка угла упр.
CCPR1H=ccpr1>>8; // загрузка старшего байта
CCPR1L=ccpr1&0xFF; // загрузка младшего байта
CCP1IE = 1; // разрешить прерывание по CCPR1
adc_read(DN); // чтение ДН
voltage = ADRES;
adc_read(DT); // чтение ДT
current = ADRES;
Form_buf_lcd(voltage, 10); // вывод напряжения
Form_buf_lcd(current, 15); // вывод тока
if(!SW) {printf(“Готов”); state=IDLE; TMR1ON=0;} // если тумблер откл.
break; }
}
}
#pragma interrupt_level 0
void interrupt tmr1(void) // обработчик прерываний
{
if (TMR1IF) { // если переполнение таймера 1
if (tm<2) {tm++;} else {tm=0;} // счёт частей периода
TMR1IF = 0; // сбрасываем флаг прерывания
TMR1ON = 0; // выключаем таймер 1
TMR1=-6600; // инициализация таймера 1
TMR1ON = 1; // запуск таймера
}
if (CCP1IF) {
CCP1IF=0;
switch(tm) {
case 0: Pulse_Tyr_AB(); break;
case 1: Pulse_Tyr_BC(); break;
case 2: Pulse_Tyr_CA(); tm=0; TMR1ON=0; break;
}
}
}
Разработать программу классическим (алгоритмическим) подходом, сравнить с автоматным подходом по времени разработки, объему занимаемых ресурсов, удобочитаемости, структурированности и возможностям отладки.