Программное управление технологическим оборудованием
.pdf
|
|
Окончание таблицы 1.3 |
|
|
|
SCK1O |
|
Вывод PRn назначен выходу тактирования модуля |
UT |
01000 |
SPI |
|
|
Вывод PRn назначен выходу выбора ведомого |
SS1OUT |
01001 |
модуля SPI |
|
|
Вывод PRn назначен выходу модуля |
OC1 |
10010 |
сравнения |
|
|
Вывод PRn назначен выходу модуля |
OC2 |
10011 |
сравнения |
UPD |
|
|
N |
11011 |
Вывод PRn назначен выходу направления модуля |
|
|
квадратурного энкодера |
1.2 Модуль квадратурного энкодера |
||
Квадратурный сигнал - это два сигнала со сдвинутыми по отношению друг к другу на 90° прямоугольными импульсами (рис. 1.3). Для удобства работы сигналы обозначаются как правило A, B либо SIN, COS.
A:
B:
t
Рис. 1.3. Пример квадратурного сигнала
Наиболее распространённым источником квадратурного сигнала являются датчики углового перемещения, называемые так же инкрементальными энкодерами. Такие датчики применяются для определения положения и скорости вращения механизма и используются в системах замкнутого управления.
Счетом фронтов любой части квадратурного сигнала можно контролировать угловое движение, а по соотношению фаз сигналов - направление вращения. В случае, если сигнал фазы A опережает сигнал фазы B, направление вращения энкодера принимается за положительное. Если сигнал фазы A отстаёт от сигнала фазы B, направление вращения принимается за отрицательное.
Некоторые энкодеры могут дополнительно генерировать сигнал нулевой метки (т.н. индексный сигнал). Такой сигнал возникает один раз на полный оборот энкодера и применяется для определения абсолютного положения механизма.
581
Для обработки квадратурного сигнала микроконтроллер dsPIC33fj32mc204 имеет в своём составе модуль квадратурного энкодера, позволяющий аппаратно увеличивать либо уменьшать значение счётчика в зависимости от направления вращения подключённого энкодера. Модуль квадратурного энкодера включает:
1.3 входных контакта для двух фаз квадратурного сигнала (QEA, QEB) и сигнала нулевой метки (INDX);
2.программируемые цифровые фильтры по входам сигналов;
3.квадратурный декодер, определяющий положение и направление вращения датчика; Модуль квадратурного энкодера может работать в двух режимах:
4.сброс счётчика положения происходит при достижении им заданного максимального значения (MAXCNT);
5.сброс счётчика положения происходит при появлении индексного сигнала.
Во всех режимах возможно генерирование прерывания при сбросе
счётчика положения.
Так же модуль может генерировать сигнал направления вращения энкодера (UPDN), определяемого по чередованию фаз квадратурного сигнала. Получаемый сигнал может быть скоммутирован на один из переназначаемых контактов.
Настройка модуля квадратурного энкодера осуществляется с помощью четырёх регистров:
1.QEICON – регистр управления и статуса;
2.DFLTCON – регистр настройки входных цифровых фильтров;
3.POSCNT – регистр счётчика положения;
4.MAXCNT – регистр максимального значения.
Биты регистра QEICON указаны в таблице 1.4, их назначение – в таблице 1.5.
Таблица 1.4
Биты регистра QEICON
Обозначени |
CNTER |
|
QEISI |
IND |
|
|
QEIM<2: |
|
||
е |
R |
- |
DL |
EX |
UPDN |
|
0> |
|
|
|
Номер бита |
15 |
14 |
13 |
12 |
11 |
10 |
|
9 |
|
8 |
|
|
|
|
|
|
|
|
|
||
Обозначени |
SWPA |
PDCO |
TQGA |
TQCKPS<1:0 |
POSR |
|
|
|
UDSR |
|
е |
B |
UT |
TE |
> |
|
ES |
|
TQCS |
|
C |
Номер бита |
7 |
6 |
5 |
4 |
3 |
2 |
|
1 |
|
0 |
|
|
|
|
|
|
|
|
|
|
582 |
Таблица 1.5
Назначение некоторых битов регистра QEICON
Номер |
|
|
|
|
Обозначение |
Описание |
|
бита |
|
|
|
|
|
Флаг ошибки счётчика |
|
15 |
CNTERR |
положения |
|
|
|
CNTERR = 1: Произошла ошибка подсчёта |
|
|
|
положения |
|
|
|
CNTERR = 0: Ошибка |
|
|
|
отсутствует |
|
|
UPD |
|
|
11 |
N |
Флаг направления вращения |
|
|
|
UPDN = 1: Направление вращения положительное |
|
|
|
UPDN = 0: Направление вращения отрицательное |
|
|
|
Флаг обмена входов A |
|
7 |
SWPAB |
и B |
|
|
|
SWPAB = 1: Сигналы фаз A и B подключены |
|
|
|
прямо |
|
|
|
SWPAB = 0: Сигналы фаз A и B перекрещены |
|
|
|
друг с другом |
|
|
TQCKPS<1:0 |
Предделитель счётчика |
|
4-3 |
> |
положения |
|
|
|
TQCKPS<1:0> = 11: Значение |
|
|
|
предделителя 256 |
|
|
|
TQCKPS<1:0> = 10: Значение |
|
|
|
предделителя 64 |
|
|
|
TQCKPS<1:0> = 01: Значение |
|
|
|
предделителя 8 |
|
|
|
TQCKPS<1:0> = 00: Значение |
|
|
|
предделителя 1 |
|
|
|
Источник сброса счётчика |
|
2 |
POSRES |
положения |
|
|
|
POSRES = 1: Сигнал нулевой |
|
|
|
метки |
|
Таким образом, для настройки модуля квадратурного энкодера необходимо выполнить следующее:
1.Задать, какие из переназначаемых контактов будут использоваться в качестве входов квадратурного сигнала и нулевой метки (если используется);
2.Если требуется, задать предделитель счётчика положения, а так же настроить входные цифровые фильтры.
583
2 Электрическая принципиальная схема к лабораторной работе
На рис.2.1 приведена электрическая схема подключения источника квадратурного сигнала к микроконтроллеру.
Рис. 2.1. Электрическая схема подключения источника квадратурного сигнала
В стенде в качестве источника квадратурного сигнала используется инкрементальный энкодер PEC-16, выводы которого через фильтрующие RCцепочки подключены к входам RP16, PR17 микроконтроллера.
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, отображающую на LED значение инкрементального энкодера EP1.
Листинг программы: |
|
|
|
|
#include <P33FJ32MC204.h> |
|
|
|
|
#define FOSC |
|
|
|
|
7370000 #define |
|
|
|
|
FCY (FOSC / 2) |
|
|
|
|
_FOSCSEL(FNOSC_ |
|
// настройка работы |
||
FRC) |
|
микроконтроллера |
||
|
|
// от внутреннего тактового |
||
|
|
генератора |
|
|
// объявление кодов сегментов |
|
|
|
|
#define SEG_A |
0x08 |
// |
--- SEG_A --- |
|
#define SEG_B |
0x01 |
// |
| |
| |
#define SEG_C |
0x20 |
// |
SEG_F |
SEG_B |
#define SEG_D |
0x04 |
// |
| |
| |
584
#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 |
|
|
SEG_A + SEG_B + |
|
#define N7 |
SEG_C |
|
|
SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + |
|
#define N8 |
SEG_F + SEG_G |
|
|
SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + |
|
#define N9 |
SEG_G |
|
#define DIP |
SEG_DP |
|
#define |
|
|
MINUS |
SEG_G |
|
#define OFF |
0x00 |
|
// массив кодов цифр
char DIGITS[] = {N0, N1, N2, N3, N4, N5, N6, N7, N8, N9};
// Инициализация таймера
T1
void Init_Timer1( void )
{
T1CON = 0; |
// сброс таймера |
|
IFS0bits.T1IF = 0; |
// сброс флага прерывания таймера |
|
|
|
// разрешение прерывания от |
IEC0bits.T1IE = 1; |
таймера |
|
TMR1 |
|
// обнуление текущего значения |
= |
0x0000; |
таймера |
|
0x0E65 |
|
PR1 = |
; |
// задание периода таймера |
585
// разрешение работы таймера и его
T1CONbits.TON = 1; запуск
}
char _ind = 0; // номер активного индикатора
char _data[8]; // буфер индикации - массив кодов символов
// Отправление данных в регистр
MBI5168 void Ind_Send(char digit)
{
char c;
for (c = 0; c < 8; c++)
{
//установка требуемого логического уровня
//на последовательном входе SDI
драйвера MBI5168 if ((digit & (1 << c)) != 0)
{
LATCbits.LATC3 = 1;
}
else
{
LATCbits.LATC3 = 0;
}
//формирование синхроимпульса на входе SCK LATCbits.LATC4 = 1;
LATCbits.LATC4 = 0;
}
// формирование синхроимпульса на входе LE
LATBbits.LATB5 = 1;
LATBbits.LATB5 = 0;
}
// Инициализация линий портов |
|
|
|
void Ind_Init() |
|
|
|
{ |
|
|
|
TRISBbits.TRISB6 = 0; |
// Выход |
A |
(RB6) |
TRISBbits.TRISB7 = 0; |
// Выход |
B |
(RB7) |
TRISBbits.TRISB8 = 0; |
// Выход |
C |
(RB8) |
TRISBbits.TRISB9 = 0; |
// Выход |
D |
(RB9) |
586
TRISCbits.TRISC3 = 0; |
// Выход |
SDI |
(RC3) |
|
|
SC |
|
TRISCbits.TRISC4 = 0; |
// Выход |
K |
(RC4) |
TRISBbits.TRISB5 = 0; |
// Выход |
LE |
(RB5) |
}
void Ind_Show(int pos)
{
// Запоминание знака числа int negative = 0;
if (pos < 0)
{
pos = -pos; negative = 1;
}
// Очистка индикатора int i;
for (i = 0; i < 7; i++)
{
_data[i] = OFF;
}
// Разбиение числа на цифры int n = 7;
do
{
_data[n] = DIGITS[pos % 10]; pos /= 10;
n--;
} while (pos > 0);
// Отображение знака числа
if (negative)
587
{
_data[n] = MINUS;
}
}
// Прерывание таймера T1 по совпадению
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt( void )
{
Ind_Send(OFF); |
// Отключение индикатора |
|
LATB &= ~(0x07 << |
// Переключение на |
|
6); |
|
следующий |
LATB |= (_ind << 6); |
// индикатор |
|
Ind_Send(_data[_ind]) |
|
|
; |
|
// Отправка кода цифры |
_ind++; |
// переход к след. индикатору |
|
if (_ind == 8) |
|
|
{ |
|
|
|
_ind = 0; |
|
} |
|
|
|
|
// Сброс флага прерывания |
IFS0bits.T1IF = 0; |
таймера |
|
TMR |
|
|
1 |
= 0; |
// Перезапуск таймера |
}
// Инициализация модуля квадратурного энкодера void Encoder_Init()
{
TRISCbits.TRISC |
|
|
0 |
= 1; |
// Вход A |
TRISCbits.TRISC |
|
|
1 |
= 1; |
// Вход B |
RPINR14bits.QE |
|
// Задание выводу RP17 функции |
A1R |
= 17; |
входа A |
RPINR14bits.QE |
|
// Задание выводу RP16 функции |
B1R |
= 16; |
входа B |
QEICONbits.QEI |
|
|
M |
= 0b101; |
// Режим работы модуля - |
|
|
// сброс по переполнению |
}
void main()
588
{
AD1PCFGL = |
|
0xFFFF; |
// Отключение выводов АЦП |
Encoder_Init(); |
// Инициализация энкодера |
Ind_Init(); |
// Инициализация индикации |
Init_Timer1(); |
// Инициализация таймера |
while (1) |
|
{ |
|
Ind_Show(POSCNT); |
// Отображение результата |
__delay32(FCY / 10); |
|
} |
|
}
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, позволяющую выполнить следующие действия:
1.Вывести на LLI модуль скорости вращения энкодера EP1, VD1 использовать как индикатор знака скорости.
2.Вывести на LLI значение положения энкодера EP1. Превышение значения положения определённой величины сигнализировать миганием светодиода VD1.
3.Вывести на LED значение положения энкодера EP1. Превышение значения положения определённой величины сигнализировать миганием светодиода VD1.
4.Отобразить значение скорости вращения энкодера EP1 на VD1..VD10, используя светодиоды как линейную шкалу.
5.Вывести на LCD положение и скорость вращения энкодера.
5 Контрольные вопросы
1.В чём заключается технология переназначаемых контактов?
2.В каких случаях можно воспользоваться технологией переназначаемых контактов?
3.Каким образом происходит настройка функций переназначаемых контактов?
4.Что такое квадратурный сигнал?
5.Каким образом происходит обработка квадратурного сигнала?
6.Как настраивается модуль квадратурного энкодера микроконтроллера?
589
Лабораторная работа 16
Исследование интерфейса RS232
Цель работы:
Изучить структуру и принцип работы последовательного интерфейса микроконтроллера. Разработать и отладить программу для обмена информации по последовательному каналу в заданном режиме.
Порядок выполнения работы:
1.Изучить теоретические вопросы, связанные с технологией последовательного интерфейса.
2.Изучить принципиальную электрическую схему к лабораторной работе.
3.Разработать программу в соответствии с индивидуальным заданием.
4.Отладить программу в среде MPLAB IDE.
5.Загрузить программу в учебный стенд.
6.Исследовать работу системы ввода квадратурного сигнала.
7.Оформить отчёт по лабораторной работе.
8.Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Интерфейс RS232
Интерфейс RS232 разработан ассоциацией электронной промышленности как стандарт для соединения компьютеров и различных последовательных периферийных устройств.
Последовательная передача данных означает, что данные передаются по единственной линии. При этом биты данных передаются по очереди с использованием одного провода. Уровень напряжения для логического ноля составляет -15..-3В, для логической единицы – +3..+15В. Промежуток -3..+3В соответствует неопределённому значению.
Для синхронизации группе битов данных обычно предшествует специальный стартовый бит, после группы битов следуют бит проверки на чётность (иногда может отсутствовать) и один либо два стоповых бита (рис.
1.1).
590
