Система управления стабилизатором переменного напряжения
Описание основных функциональных блоков системы и выбор элементной базы. Схема электрическая принципиальная. Описание программы, алгоритм функционирования. Проверка работоспособности, листинг, моделирование. Функции работы с индикатором. Опрос клавиатуры.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.03.2016 |
Размер файла | 2,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Брянский государственный технический университет
КАФЕДРА «ЭРЭ и ЭС»
Пояснительная записка к курсовой работе
по дисциплине «Отладочные средства микропроцессорных систем»
на тему «Система управления стабилизатором переменного напряжения»
Брянск 2015
ВВЕДЕНИЕ
Микроконтроллер - функционально законченное устройство обработки информации, управляемое хранимой в памяти программой. Появление микроконтроллеров стало возможным благодаря развитию интегральной электронике. Это позволило перейти от схем малой и средней степени интеграции к большим и сверхбольшим интегральным микросхемам (БИС и СБИС).
Микроконтроллеры и микроЭВМ, вследствие малой материалоемкости и стоимости, низкого энергопотребления и высокой надежности находят всё большее применение в промышленности. Эти устройства позволяют создавать миниатюрные, дешёвые и экономичные, но в то же время достаточно «умные» и сложные приборы, способные управлять силовыми преобразователями, коммутирующими большие токи и напряжения.
Область применения микроконтроллеров не ограничивается только силовой электроникой, с каждым годом значительно расширяясь.
1. ОПИСАНИЕ СХЕМЫ ПРЕОБРАЗОВАТЕЛЯ
Необходимо разработать систему управления стабилизатором переменного напряжения, в котором используется регулирующий орган с вольтодобавкой на основе ячейки с ОРМ (однополярной реверсивной модуляцией) однократного преобразования. Схема такой ячейки и режимы её работы приведены в табл.1.1.
Таблица 1.1
Схема регулирующего органа С ОРМ с однократным преобразованием |
Режим |
Цикл замыкания ключей |
|
РД |
1,4-3,4 |
||
НП |
2,3-1,4 |
||
РО |
2,3-1,2 |
РД - регулируемая добавка; НП - неискаженная (прямая передача); РО - регулируемая отбавка.
Выходное напряжение с регулирующего органа проходит через LC фильтр, который подавляет лишние гармоники и на нагрузке формируется синусоидальное напряжение.
Напряжение сети изменяется в пределах 220В ±%, т.е. 187…242В.
Напряжение на выходе регулируется в пределах 50…200В.
Частоту квантования выберем в q=10 раз больше частоты сети:
.
Выходное напряжение регулируется в соответствии с формулой:
,
где “-“ - отбавка, “+“ - добавка;
Диапазон изменения , обеспечивающий заданную регулировку напряжения:
Отбавка:
Добавка:
Основная задача системы управления - контролировать выходное напряжение (по действующему, либо по мгновенному значению) и в случае его отклонения от заданного изменять сдвиг открытых состояний ключей определённым образом, осуществляя при этом добавку либо отбавку.
Второстепенная задача - обеспечить взаимодействие пользователя с устройством. Должна быть возможность задавать необходимую величину выходного напряжения с помощью клавиатуры, а также возможность отображения текущего выходного напряжения.
Стабилизация будет осуществляться по действующему значению выходного напряжения следующим образом: к выходу стабилизатора подключаем RMS-DC-конвертер. Он формирует постоянное напряжение, соответствующее действующему значению напряжения сети. Микроконтроллер в определении действующего значения не участвует, а только получает результат в аналоговом виде.
Преимущество такого способа - довольно высокая точность определения действующего значения выходного напряжения.
Недостаток в том, такие устройства обладают задержкой определения действующего значения около 100мс и дорого стоят.
Определять действующее значение можно проще - опрашивать выход и находить максимальное, т.е. амплитудное. Но форма напряжения сети может отклоняться от синусоидальной, а значит определённое таким способом действующее значение может отличаться от реального.
Можно также использовать способ получения мгновенных значений в течение полупериода через определённые интервалы времени с последующим вычислением действующего значения в конце полупериода и поправкой. Но в данном случае информация о выходном напряжении поступает лишь через половину периода и система управления только тогда реагирует на изменения.
2. ФУНКЦИОНАЛЬНАЯ СХЕМА СИСТЕМЫ
Рис. 2.1 - Функциональная схема стабилизатора
Описание функциональной схемы:
Изолирующий усилитель производит гальваническую развязку выходной цепи и микроконтроллера.
Конвертер RMS-DC выполняет функцию получения величины действующего значения выходного напряжения и преобразует текущее его значение в соответствующее постоянное.
Драйвер АЦП осуществляет опрос выходного напряжения выпрямителя и обновляет значение сигнала обратной связи XОС .
Драйвер клавиатуры опрашивает порт клавитуры и обновляет значение сигнала задания XЗ.
ПИ-регулятор нужен для задания скорости изменения управляющего воздействия при отклонении XОС от XЗ.
Драйвер индикатора осуществляет индикацию вводимых с клавиатуры цифр и текущего действующего значения напряжения на выходе преобразователя.
3. ОПИСАНИЕ ОСНОВНЫХ ФУНКЦИОНАЛЬНЫХ БЛОКОВ СИСТЕМЫ И ВЫБОР ЭЛЕМЕНТНОЙ БАЗЫ
Выбор микроконтроллера.
Исходя из предложенного задания на курсовую работу, выбираем микроконтроллер AT89C51RB2-SLSCM фирмы Atmel.
Описание:
Рис. 3.1 -- Расположение выводов ИС AT89C51RB2-SLSCM
Особенностями используемого микроконтроллера являются:
* Совместимость с серией MCS-51
* 16 кБ флэш-памяти с внутрисхемным программированием (ISP)
* Износостойкость: 100000 циклов записи/стирания
* Рабочий диапазон питания 3/5 В
* Полностью статическое функционирование : 0 …60 МГц
* Три уровня защиты памяти программ
* Внутреннее ОЗУ размером 1280x8
* 32 программируемые линии ввода-вывода
* Три 16-разрядных таймера-счетчика
* PCA матрица
* Десять источников прерываний
* Четыре уровня прерываний
* Полнодуплексный канал последовательной связи на УАПП
* SPI
* Режимы снижения потребления: холостой ход и экономичный
* Восстановление прерываний при выходе из экономичного режима
* Сторожевой таймер
* Двойной указатель данных
* Флаг выключения питания
Порты 1, 2 и 3 являются 8-разрядным двунаправленными портами ввода/вывода. Линии этих портов имеют внутренние нагрузочные резисторы, а линии порта Р0 требуют внешних.
В режиме холостого хода (Idle) останавливается ЦПУ, но ОЗУ, таймеры-счетчики, последовательный порт и система прерываний продолжают функционировать. В экономичном режиме (Power-down) сохраняется информация в ОЗУ, но остановлен генератор, выключены все остальные функциональные блоки до внешнего запроса на прерывание или аппаратного сброса.
Выбор ключей.
Выбраны транзисторы со встроенными обратными диодами фирмы International Rectifier IRG4PH50UD со следующими параметрами:
Для управления ключами выбран драйвер фирмы Avago Technologies ACNW3130. Канал драйвера гальванически развязан от входной цепи.
Максимальный пиковый выходной ток драйвера : 2,5А.
Минимальный пиковый выходной ток драйвера : 2А.
Максимум низкого уровня выходного напряжения: 0,5В.
Максимальный ток питания: 5мА.
Диапазон напряжения питания: 15-30В.
Максимальное время переключения: 500нс.
Температурный диапазон: -40-100?С.
Рис. 3.2 - Блок-диаграмма драйвера
При рекомендуемых производителем параметрах , выбираем внешний резистор . Пиковый ток затвора транзистора составляет:
.
Подключаем по два транзистора к каждому драйверу. На 8 транзисторов нужно 4 штуки.
Резистивный делитель обеспечивает понижение уровня выходного напряжения стабилизатора до уровня изоляционного усилителя (±200мВ). Пусть R12=100 кОм, а R13=40,2 Ом, тогда максимальное напряжение на входе изоляционного усилителя составит 480/(100000/40,4)=0,193В, что входит в допустимые пределы.
RMS-to-DC конвертер обеспечивает определение действующего значения напряжения. Выбираем микросхему AD736А фирмы Analog Devices. Параметры конвертера:
- Напряжение питания: +2,8В, -3,2В…±16,5В;
- Максимальное входное напряжение: 200мВ;
- Входное сопротивление 1012 Ом
- Температурный диапазон: -40…+85?С
Рис. 3.3 - Схема конвертера
Изолирующий усилитель обеспечивает гальваническую развязку выходного напряжения. Выбираем изолирующий усилитель HCPL-7850 фирмы Avago Technologies. Параметры усилителя:
- Напряжение питания: +5В;
- Входное напряжение: -200…+200мВ;
- Выходное напряжение: +5,5В;
- Температурный диапазон: -55…+125?С
- погрешность нелинейности: 0,1%
Рис. 3.4 - Схема изоляционного усилителя
Операционный усилитель обеспечивает повышение напряжения обратной связи до уровня АЦП (5В). Так как изолирующий усилитель усиливает напряжение в 8 раз, то максимально возможное напряжение на его выходе составит 0,193•8=1,544В. Выберем схему неинвертирующего усилителя на LM324. При усилении напряжения в 3 раза 1+R19/R18=3, принимаем значения сопротивлений R7=2,05 кОм и R3=1 кОм.
Выбор АЦП
Выбран АЦП ADC0831:
- Разрешение: 8бит
- Напряжение питания: 5В
- Время конвертации: 32мкс
- Температурный диапазон: 0…+70?С
Ввод и отображение информации
Для ввода требуемого на выходе напряжения используется клавиатура с 12-ю клавишами:
10 цифровых (0-9) и 2 сервисных (Ввод, Сброс). Клавиатуру набираем из отдельных тактовых кнопок TS-A3PS-130.
Для отображения введённого с клавиатуры и текущего значения выходного напряжения выбран жидкокристаллический индикатор
МТ-16S2D от фирмы МЭЛТ.
Рис. 3.5 - Внешний вид индикатора
4. СХЕМА ЭЛЕКТРИЧЕСКАЯ ПРИНЦИПИАЛЬНАЯ
Рис. 4.1 - Схема принципиальная микропроцессорного устройства
Рис. 4.2 - Схема принципиальная силовой части
5. ОПИСАНИЕ ПРОГРАММЫ
Программа для микроконтроллера была написана на языке Си в среде uVision.
Программа осуществляет управление стабилизатором переменного напряжения. С RMS-DC датчика считывается действующее значение напряжение на выходе устройства. Циклически вычисляется статическая ошибка.
Суммарная ошибка за все время работы системы:
Новое значение напряжения на выходе системы:
Действующее значение сетевого напряжения:
Коэффициент заполнения импульсами для следующего цикла работы:
Таймерами формируется управляющий сигнал для силовых ключей.
В программе предусмотрен ввод с клавиатуры действующего значения напряжения на выходе стабилизатора. А также отображение введенного значения на индикаторе.
6. АЛГОРИТМ ФУНКЦИОНИРОВАНИЯ ПРОГРАММЫ
Рис. 6.1 - Алгоритм основной программы
Подключается библиотека с регистрами микроконтроллера и библиотека работы со строками.
1 #include <REG52.H>
2 #include <string.h>
Объявляются константы.
4 #define DataInd P0
5 #define klav P2
6 #define Kp 0.2
7 #define Ki 0.015
8 #define Ktr 1.5
9 #define T ((60/12)*1000000/500)
10 #define Tic (0-T)
Линиям портов присваиваются символьные имена.
12 sbit RS = P3^7;
13 sbit RW = P3^6;
14 sbit E = P3^5;
15 sbit CS = P1^7;
16 sbit CLK = P1^6;
17 sbit DO = P1^5;
18 sbit K1 = P1^1;
19 sbit K3 = P1^2;
20 sbit K2 = P1^3;
21 sbit K4 = P1^4;
Объявляются переменные.
23 unsigned char data i=0;
24 unsigned char data nop;
25 unsigned short data DataKlav=0x200;
26 unsigned short data Uout=200;
27 unsigned char data buf;
28 unsigned short data buf2;
29 unsigned char code str1[]="Uout= V";
30 unsigned char code str2[]="Uizm= V";
31 unsigned char code strZero[]=" ";
32 unsigned char data str[10];
33 unsigned short data rms;
34 unsigned short data rmsBCD;
35 unsigned short data Uin = 200;
36 float data gamma;
37 signed short data oh;
38 signed short data oh_do = 0;
39 signed short data S;
40 unsigned short data Ui;
41 unsigned short data Tic2;
42 signed short data Upr;
43 signed short data Uint;
И флаг.
45 bit regim;
Объявляются функции.
47 void WeitBW(void);
48 void PutCom(unsigned char data OutByte);
49 void PutStrobe(void);
50 void PutData(unsigned char data OutByte);
51 void PutString(unsigned char Str[]);
52 unsigned char ADC(void);
53 void DecodSts(unsigned short Uxxx);
Начинается основная программа. Сразу после включения устройства происходит инициализация. Все силовые ключи отключаются. Определяется режим работы таймеров. Таймеры Т0 и Т1 работают в режиме шестнадцатибитных таймеров-счетчиков. Для таймера Т1 задается начальное значение.
55 void main(void)
56 {
57 1 //Инициализация
58 1 K1 = K2 = K3 = K4 = 0;
59 1 TMOD = 0x11;
60 1 TH0 = (Tic >> 8);
61 1 TL0 = Tic;
Разрешаются прерывания (глобально). Также разрешаются прерывания от Таймеров Т0 и Т1, а также внешние прерывания по INT0 и INT1.
62 1 EA = 1;
63 1 ET0 = ET1 = 1;
64 1 EX0 = EX1 =1;
Вычисляется начальный коэффициент заполнения импульсами.
65 1 gamma = (1-((float)Uout/Uin))*Ktr;
Производится инициализация индикатора. Команда 0х38 устанавливает режим отображения с матрицей 5х8 точек и работу с 8-ми разрядной шиной данных; 0х0C включает отображение на экране ЖКИ-модуля, без отображения курсоров; 0х06 устанавливает режим автоматического перемещения курсора слева направо после вывода каждого символа; 0х01 очищает содержимое экрана и переводит курсор в первое положение.
67 1 PutCom(0x38);
68 1 PutCom(0x0c);
69 1 PutCom(0x06);
70 1 PutCom(0x01);
Таймер Т0 запускается.
72 1 TR0 = 1;
Далее идет бесконечный цикл основной программы.
73 1 while(1)
74 1 {
Который начинается с опроса клавиатуры. В строки записываются лог. 0, а в столбцы лог. 1. Состояние клавиатуры считывается в буфер.
76 2 klav = 0x0f;
77 2 buf = klav;
Далее в строки записываются лог. 1, а в столбцы лог. 0. Производится операция побитного ИЛИ предыдущего и нынешнего состояния клавиатуры. Результат также сохраняется в буфере.
78 2 klav = 0xf0;
79 2 buf = buf | klav;
Полученный код сравнивается с числом 0хff. Если ни одна кнопка нажата не была то будет возвращено занчение 0xff. Иначе в каждой тетраде будет по одному нулю, соответствующему нажатой кнопке (строка и столбец).
80 2 if(buf != 0xff)
81 2 {
Если какая-либо кнопка была нажата, то проверяется состояние флага "режим" и кнопки "режим" (код "0xb7"). Если одно из условий выполнено, то будет произведено определение, какая именно кнопка была нажата.
82 3 if(regim == 1||buf == 0xb7)
83 3 {
Значение переменной, в которой хранится введенное число, сдивигается на 4 бита влево. К текущему значению переменной прибавляется число, соответствующее нажатой кнопке.
84 4 DataKlav = DataKlav << 4;
85 4 switch(buf)
86 4 {
87 5 case(0x7d): DataKlav += 0; break;
88 5 case(0xee): DataKlav += 1; break;
89 5 case(0xde): DataKlav += 2; break;
90 5 case(0xbe): DataKlav += 3; break;
91 5 case(0xed): DataKlav += 4; break;
92 5 case(0xdd): DataKlav += 5; break;
93 5 case(0xbd): DataKlav += 6; break;
94 5 case(0xeb): DataKlav += 7; break;
95 5 case(0xdb): DataKlav += 8; break;
96 5 case(0xbb): DataKlav += 9; break;
Если была нажата кнопка "сброс", то значение переменной обнуляется.
97 5 case(0xe7): DataKlav = 0; break;//Сброс
Если была нажата кнопка "режим", то значение переменной сдвигается на 4 позиции вправо (компенсируется сдвиг данных).
98 5 case(0xb7): //Режим
99 5 {
100 6 DataKlav = DataKlav >> 4;
Проверяется состояние флага "режим", если он установлен, то введенное с клавиатуры значение пересчитывается в бинарный код.
101 6 if(regim == 1)
102 6 {
103 7 Uout = ((DataKlav & 0x0f00) >> 8)*100 + ((DataKlav & 0x00f0) >>4)*10 + (DataKlav & 0x000f);
Далее проверяются границы введенного значения. Если введено число меньше 50, то устанавливается 50.
104 7 if (Uout < 50)
105 7 {
106 8 Uout = 50;
107 8 DataKlav = 0x50;
108 8 }
Если введено число больше 200, то устанавливается 200.
109 7 if (Uout > 200)
110 7 {
111 8 Uout = 200;
112 8 DataKlav = 0x200;
113 8 }
114 7 }
Значение флага "режим" инвертируется.
115 6 regim = !regim;
116 6 break;
117 6 }
118 5 }
119 4 }
Далее ожидается, когда кнопка будет отпущена, после этого на все линии клавиатуры подается лог. 1.
120 3 while(klav!=0xf0);
121 3 klav = 0xff;
122 3 }
Введенные данные, а также данные, полученные с АЦП по прерываниям от Таймера Т0 выводятся на индикатор.
Курсор устанавливается в начало первой строки (команда "0x80"). Надпись первой строки из ПЗУ копируется в переменную в ОЗУ.
124 2 PutCom(0x80);
125 2 strcpy(str,str1);
Вызывается фунуция "DecodSts", которая добавляет числовые данные в строку текста. В качестве параметра функции передается введенное значение с клавиатуры в BCD коде.
126 2 DecodSts(DataKlav);
Вызывается фунуция "PutString", которая выводит строку текста на индикатор.
127 2 PutString(str);
Далее отображается вторая строка аналогичным образом. Только теперь курсор переводится в начало второй строки (команда "0xc0").
129 2 PutCom(0xc0);
Проверяется флаг "режим", если он не установлен, то в строковую переменную копируется из ПЗУ вторая строка. И вызывается функция "DecodStr", теперь в качестве параметра ей передаются данные, полученные с АЦП и перевеленные в BCD формат.
130 2 if(regim ==0)
131 2 {
132 3 strcpy(str,str2);
133 3 DecodSts(rmsBCD);
134 3 }
Иначе выводится пустая строка.
135 2 else strcpy(str,strZero);
136 2 PutString(str);
Далее цикл фоновой задачи повторится заново.
137 2 }//while
138 1 }//main
Теперь рассмотрим обработку прерываний от таймера Т0 (рис6.2).
141 void Timer0(void) interrupt 1 using 0
142 {
Рис. 6.2 - Алгоритм прерываний от таймера Т0
Таймер останавливается, значения в его регистрах обновляются для следующего цикла работы. Таймер запускается.
143 1 TR0 = 0;
144 1 TH0 = (Tic >> 8);
145 1 TL0 = Tic;
146 1 TR0 = 1;
Вызывается функция "ADC", которая опрашивает АЦП и возвращает принятое значение. Полученные данные приводятся к шкале (умножаются на 2,5).
148 1 rms = ADC();
149 1 rms = rms * 2.5;
Создается копия в BCD формате для отображения на индикаторе. Для этого в двухбайтный буфер помещается число сотен (результат целочисленного деления на 100), сдвинутое на 8 позиций влево. В буфер (однобайтный) - остаток от деления. Далее к значению в двухбайтном буфере прибавляется количество десятков (результат целочисленного деления на 10), сдвинутый на 4 позиции влево и остаток от деления.
150 1 buf2 = (rms/100) << 8;
151 1 buf = rms%100;
152 1 rmsBCD = buf2 + ((buf/10) << 4) + buf%10;
Далее реализован ПИ-регулятор. Вычисляется ошибка, как разность заданного действующего значения выходного напряжения и измеренного.
154 1 oh = Uout - rms;
Суммарная ошибка вычисляется как сумма всех ошибок с запуска устройства. К предыдущему значению суммарной ошибки прибавляется текущая ошибка.
155 1 S = S + oh;
Вычисляется пропорциональная и интегральная составляющие действующего значения выходного напряжения, А также действующее значение выходного напряжения.
156 1 Upr = Kp*oh;
157 1 Uint = Ki*S;
158 1 Ui = rms + Upr + Uint;
По предыдущему значению гаммы и измеренному значению напряжения вычисляется входное напряжение.
159 1 Uin = rms / (1-(gamma/Ktr));
Вычисляется новое значение гаммы.
160 1 gamma = ((1-((float)Ui/Uin))*Ktr);
Далее проверяется режим работы. Если гамма равна нуля, значит режим прямой передачи. В этом случае таймер Т1 сработает через половину периода. Ключи К2 и К3 выключаются, а ключи К1 и К4 включаются.
162 1 if (gamma == 0)
163 1 {
164 2 Tic2 = (0 - T/2);
165 2 TH1 = (Tic2 >> 8);
166 2 TL1 = Tic2;
167 2 K2 = K3 = 0;
168 2 K1 = K4 = 1;
169 2}
Если гамма положительная, значит режим вольтодобавки. Таймер Т1 сработает через время, равное произведению гаммы на период. Ключи К2 и К3 включаются, а ключи К1 и К4 выключаются.
172 1 else if (gamma > 0)
173 1 {
174 2 Tic2 = (0 - gamma*T);
175 2 TH1 = (Tic2 >> 8);
176 2 TL1 = Tic2;
177 2 K2 = 1;
178 2 K4 = 0;
179 2 K3 = 1;
180 2 K1 = 0;
181 2}
Если же предыдущие условия выполнены не были, значит режим вольтоотбавки. Таймер Т1 также сработает через время, равное произведению гаммы на период. Ключи К2 и К3 выключаются, а ключи К1 и К4 включаются.
183 1 else
184 1 {
185 2 Tic2 = (0 + gamma*T);
186 2 TH1 = (Tic2 >> 8);
187 2 TL1 = Tic2;
188 2 K2 = 0;
189 2 K4 = 1;
190 2 K3 = 0;
191 2 K1 = 1;
192 2}
Запускается таймер Т1. На этом прерывания от таймера Т0 завершаются.
193 1 TR1 = 1;
194 1}
Рис. 6.3 - Алгоритм прерываний от таймера Т1
Прерываний от таймера Т1 (рис.6.3). Состояние ключей К1 и К3 инвертируется.
196 void Timer1(void) interrupt 3 using 0
197 {
198 1 K3 = !K3;
199 1 K1 = !K1;
Если режим прямой передачи (гамма равна нулю), то состояние ключей К2 и К4 также инвертируется.
200 1 if (gamma == 0)
201 1 {
202 2 K2 = !K2;
203 2 K4 = !K4;
204 2 }
Останавливается таймер Т1. На этом прерывания от таймера Т1 завершаются.
205 1 TR1 = 0;
206 1}
При обнаружении прерываний от INT0 и INT1 все ключи выключаются. Эти прерывания формируют узлы защиты по мощности и напряжению.
208 //Прерывания Int0
209 void Inn0(void) interrupt 0 using 0
210 {
211 1 K1 = K2 = K3 = K4 = 0;
212 1 }
213 //Прерывания Int1
214 void Inn1(void) interrupt 2 using 0
215 {
216 1 K1 = K2 = K3 = K4 = 0;
217 1 }
Далее рассмотрим функции.
Функция "Wait_BW" ожидает сброса флага занятости индикатора. Все линии шины данных индикатора устанавливаются в лог. 1. Линия RS сбрасывается, что соответствует выбору регистра команд. Линия RW устанавливает в состояние лог. 1, что соответствует чтению данных из индикатора. Индикатор в ответ должен установить старший бит в ноль по отрицательному перепаду сигнала Е. Далее в цикле линию Е сбрасываем и с задержкой устанавливаем заново. После задержки проверяем старший бит линии данных. Если он сброшен, то происходит выход из цикла, в противном случае цикл повторяется. Количество попыток чтения принято равным 250. После 250-й неудаче попытки будут прекращены.
219 void WeitBW(void)
220 {
221 1 DataInd = 0xff;
222 1 RS = 0;
223 1 RW = 1;
224 1 for(i=0;i<250;i++)
225 1 {
226 2 E = 0;
227 2 nop++;
228 2 E = 1;
229 2 nop++;
230 2 if((DataInd & 0x80) == 0) break;
231 2 }
232 1 }
Функция "PutStrobe" формирует строб записи данных в индикатор. Она сбрасывает линию тактирования Е и после задержки устанавливает ее снова, что соответствует фиксации данных в индикаторе.
234 void PutStrobe(void)
235 {
236 1 E = 0;
237 1 nop++;
238 1 nop++;
239 1 nop++;
240 1 nop++;
241 1 E = 1;
242 1 }
Функция "PutCom" выдает команды на индикатор. Она вызывает функцию ожидания сброса флага занятости "Wait_BW". Затем сигнал RW сбрасывается, что соответствует записи данных в индикатор. В шину данных индикатора копируется выдаваемая команда. Далее вызывается функция выдачи строба "PutStrobe".
244 void PutCom(unsigned char data OutByte)
245 {
246 1 WeitBW();
247 1 RW = 0;
248 1 DataInd = OutByte;
249 1 nop++;
250 1 nop++;
251 1 PutStrobe();
252 1}
Функция "PutData" запускает уже рассмотренную функцию ожидания готовности индикатора "Wait_BW". Устанавливает сигнал RS, выбирая тем самым регистр данных и сбрасывает сигнал RW, определяя работу на запись. Данные помещаются на линию данных индикатора. Вызывается функция выдачи строба "PutStrobe".
254 void PutData(unsigned char data OutByte)
255 {
256 1 WeitBW();
257 1 RS = 1;
258 1 RW = 0;
259 1 DataInd = OutByte;
260 1 nop++;
261 1 nop++;
262 1 PutStrobe();
263 1}
Функция "PutString" выводит текстовую строку на индикатор. Определяются локальные переменные.
265 void PutString(unsigned char Str[])
266 {
267 1 data char i;
268 1 data unsigned char C;
269 1 i = 0;
В цикле символ из строки копируется в переменную "С" и выводится на индикатор функцией "PutData". При достижении нуля (последний символ строки) цикл прекращается.
270 1 do
271 1 {
272 2 C = Str[i++];
273 2 PutData(C);
274 2 } while (Str[i]!= 0);
275 1 }
Функция "ADC" получает данные с АЦП. Здесь также определяются локальные переменные.
277 unsigned char ADC(void)
278 {
279 1 unsigned char data byte;
280 1 unsigned char i;
Все линии АЦП устанавливаются в состояние лог. 1. Данные в переменной АЦП обнуляются.
281 1 CS = 1;
282 1 CLK = 1;
283 1 DO = 1;
284 1 byte = 0;
Линия "CS" устанавливается в лог. 0, после чего АЦП начинает преобразование данных. Ожидается готовность данных. Линия "DO" будет установлена в лог. 1.
285 1 CS = 0;
286 1 while (~DO);
Далее начинает тактироваться линия "CLK".
287 1 CLK = 1;
288 1 CLK = 0;
289 1 nop++;
Начиная со второго такта биты данных в цикле принимаются в младший бит переменной.
290 1 for (i = 1; i < 9; i++)
291 1 {
292 2 CLK = 1;
293 2 CLK = 0;
294 2 nop++;
295 2 byte = byte << 1;
296 2 byte = byte | DO;
297 2 }
Функция возвращает принятое значение напряжения с АЦП.
298 1 return byte;
299 1 }
Функция "DecodStr" добавляют в строку с текстом числовые значения. Она к качестве параметра получает трехзначное число в BCD коде. Функция переводит в кодировку ASCII младший символ переданного ей числа. Затем этот символ помещается в строку на i-тую позицию. Данные в переменной сдвигаются на 4 позиции влево. Операции производятся в цикле начиная с символа в строке с индексом 7. При обработке всех трех цифр цикл прекращается. Цифры преобразуются начиная с младшего разряда.
300 void DecodSts(unsigned short Uxxx)
301 {
302 1 for(i = 7;i > (5-1);i--)
303 1 {
304 2 str[i] = (0x30+(Uxxx & 0x000f));
305 2 Uxxx = Uxxx >> 4;
306 2 }
307 1 }
7. ПРОВЕРКА РАБОТОСПОСОБНОСТИ
Для проверки работоспособности написанной программы используем ПК, на котором установлена программа ISIS программного комплекса Proteus. На рисунке 4 изображена модель для тестирования программы.
Рис. 7.1 - Модель в среде Proteus
Моделирование произведено в режиме прямой передачи.
Рис. 7.2 - Старт с питания 242 В, скачек питания до 187 В, Uвых = 200 В
Рис. 7.3 - Старт с питания 187 В, скачек питания до 242 В, Uвых = 200 В
Рис. 7.4 - Старт с питания 242 В, Uвых = 50 В, изменение Uвых = 200 В
Рис. 7.5 - Старт с питания 187 В, Uвых = 200 В, изменение Uвых = 50 В
8. ЛИСТИНГ
C51 COMPILER V8.05a, COMPILATION OF MODULE STABILIZATOR
OBJECT MODULE PLACED IN stabilizator.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE stabilizator.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <REG52.H>
2 #include <string.h>
3
4 #define DataInd P0
5 #define klav P2
6 #define Kp 0.2
7 #define Ki 0.015
8 #define Ktr 1
9 #define T ((60/12)*1000000/500)
10 #define Tic (0-T)
11
12 sbit RS = P3^7;
13 sbit RW = P3^6;
14 sbit E = P3^5;
15 sbit CS = P1^7;
16 sbit CLK = P1^6;
17 sbit DO = P1^5;
18 sbit K1 = P1^1;
19 sbit K3 = P1^2;
20 sbit K2 = P1^3;
21 sbit K4 = P1^4;
22
23 unsigned char data i=0;
24 unsigned char data nop;
25 unsigned short data DataKlav=0x220;
26 unsigned short data Uout=200;
27 unsigned char data buf;
28 unsigned short data buf2;
29 unsigned char code str1[]="Uout= V";
30 unsigned char code str2[]="Uizm= V";
31 unsigned char code strZero[]=" ";
32 unsigned char data str[10];
33 unsigned short data rms;
34 unsigned short data rmsBCD;
35 unsigned short data Uin = 220;
36 float data gamma;
37 signed short data oh;
38 signed short data oh_do = 0;
39 signed short data S;
40 unsigned short data Ui = (160*2.5);//
41 unsigned short data Tic2;
42 signed short data Upr;//
43 signed short data Uint;//
44
45 bit regim;
46
47 void WeitBW(void);
48 void PutCom(unsigned char data OutByte);
49 void PutStrobe(void);
50 void PutData(unsigned char data OutByte);
51 void PutString(unsigned char Str[]);
52 unsigned char ADC(void);
53 void DecodSts(unsigned short Uxxx);
54
55 void main(void)
56 {
57 1 //Инициализация
58 1 K1 = K2 = K3 = K4 = 0;
59 1 TMOD = 0x11;
60 1 TH0 = (Tic >> 8);
61 1 TL0 = Tic;
62 1 EA = 1;
63 1 ET0 = ET1 = 1;
64 1 EX0 = EX1 = 1;
65 1 gamma = (1-((float)Uout/Uin))*Ktr;
66 1 //Инициализация индикатора
67 1 PutCom(0x38);
68 1 PutCom(0x0c);
69 1 PutCom(0x06);
70 1 PutCom(0x01);
71 1
72 1 TR0 = 1;
73 1 while(1)
74 1 {
75 2 //Опрос клавиатуры
76 2 klav = 0x0f;
77 2 buf = klav;
78 2 klav = 0xf0;
79 2 buf = buf | klav;
80 2 if(buf != 0xff)
81 2 {
82 3 if(regim == 1||buf == 0xb7)
83 3 {
84 4 DataKlav = DataKlav << 4;
85 4 switch(buf)
86 4 {
87 5 case(0x7d): DataKlav += 0; break;
88 5 case(0xee): DataKlav += 1; break;
89 5 case(0xde): DataKlav += 2; break;
90 5 case(0xbe): DataKlav += 3; break;
91 5 case(0xed): DataKlav += 4; break;
92 5 case(0xdd): DataKlav += 5; break;
93 5 case(0xbd): DataKlav += 6; break;
94 5 case(0xeb): DataKlav += 7; break;
95 5 case(0xdb): DataKlav += 8; break;
96 5 case(0xbb): DataKlav += 9; break;
97 5 case(0xe7): DataKlav = 0; break;//Сброс
98 5 case(0xb7): //Режим
99 5 {
100 6 DataKlav = DataKlav >> 4;
101 6 if(regim == 1)
102 6 {
103 7 Uout = ((DataKlav & 0x0f00) >> 8)*100 + ((DataKlav & 0x00f0) >>4)*10 + (DataKlav & 0x000f);
104 7 if (Uout < 50)
105 7 {
106 8 Uout = 50;
107 8 DataKlav = 0x50;
108 8 }
109 7 if (Uout > 200)
110 7 {
111 8 Uout = 200;
112 8 DataKlav = 0x200;
113 8 }
114 7 }
115 6 regim = !regim;
116 6 break;
117 6 }
118 5 }
119 4 }
120 3 while(klav!=0xf0);
121 3 klav = 0xff;
122 3 }
123 2 //Индикация
124 2 PutCom(0x80);
125 2 strcpy(str,str1);
126 2 DecodSts(DataKlav);
127 2 PutString(str);
128 2
129 2 PutCom(0xc0);
130 2 if(regim ==0)
131 2 {
132 3 strcpy(str,str2);
133 3 DecodSts(rmsBCD);
134 3 }
135 2 else strcpy(str,strZero);
136 2 PutString(str);
137 2 }//while
138 1 }//main
139
140 //Прерывания Таймера Т0
141 void Timer0(void) interrupt 1 using 0
142 {
143 1 TR0 = 0;
144 1 TH0 = (Tic >> 8);
145 1 TL0 = Tic;
146 1 TR0 = 1;
147 1 //Получаем данные с RMS-DC датчика
148 1 rms = ADC();
149 1 rms = rms * 2.5;
150 1 buf2 = (rms/100) << 8;
151 1 buf = rms%100;
152 1 rmsBCD = buf2 + ((buf/10) << 4) + buf%10;
153 1 //ПИ-регулятор
154 1 oh = Uout - rms;
155 1 S = S + oh;
156 1 Upr = Kp*oh;
157 1 Uint = Ki*S;
158 1 Ui = rms + Upr + Uint;
159 1 Uin = rms / (1-(gamma/Ktr));
160 1 gamma = ((1-((float)Ui/Uin))*Ktr);
161 1 //Прямая передача
162 1 if (gamma == 0)
163 1 {
164 2 Tic2 = (0 - T/2);
165 2 TH1 = (Tic2 >> 8);
166 2 TL1 = Tic2;
167 2 K2 = K3 = 0;
168 2 K1 = K4 = 1;
169 2 }
170 1
171 1 //Отбавка
172 1 else if (gamma > 0)
173 1 {
174 2 Tic2 = (0 - gamma*T);
175 2 TH1 = (Tic2 >> 8);
176 2 TL1 = Tic2;
177 2 K2 = 1;
178 2 K4 = 0;
179 2 K3 = 1;
180 2 K1 = 0;
181 2 }
182 1 //Добавка
183 1 else
184 1 {
185 2 Tic2 = (0 + gamma*T);
186 2 TH1 = (Tic2 >> 8);
187 2 TL1 = Tic2;
188 2 K2 = 0;
189 2 K4 = 1;
190 2 K3 = 0;
191 2 K1 = 1;
192 2 }
193 1 TR1 = 1;
194 1 }
195 //Прерывания Таймера Т1
196 void Timer1(void) interrupt 3 using 0
197 {
198 1 K3 = !K3;
199 1 K1 = !K1;
200 1 if (gamma == 0)
201 1 {
202 2 K2 = !K2;
203 2 K4 = !K4;
204 2 }
205 1 TR1 = 0;
206 1 }
207
208 //Прерывания Int0
209 void Inn0(void) interrupt 0 using 0
210 {
211 1 K1 = K2 = K3 = K4 = 0;
212 1 }
213 //Прерывания Int1
214 void Inn1(void) interrupt 2 using 0
215 {
216 1 K1 = K2 = K3 = K4 = 0;
217 1 }
218 //Функции работы с индикатором
219 void WeitBW(void)
220 {
221 1 DataInd = 0xff;
222 1 RS = 0;
223 1 RW = 1;
224 1 for(i=0;i<250;i++)
225 1 {
226 2 E = 0;
227 2 nop++;
228 2 E = 1;
229 2 nop++;
230 2 if((DataInd & 0x80) == 0) break;
231 2 }
232 1 }
233
234 void PutStrobe(void)
235 {
236 1 E = 0;
237 1 nop++;
238 1 nop++;
239 1 nop++;
240 1 nop++;
241 1 E = 1;
242 1 }
243
244 void PutCom(unsigned char data OutByte)
245 {
246 1 WeitBW();
247 1 RW = 0;
248 1 DataInd = OutByte;
249 1 nop++;
250 1 nop++;
251 1 PutStrobe();
252 1 }
253
254 void PutData(unsigned char data OutByte)
255 {
256 1 WeitBW();
257 1 RS = 1;
258 1 RW = 0;
259 1 DataInd = OutByte;
260 1 nop++;
261 1 nop++;
262 1 PutStrobe();
263 1 }
264
265 void PutString(unsigned char Str[])
266 {
267 1 data char i;
268 1 data unsigned char C;
269 1 i = 0; // Счетчик символов
270 1 do
271 1 { // Цикл вывода строки
272 2 C = Str[i++];
273 2 PutData(C);
274 2 } while (Str[i]!= 0); // Признак конца - 0
275 1 }
276
277 unsigned char ADC(void)
278 {
279 1 unsigned char data byte;
280 1 unsigned char i;
281 1 CS = 1;
282 1 CLK = 1;
283 1 DO = 1;
284 1 byte = 0;
285 1 CS = 0;
286 1 while (~DO);
287 1 CLK = 1;
288 1 CLK = 0;
289 1 nop++;
290 1 for (i = 1; i < 9; i++)
291 1 {
292 2 CLK = 1;
293 2 CLK = 0;
294 2 nop++;
295 2 byte = byte << 1;
296 2 byte = byte | DO;
297 2 }
298 1 return byte;
299 1 }
300 void DecodSts(unsigned short Uxxx)
301 {
302 1 for(i = 7;i > (5-1);i--)
303 1 {
304 2 str[i] = (0x30+(Uxxx & 0x000f));
305 2 Uxxx = Uxxx >> 4;
306 2 }
307 1 }
308
309
310
311
312
313
314
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1250 ----
CONSTANT SIZE = 30 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 43 3
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
ЛИТЕРАТУРА
программа листинг моделирование индикатор
1. Магда Ю. С. Микроконтроллеры серии 8051: практический подход. -- М.: ДМК Пресс, 2008. -- 228 с.
2. Керниган, Брайан У., Ритчи, Деннис М. Язык программирования С, 2-е издание. : Пер. с англ. -- М. : Издательский дом "Вильяме", 2009. -- 304 с.: ил.
3. Стабилизаторы переменного напряжения с высокочастотным широтно-импульсным регулированием/ А.В. Кобзев, Ю.М. Лебедев, Г.Я. Михальченко и др. - М.: Энегроатомиздат. 1986.
4. Александров, К.К. Электротехнические чертежи и схемы / К.К. Александров, Е.Г. Кузьмина. - М.: Энергоатомиздат, 1990. - 288 с.
5. www.gaw.ru
6. www.alldatasheet.com
Размещено на Allbest.ru
Подобные документы
Разработка функциональной и принципиальной схемы. Выбор управляющего контроллера. Описание МК PIC16F626, МК AVR, МК 51. Выбор элементной базы. Разработка управляющей программы. Описание алгоритма работы программы. Схема устройства, листинг программы.
курсовая работа [492,9 K], добавлен 28.12.2012Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.
курсовая работа [721,4 K], добавлен 10.11.2010Создание системы, осуществляющей запуск программы по расписанию, которое хранится в реестре. Методы и средства взаимодействия с аппаратными и программными средствами, типы интерфейсов. Алгоритм работы и листинг программы, проверка ее работоспособности.
курсовая работа [78,6 K], добавлен 13.11.2009Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.
курсовая работа [1,4 M], добавлен 16.03.2012Описание функциональных блоков контроллера. Анализ серий микроконтроллеров представленных на рынке и используемых в цифровых магнитолах: AVR, PIC, MK-51. Микровыключатели К1-К6, их функции. Разработка функционирования программы, схема устройства.
курсовая работа [483,5 K], добавлен 28.12.2012Основные параметры устройства отображения информации. Обоснование выбора используемых ресурсов микроконтроллера и схемы включения. Разработка схемы алгоритма. Описание и отладка программы. Схема электрическая принципиальная и листинг трансляции программы.
курсовая работа [121,3 K], добавлен 12.12.2014Структурная схема моделируемой системы и её описание. Временная диаграмма и Q-схема системы. Укрупнённая и детальная схема моделирующего алгоритма. Описание машинной программы решения задачи. Описание возможных улучшений и оптимизации в работе системы.
курсовая работа [69,2 K], добавлен 02.07.2011Предназначение и методология системы ARIS, преимущества использования скриптов. Сравнительный анализ CASE–средств. Моделирование процессов управления средствами ARIS. Разработка алгоритма, описание работы и листинг программы, инструкция пользователя.
дипломная работа [4,5 M], добавлен 10.06.2011Создание на языке C базы данных "Стадионы города", требования к программе. Осуществление загрузки базы данных в массив и вывод главного меню в основной программе. Алгоритм работы программы в виде блок-схемы. Описание функций программы и ее листинг.
курсовая работа [183,6 K], добавлен 06.10.2010Создание базы данных и СУБД. Структура простейшей базы данных. Особенности языка программирования Турбо Паскаль. Описание типов, констант, переменных, процедур и функций. Описание алгоритма базы данных (для сотрудников ГИБДД), листинг программы.
курсовая работа [26,3 K], добавлен 26.01.2012