Программное управление технологическим оборудованием
.pdfЛабораторная работа 8
Реализация временных функций в микропроцессорных системах управления
Цель работы:
Изучить особенность программной и аппаратной реализации временных функций, режимы работы и порядок формирования таймеров микроконтроллера, реализацию временных функций с помощью языка программирования С.
Порядок выполнения работы:
Изучить теоретические вопросы, связанные с понятием машинного цикла, с принципом функционирования таймера-счётчика, системой прерываний.
Изучить принципиальную электрическую схему к лабораторной работе.
Разработать программу в соответствии с индивидуальным заданием.
Отладить программу в среде MPLAB IDE.
Загрузить программу в учебный стенд.
Исследовать работу временных функций.
Оформить отчёт по лабораторной работе.
Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Реализация временных функций
Временные функции в микропроцессорных системах используются в случаях, когда необходимо выполнять какие либо действия периодически, либо производить измерение длительности какого либо события. Наибольшее распространение для реализации временных функций получили метод программных циклов и использование таймера/счётчика. Во всех случаях микроконтроллер оперирует не непосредственно временем, а количеством машинных циклов, выполненных за интересующий интервал времени. Машинный цикл микроконтроллера – это процедура выполнения ядром микроконтроллера одной инструкции за один машинный такт, равный двум периодам тактирующего генератора. Частота внутреннего тактирующего генератора микроконтроллера dsPIC33fj32mc204 (по умолчанию) равна 7.37МГц. Следовательно, машинный цикл длится секунды.
491
1.2 Метод программных циклов
Метод программных циклов относится к программным способам реализации временной задержки и состоит в следующем. В некоторую переменную загружают число, которое затем в каждом проходе цикла уменьшается на 1. Так продолжается до тех пор, пока содержимое переменной не станет равной нолю, что интерпретируется программой как момент выхода из цикла, и, следовательно, истечения требуемого промежутка времени. Время задержки при этом определяется числом, загруженным в переменную-счетчик, и временем выполнения команд, образующих цикл.
Для организации временных задержек библиотека компилятора MPLAB C30 имеет специальную функцию для языка программирования C:
void __delay32(unsigned long cycles);
Недостатком программного способа реализации временной задержки является нерациональное использование ресурсов микроконтроллера: во время формирования задержки МК практически простаивает, так как не может решать никаких задач управления объектом. В то же время аппаратные средства микроконтроллера позволяют реализовать временные задержки на фоне основной программы работы.
1.3 Использование таймера/счётчика
Таймеры/счётчики (Т/С) предназначены для подсчёта внешних событий, для получения программно-управляемых временных задержек и выполнения времязадающих функций микроконтроллера.
Микроконтроллеры семейства dsPIC33 имеют несколько 16-разрядных таймеров. Таймеры имеют обозначение Timer1, Timer2, Timer3 и т.д. С небольшими исключениями, все 16-битные таймеры имеют одинаковую функциональность, и разделены на 3 типа:
1.Таймер типа A (Timer1);
2.Таймер типа B (Timer2, Timer4, Timer6, Timer8);
3.Таймер типа C (Timer3, Timer5, Timer7, Timer9).
Таймеры типа B и C могут быть объединены для формирования 32разрядного таймера.
Каждый из таймеров настраивается следующими регистрами, доступными для чтения и записи:
492
1.TMRx4 – регистр счёта;
2.PRx – регистр периода;
3.TxCON – регистр конфигурации.
Также с каждым таймером ассоциированы следующие биты в регистре управления прерываниями:
1.TxIE – бит разрешения прерывания;
2.TxIF – бит статуса прерывания;
3.TxIP<2:0> – биты установки приоритета прерывания.
2 Электрическая принципиальная схема к лабораторной работе
На рис. 2.1 приведена электрическая принципиальная схема к лабораторной работе.
Рис. 2.1. Электрическая принципиальная схема к лабораторной работе
В схеме два дискретных входа оформлены в виде двух переключателей SA1 и SA2, подключенных к выводам RA2 и RA3 микроконтроллера. Два дискретных выхода оформлены в виде двух светодиодов VD1 и VD2, подключенных к выводам RB15 и RB13 микроконтроллера соответственно.
493
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, позволяющую мигать светодиодом VD1 с частотой 1Гц.
Метод программных циклов.
Листинг программы для решения задачи:
#include <P33FJ32MC204.h> #define FOSC 7370000 #define FCY (FOSC / 2)
_FOSCSEL(FNOSC_FRC) // настройка работы микроконтроллера // от внутреннего тактового генератора
void main() |
|
{ |
|
TRISBbits.TRISB15 = 0; |
// Выход VD1 (RB15) |
while (1) |
|
{ |
|
__delay32(FCY); |
|
LATBbits.LATB1 |
|
5 = 1; |
|
__delay32(FCY); |
|
LATBbits.LATB1 |
|
5 = 0; |
|
} |
|
} |
|
Использование таймера/счётчика.
Анализ задачи: Таймер/счётчик T1 настроен таким образом, что прерывания генерируются с частотой 1 кГц. В функции прерывания происходит увеличение значения переменной _ms на 1, таким образом, переменная _ms содержит количество миллисекунд, прошедших с момента запуска программы. В основном цикле происходит анализ значения переменной _ms, и в зависимости от этого, происходит управление светодиодом по заданному алгоритму.
Листинг программы для решения задачи:
#include
<P33FJ32MC204.h>
// настройка работы
_FOSCSEL(FNOSC_FRC) микроконтроллера
// от внутреннего тактового генератора
// Инициализация таймера
T1
494
void Init_Timer1() |
|
|
{ |
|
|
T1CON = 0; |
// сброс таймера |
|
IFS0bits.T1IF = |
|
|
0; |
|
// сброс флага прерывания таймера |
IEC0bits.T1IE = |
// разрешение прерывания от |
|
1; |
|
таймера |
TMR1 |
|
// обнуление текущего значения |
= |
0x0000; |
таймера |
PR1 = 0x0E65; |
// задание периода таймера |
|
|
|
= 1; // разрешение работы таймера и его |
T1CONbits.TON |
запуск |
|
}
int _ms = 0;
// Прерывание таймера T1 по совпадению void __attribute__((interrupt)) _T1Interrupt()
{
_ms++; |
|
|
|
|
// Сброс флага прерывания |
IFS0bits.T1IF = 0; |
таймера |
|
TMR1 |
= 0; |
// Перезапуск таймера |
}
void main()
{
Init_Timer1();
TRISBbits.TRISB15 = 0; // Выход VD1 (RB15) while (1)
{
if (_ms < 1000)
{
LATBbits.LATB15 = 0;
}
else if (_ms < 2000)
{
LATBbits.LATB15 = 1;
}
else
{
_ms = 0;
}
}
}
495
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, позволяющую выполнить следующие действия:
1.При включении тумблера SA1 мигать светодиодом VD1 с частотой 1Гц.
2.При включении тумблеров SA1 и SA2 одновременно мигать светодиодами VD1 и VD2 попеременно с частотой 1Гц.
3.При включении тумблера SA1 зажечь светодиод VD1 на 2 секунды.
4.При включении тумблера SA1 управлять светодиодом VD1 по следующему алгоритму: время включения – 2 с, время отключения – 1 с.
5.При любом изменении тумблера SA1 управлять светодиодом VD1 по следующему алгоритму: время включения – 1 с, время отключения – 2 с.
5.Контрольные вопросы
1.Какие существуют способы формирования временных задержек в микроконтроллерных системах?
2.Как формируется временная задержка методом программных циклов?
3.Как формируется временная задержка с использованием таймера/счётчика?
4.Каким образом можно определить длительность импульса?
5.Каким образом можно определить частоту сигнала?
496
Лабораторная работа 9
Исследование устройства динамической индикации
Цель работы:
Изучить алгоритм, принцип работы и схему электрическую принципиальную устройства динамической индикации. Разработать и отладить программу вывода информации на устройство динамической индикации.
Порядок выполнения работы:
Изучить теоретические вопросы, связанные с устройствами статической и динамической индикации.
Изучить принципиальную электрическую схему к лабораторной работе.
Разработать программу в соответствии с индивидуальным заданием.
Отладить программу в среде MPLAB IDE.
Загрузить программу в учебный стенд.
Исследовать работу устройства динамической индикации.
Оформить отчёт по лабораторной работе.
Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Устройства цифровой индикации
Для отображения цифровой индикации большое распространение получили светодиодные семисегментные индикаторы (рис. 1.1). Сегменты индикатора расположены в виде восьмёрки и обозначены латинскими буквами алфавита. Засвечивая группы сегментов, можно получить все цифры и некоторые символы.
A
E B
G
E C
H
D
Рис. 1.1. Светодиодный семисегментный индикатор
Конструктивно индикаторы оформляют в виде светодиодных модулей с общим катодом или с общим анодом (рис. 1.2).
497
Рис. 1.2. Электрические принципиальные схемы семисегментных индикаторов с общим анодом (а) и с общим катодом (б)
При построении систем отображения информации различают два подхода: статическая и динамическая индикация.
Статическая индикация подразумевает постоянную засветку каждого из используемых индикаторов в любой момент времени. Таким образом, каждый индикатор подключён через свой регистр-защёлку к шине данных (рис. 1.3), что в свою очередь ведёт к большим аппаратным затратам.
H |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
L |
|
|
|
|
HL |
|
|
|
HL |
|
|
|
HL |
|||||||||||||
1 |
2 |
|
|
3 |
|
|
4 |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R |
|
|
|
|
|
R |
|
|
|
|
R |
|
|
|
|
R |
||||||||||
1 |
|
2 |
|
|
3 |
|
|
4 |
|
|||||||||||||||||
Рис. 1.3. Устройство статической индикации
Сущность динамической индикации состоит в поочерёдном циклическом подключении каждого индикатора к источнику данных (рис. 1.4). Таким образом, аппаратные затраты существенно снижаются. При реализации устройства динамической индикации с одной стороны каждому из индикаторов необходимо обеспечить достаточное время свечения для того, чтобы не уменьшалась яркость свечения индикаторов, а с другой стороны необходимо обеспечить достаточно быстрое переключение индикаторов, чтобы не было заметно мерцание.
498
D
HL1 |
HL2 |
HL3 |
HL4 |
R1
Рис. 1.4. Устройство динамической индикации
2 Электрическая принципиальная схема к лабораторной работе
На рис.2.1 приведена электрическая принципиальная схема к лабораторной работе.
Рис. 2.1. Электрическая принципиальная схема к лабораторной работе
В качестве символьного светодиодного индикатора LED используется 2 индикатора CA04-41. Индикаторы представляют собой модули по четыре семисегментных светодиодных индикатора с общим анодом.
Для фиксации кода семисегментного символа служит восьмиканальный светодиодный драйвер DD170 MBI5168, представляющий собой сдвиговый регистр вывода, выходные каналы которого выполнены в виде стабилизатора тока для светодиодов. Сигнал тактирования CLK светодиодного драйвера подключен к линии RC4, сигнал данных – к RC3, сигнал защёлки – к линии RB5 порта микроконтроллера.
Для выбора активного индикатора используется дешифратор DD150 HC154. На вход дешифратора подаются сигналы A, B, C, D с линий портов RB6, RB7, RB8, RB9. Непосредственно на индикатор сигнал подаётся через усилитель тока, собранный на транзисторах VT151..VT158.
499
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, отображающую на LED количество секунд, прошедших после запуска программы.
Анализ задачи: Для хранения символов индикации используется массив _data[8], i-тый элемент которого представляет собой код символа, отображаемого на i-той позиции индикатора LED. Для хранения активного в данный момент времени индикатора используется переменная _ind. Переключение активного индикатора происходит по прерыванию таймера T1, настроенного таким образом, что прерывания генерируются с частотой 1 кГц. Количество секунд, прошедших с момента запуска программы, хранится в переменной seconds. В основном цикле программы происходит непрерывное увеличение значения переменной seconds на 1 с паузой 1 секунда.
Листинг программы:
#include <P33FJ32MC204.h>
#define FOSC 7370000 #define FCY (FOSC / 2)
// объявление кодов сегментов |
|
|
|
|
#define SEG_A |
0x08 |
// |
--- SEG_A --- |
|
#define SEG_B |
0x01 |
// |
| |
| |
#define SEG_C |
0x20 |
// |
SEG_F SEG_B |
|
#define SEG_D |
0x04 |
// |
| |
| |
#define SEG_E |
0x80 |
// |
--- SEG_G --- |
|
#define SEG_F |
0x10 |
// |
| |
| |
#define SEG_G |
0x40 |
// |
SEG_E SEG_C |
|
#define SEG_DP |
0x02 |
// |
| |
| |
|
|
// |
--- SEG_D --- SEG_DP |
|
// объявление кодов цифр |
|
|
|
|
|
SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + |
|||
#define N0 |
SEG_F |
|
|
|
#define N1 |
SEG_B + SEG_C |
|
|
|
#define N2 |
SEG_A + SEG_B + SEG_G + SEG_E + SEG_D |
|||
#define N3 |
SEG_A + SEG_B + SEG_G + SEG_C + SEG_D |
|||
#define N4 |
SEG_F + SEG_G + SEG_B + SEG_C |
|||
#define N5 |
SEG_A + SEG_F + SEG_G + SEG_C + SEG_D |
|||
|
SEG_A + SEG_F + SEG_G + SEG_C + SEG_D + |
|||
#define N6 |
SEG_E |
|
|
|
500
