Программное управление технологическим оборудованием
.pdf
Рисунок 2.1 – Электрическая принципиальная схема к лабораторной работе
В схеме два дискретных датчика оформлены в виде двух переключателей SA1 и SA2, подключенных к выводам RA2 и RA3 микроконтроллера. Два дискретных выхода оформлены в виде двух светодиодов VD1 и VD2, подключенных к выводам RB15 и RB13 микроконтроллера соответственно.
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, позволяющую отображать на VD1 состояние SA1 и на VD2 состояние SA2.
Ввод дискретных сигналов
Прежде чем приступить к обработке входного дискретного сигнала, необходимо инициализировать используемый порт – настроить линию порта как вход. Так же в случаях, если требуемая линия порта может использоваться для каких либо других периферийных функций, необходимо их отключить.
Непосредственно обработка сигнала от дискретного датчика подразумевает либо определение уровня сигнала в текущий момент времени,
471
либо ожидание появления сигнала требуемого уровня. Конкретная программная реализация процедуры зависит от того, каким образом датчик подключен к микроконтроллеру.
Например, при подключении датчика к линии бита 2 порта RA программа определения уровня сигнала в текущий момент времени будет иметь вид:
#include <P33FJ32MC204.h>
_FOSC(OSCIOFNC_ON & POSCMD_NONE) // отключение дополнительной
// функции порта RA2 – выход // тактирующего сигнала // внутреннего генератора
void main()
{
TRISAbits.TRISA2 = 1; // настройка порта RA2 на вход if (PORTAbits.RA2)
{
•часть программы, выполняемой при ВЫСОКОМ уровне
•сигнала на входе контроллера
}
if (!PORTAbits.RA2)
{
3.1часть программы, выполняемой при НИЗКОМ уровне
3.2сигнала на входе контроллера
}
}
Программа ожидания требуемого уровня сигнала на входе микроконтроллера при данном подключении будет иметь вид:
#include <P33FJ32MC204.h>
_FOSC(OSCIOFNC_ON & POSCMD_NONE) // отключение дополнительной
// функции порта RA2 – выход // тактирующего сигнала // внутреннего генератора
void main()
{
TRISAbits.TRISA2 = 1; // настройка порта RA2 на вход while (PORTAbits.RA2); // ожидание НИЗКОГО уровня сигнала
…
while (!PORTAbits.RA2); // ожидание ВЫСОКОГО уровня сигнала
…
}
472
Вывод дискретных сигналов
Аналогично, прежде чем приступить к управлению выходным дискретным сигналом, необходимо инициализировать используемый порт – настроить линию порта как выход. Так же в случаях, если требуемая линия порта может использоваться для каких либо других периферийных функций, необходимо их отключить.
Для управления дискретным выводом микроконтроллера на соответствующей выходной линии порта необходимо сформировать логический сигнал 0 или 1, что реализуется командами вывода непосредственного операнда, содержащего в требуемом бите значение 0 или 1. Таким образом, при подключении исполнительного устройства к линии бита 15 порта RB программа работы с дискретным выходом микроконтроллера будет иметь вид:
#include <P33FJ32MC204.h> void main()
{
TRISBbits.TRISB15 = 0; // настройка порта RB15 на выход LATBbits.LATB15 = 1; // установка ВЫСОКОГО уровня сигнала
…
LATBbits.LATB15 = 0; // установка НИЗКОГО уровня сигнала
…
}
Блок-схема алгоритма решения задачи представлена на рис. 3.1.
Рисунок 3.1 – Блок-схема алгоритма решения задачи
473
Листинг программы для решения задачи:
#include <P33FJ32MC204.h>
_FOSC(OSCIOFNC_ON & POSCMD_NONE) // отключение дополнительной
// функции порта RA2 – выход // тактирующего сигнала // внутреннего генератора
void main()
{
TRISBbits.TRISB15 = 0; // настройка порта RB15 на выход TRISBbits.TRISB13 = 0; // настройка порта RB13 на выход TRISAbits.TRISA2 = 1; // настройка порта RA2 на вход TRISAbits.TRISA3 = 1; // настройка порта RA3 на вход while (1)
{
LATBbits.LATB15 = PORTAbits.RA2;
LATBbits.LATB13 = PORTAbits.RA3;
}
}
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, выполняющую следующие действия:
1.Если SA1 = 0, то VD1 = 0 и VD2 = 0; иначе, если SA2 = 0, то VD1=1, VD2
=0, если SA2 = 1, то VD1=0, VD2 = 1.
2.Если SA1 = 1 и SA2 = 0 то VD1 = 0 и VD2 = 0, если SA1 = 0 и SA2 = 1, то VD1=1, VD2 = 1, если SA1 = SA2, то VD1=0, VD2 = 1.
3.Если SA1 = 1, то VD1 = 0 и VD2 = 0; иначе, если SA2 = 1, то VD1 = 1, VD2
=0, если SA2 =0, то VD1=0, VD2 = 1.
4.Если SA1 = 1 и SA2 = 1 то VD1 = 0 и VD2 = 0, если SA1 = 0 и SA2 = 0, то VD1 = 1, VD2 = 1, если SA1 ≠ SA2, то VD1 = 1, VD2 = 0.
5 Контрольные вопросы
1.Дайте определение дискретного сигнала.
2.Приведите пример устройства либо механизма, выходной сигнал которого является дискретным.
3.Приведите пример устройства либо механизма, управление которым осуществляется дискретным сигналом.
4.Каким образом настраивается линия порта микроконтроллера на вход либо на выход?
5.Как организуется ввод дискретного сигнала?
6.Как организуется вывод дискретного сигнала?
474
Лабораторная работа 6
Реализация дополнительных портов ввода-вывода дискретных сигналов в микропроцессорных системах управления
Цель работы:
Изучить структуру и особенности работы различных схемы внешних портов ввода-вывода дискретных сигналов. Составить программу ввода, обработки по заданному алгоритму и вывода дискретных сигналов, записать в память программ микроконтроллера и выполнить.
Порядок выполнения работы:
Изучить теоретические вопросы, связанные с функционированием дополнительных дискретных входов-выходов.
Изучить принципиальную электрическую схему к лабораторной работе.
Разработать программу в соответствии с индивидуальным заданием.
Отладить программу в среде MPLAB IDE.
Загрузить программу в учебный стенд.
Исследовать работу дополнительных дискретных входов и выходов.
Оформить отчёт по лабораторной работе.
Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Способы построения внешних портов ввода-вывода
Микроконтроллеры семейства dsPIC33 имеют в своем составе несколько параллельных портов ввода вывода. Однако существуют приложения, в которых требуется большее число портов ввода/вывода.
Существуют различные схемы расширения портов ввода-вывода. Часть из них основана на использовании сдвиговых регистров. Сдвиговый регистр представляет собой набор ячеек, которые последовательно связаны между собой в одном направлении. Таким образом, сдвиговый (или последовательный) регистр служит для преобразования последовательного кода в параллельный либо наоборот. Применение последовательного кода связано с необходимостью передачи большого количества двоичной информации по ограниченному количеству соединительных линий.
Для управления типовыми сдвиговыми регистрами достаточно трёх выводов: тактирование (SCK), линия данных (SER) и вход защёлки (LE). Рассмотрим принцип работы сдвиговых регистров на примере преобразования последовательного кода в параллельный в сдвиговом регистре вывода HC595 (рис. 1.1).
475
Рис. 1.1. Микросхема сдвигового регистра вывода HC595
Отдельные биты двоичной информации последовательно подаются на вход сдвигового регистра SER. Каждый бит сопровождается отдельным тактовым импульсом синхронизации, который поступает на вход синхронизации сдвигового регистра SCK. После поступления первого тактового импульса логический уровень, присутствующий на входе SER, запоминается в первой ячейке регистра.
После поступления второго тактового импульса логический уровень, присутствующий в первой ячейке (установленный в предыдущем шаге), передаётся во вторую ячейку регистра. Одновременно следующий бит входного последовательного кода запоминается в первом триггере сдвигового регистра.
Описанная процедура повторятся количество раз, соответствующее количеству выводов сдвигового регистра.
После того, как весь код записан во внутренние ячейки сдвигового регистра, по тактовому импульсу на входе защёлки LE происходит выставление значений логических уровней сигналов на параллельных выходах Qa…Qh сдвигового регистра в соответствии со значениями внутренних ячеек.
Временная диаграмма работы последовательного регистра вывода представлена на рис. 1.2.
476
Рис. 1.2. Временная диаграмма работы последовательного регистра вывода
Так же к достоинствам сдвиговых регистров следует отнести возможность каскадного соединения большого числа регистров друг с другом. При этом на последовательный вход последующего сдвигового регистра подаётся выход Q’ предыдущего, а входы тактирования и данных всех регистров объединяются. Таким образом, такое соединение регистров не приводит к увеличению числа управляющих линий.
Сдвиговый регистр ввода HC165 (рис. 1.3) функционирует аналогично. Временная диаграмма его работы представлена на рис. 1.4.
477
Рис. 1.3. Микросхема сдвигового регистра вывода HC595
Рис. 1.4. Временная диаграмма работы последовательного регистра ввода
478
2 Электрическая принципиальная схема к лабораторной работе
В схеме использован сдвиговый регистр вывода HC595, к параллельным выходам которого подключены светодиоды VD3..VD10, и сдвиговый регистр ввода HC165, к параллельным входам которого подключены тумблеры SA3..SA10. Управляющие сигналы LE и SCK объединены и подключены к выводам RB5 и RC4 микроконтроллера соответственно. Вход данных регистра вывода HC595 подключен к выводу RC5, выход данных регистра ввода HC165 подключен к выводу RA4.
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, позволяющую отображать на VD3..VD10 состояние SA3..SA10.
Блок-схема алгоритма решения задачи представлена на рис. 3.1.
Рисунок 3.1 – Блок-схема алгоритма решения задачи Листинг программы для решения задачи:
#include <P33FJ32MC204.h>
// настройка линий void Serial_Init() порта
{
TRISCbits.TRISC4 = |
|
SC |
(RC4 |
0; |
// Выход |
K |
) |
TRISBbits.TRISB5 = |
|
|
(RB5 |
0; |
// Выход |
LE |
) |
479
TRISCbits.TRISC5 = |
|
|
(RC5 |
- |
0; |
// Выход |
SER |
) |
VD |
TRISAbits.TRISA4 = |
|
|
(RA4 |
- |
1; |
// Вход |
SDI |
) |
SA |
}
// Отправление данных в регистр void Serial_Send(char VDs) HC595
{
char c;
for (c = 0; c < 8; c++)
{
установка требуемого логического уровня
на последовательном входе SER регистра HC595
начиная с последнего бита if ((VDs & (1 << (7 - c))) != 0)
{
LATCbits.LATC5 = 1;
}
else
{
LATCbits.LATC5 = 0;
}
// формирование синхроимпульса на входе SCK LATCbits.LATC4 = 1;
LATCbits.LATC4 = 0;
}
// формирование синхроимпульса на входе LE
LATBbits.LATB5 = 1;
LATBbits.LATB5 = 0;
}
char Serial_Read() |
// Чтение данных из регистра HC165 |
{ |
|
формирование синхроимпульса на LE LATBbits.LATB5 = 0;
LATBbits.LATB5 = 1;
чтение логического уровня
на последовательном выходе Qh регистра
HC165 char SAs = 0x00; char c;
480
