Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




 

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

Причем время обработки события внешней среды не должно превышать время между значимыми событиями внешней среды, т. е. программа должна «успевать» за средой и не пропускать значимые события!

Такие жесткие требования легче удовлетворить с использованием автоматного подхода программирования.

 

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

После включения питания программа производит инициализацию устройств микроконтроллера, проверку исправности датчиков тока и напряжения и ожидает включения тумблера пользователем. Если датчики тока и напряжения исправны и тумблер выключен, на индикаторе сообщение «Готов» (m1). Иначе если какой-либо датчик неисправен (показания больше 10А и 10В соответственно при выключенной нагрузке), на индикаторе «ДТ неисправен» (e1) или «ДН неисправен» (e2), иначе если тумблер включен, на индикаторе «Не готов» (e3), программа ожидает выключения тумблера, после чего переходит в состояние готовности с сообщением «Готов».

После включения тумблера на нагрузку подается трехфазное напряжение пилообразной формы (см. ниже). Напряжение регулируется потенциометром от 20 до 220 В. На индикаторе «Работа ХХХВ ХХХА» (m2), где ХХХВ — текущее значение напряжения, ХХХА — текущее значение тока, измеренные датчиками напряжения и тока.

После выключения тумблера напряжение выключается и на индикаторе «Готов». При включении тумблера цикл работы повторяется.

 


Электрическая схема подключения нагрузки

 

 

 

Временные диаграммы напряжений на нагрузке при начальном,

среднем и конечном углах управления тиристорами

В данной задаче программа должна в течение периода синусоиды линейного напряжения (20 мс) успевать выполнять целый ряд задач:

1) отслеживать начало периода линейного напряжения;

2) 3 раза за период точно отсчитывать время подпериода (3-й части периода)

3) читать значения с датчиков тока и напряжения;

4) преобразовывать значения с датчиков в действующие значения тока и напряжения;

5) выводить результаты измерения на индикатор;

6) читать оцифрованное значение напряжения с потенциометра;

7) преобразовывать его во время запуска тиристоров (угол управления);

8) отсчитывать это время от начала подпериода до запуска тиристоров;

9) выдавать управляющие импульсы на тиристоры не менее 1 мс (3 раза за период!).

 

Как выполнить эти задачи за 20 мс?

1) Используется компаратор, выходной сигнал которого «1» (5 В), если Uл>0 и «0» (0 В), если Uл<0. Выход компаратора читается программой через 19-20 мс. Этот период удобнее выбрать в качестве такта управляющего автомата.

2) Используется аппаратный таймер микроконтроллера, дважды отсчитывающий 6666 мкс от начала периода.

3,6) Используется внутренний АЦП контроллера, освобождающий процессор от функции преобразования.

4,7) Используются арифметические операции, которые занимают до 1 мс процессорного времени! (при тактовой частоте контроллера 4 МГц)

5) Используется индикатор с внутренним контроллером индикации, внутренней памятью и интерфейсом универсального последовательного порта (UART), освобождающий процессор от операций вывода на индикатор. Скорость передачи данных на индикатор не меньше 57,6 кбит/с. В рабочем режиме выводится не вся строка, а только ток и напряжение, что сокращает время вывода на индикатор.

8) Используется прерывание по регистру сравнения, срабатывающее, когда значение регистра сравнения будет равно значению таймера.

9) Используется циклическое переключение управляющего вывода тиристора с «0» на «1» с периодом 30 мкс в течение 1 мс (время открытия тиристоров).

 

Построим структурную схему системы управления и определим, имеет ли смысл автоматный подход программирования.

 

 

Структурная схема системы управления тиристорами моста

 


Согласно условию задачи нажатое состояние тумблера ведет к разной реакции программы: после включения питания – к выводу сообщения «не готов» и ожиданию выключения тумблера, а после выключения тумблера – к выводу сообщения «Работа ХХХВ ХХХА» и включению тиристоров. Кроме того, сигнал «Время истекло» (прерывание по регистру сравнения) также ведет к разным управляющим сигналам на тиристоры в зависимости от текущего подпериода.

Анализ условия задачи и структурной схемы показал, что в данной задаче имеет смысл автоматный подход программирования.

 

1. По условию задачи выбираем внутренние состояния автомата:

1) не готов (если тумблер включен после инициализации);

2) готов (если тумблер выключен после инициализации);

3) работа (если тумблер включен в состоянии «готов»);

 

2. На базе условия задачи, структурной схемы и выбранных внутренних состояний строим таблицы переходов и выходов главного автомата и автомата, управляющего тиристорами (матричная запись).

 

Таблица переходов и выходов главного автомата A1

 

state Не готов Готов Работа
Не готов (SW) Z1(e3) (!SW) Z1(m1) -
Готов - ДТ? ДН? (ДТ>10) Z1(e1) (ДН>10) Z1(e2) (SW) Z1(m2)
Работа - (!SW) {Z1(m1), Z7} Z6(6600), A2, ДТ? ДН? Z2(10), Z4, Z2(15), Z3

 

Таблица переходов и выходов автомата A2, управляющего тиристорами

 

tm ПП1 ПП2 ПП3
ПП1 (T=Tу) Z8 (TI) {Z7, Z6(6600)} -
ПП2 - (T=Tу) Z9 (TI) {Z7, Z6(6600)}
ПП3 (T=Tу) {Z10, Z7} - -

 

 

3. Код программы

 

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+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); // вывод напряжения до 10 позиции

Form_buf_lcd(current, 15); // вывод тока до 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;

}

}

}

 

После включения питания программа производит инициализацию устройств микроконтроллера, проверку исправности датчиков тока (ДТ). Если ДТ исправны (показания меньше I0), на индикаторе сообщение «Готов» (m1) и программа ожидает включения тумблера пользователем. Иначе на индикаторе «ДТ неисправен» (e1), программа может перейти только в режим настройки.

После включения тумблера на нагрузку подается трехфазное напряжение пилообразной формы (см. выше). Напряжение регулируется кнопками «¯» и «­» от 20 до 220 В с шагом 20 В (при этом позиция напряжения от 1 до 11). Позиция напряжения пересчитывается в угол управления по формуле ccpr1=-6600+500*(11-pos). При нажатии кнопки «·» устанавливается 220 В. На индикаторе «Работа ХХ А» (m2), где «ХХ А» — текущее значение тока, измеренное ДТ. После выключения тумблера напряжение выключается и программа входит в режим ожидания, на индикаторе «Готов». При включении тумблера цикл работы повторяется.

Вход в режим настройки возможен только из режима ожидания. В этом режиме кнопками «¯» и «­» регулируется нулевой ток ДТ I0 от 1 до 10 А. Вход и выход из режима с сохранением I0 осуществляется кнопкой «·».

Сканирование кнопок во всех режимах осуществляется функцией ScanKbd().

Составить структурную схему управляющего автомата, выделить управляющие состояния, построить таблицу или диаграмму переходов и выходов управляющего автомата и код программы на языке С++.

 

 




Поделиться с друзьями:


Дата добавления: 2015-05-26; Просмотров: 409; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.035 сек.