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

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

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

}

}

}

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: