Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
1
Добавлен:
29.11.2025
Размер:
11.79 Mб
Скачать

 

 

Окончание таблицы 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]