Пример проектирования систем реального времени

 

 

Разработаем программу управления тиристорами трехфазного полного моста автоматным подходом.

После включения питания программа производит инициализацию устройств микроконтроллера, проверку исправности датчиков тока и напряжения и ожидает включения тумблера пользователем. Если датчики тока и напряжения исправны и тумблер выключен, на индикаторе сообщение «Готов» (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;

}

}

}

 

Разработать программу классическим (алгоритмическим) подходом, сравнить с автоматным подходом по времени разработки, объему занимаемых ресурсов, удобочитаемости, структурированности и возможностям отладки.