Подключение углового кодера к микроконтроллеру AVR ATmega8

В этой статье будет рассмотрена схема подключения углового кодера к микроконтроллеру AVR ATmega8 и приведена программа на языке C (с пояснениями), обеспечивающая взаимодействие этих устройств. Микроконтроллер ATmega8 (семейство AVR) был специально спроектирован для применения во встраиваемых приложениях (embedded applications).

Подключение углового кодера к микроконтроллеру AVR ATmega8: внешний вид

Принципы работы углового кодера

Угловой кодер представляет собой устройство кодирования по углу поворота (в отличие от линейного кодирования). По мере поворота входного вала он генерирует поток импульсов, по числу которых определяется угол поворота. Обычно применяется для определения углового перемещения двигателя или вала (оси). Часто используется для замены аналоговых потенциометров и конденсаторов переменной ёмкости. Имеет от трех до пяти контактов. Внешний вид типового углового кодера представлен на следующем рисунке.

Внешний вид углового кодера

Представленный на рисунке угловой кодер имеет следующие контакты:

  • земля;
  • контакт для подачи питающего напряжения 5В;
  • контакт выходного сигнала A;
  • контакт выходного сигнала B;
  • контакт шкалы или контакт общего назначения.

Если на угловой кодер подано питающее напряжение и осуществляется вращение его ручки, то он генерирует следующую последовательность импульсов, показанную в следующей таблице.

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

То есть если мы вращаем ручку кодера по часовой стрелке, то мы будем иметь отрицательный перепад сигнала сначала на контакте A, а потом на контакте B.

Если же мы вращаем ручку кодера против часовой стрелки, то мы будем иметь отрицательный перепад сигнала сначала на контакте B, а потом на контакте A.

Если угловой кодер имеет 20 позиций, то перепад сигнала будет происходить один раз за 360/20 = 18 градусов. Если число позиций углового кодера больше, то и его точность будет также увеличиваться.

Таким образом, мы будем иметь сведения о направлении вращения и угле поворота кодера. Следовательно мы сможем определить и положение ручки кодера в каждый момент времени.

Необходимые компоненты

Аппаратное обеспечение

Микроконтроллер ATmega8
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
Конденсатор 100 нФ (2 шт.)
Резистор 220 Ом (2 шт.)
Резистор 1 кОм
Светодиод (8 шт.)

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Работа схемы

Схема устройства приведена на следующем рисунке.

Схема подключения углового кодера к микроконтроллеру AVR ATmega8

Конденсаторы в данной схеме используются для устранения эффектов биений от углового кодера. Без них могут возникнуть сложности в правильном считывании позиции углового кодера.

Когда ручка кодера вращается, то возникает разновременность срабатывания между двумя выходными контактами. С помощью микроконтроллера ATmega8 можно распознать эту разновременность срабатывания для вращения ручки кодера по часовой и против часовой стрелки.

Если вращение происходит по часовой стрелке, то значение двоичного счетчика увеличивается на 1 и это событие отображается с помощью светодиодов, присутствующих в схеме. Если вращение происходит против часовой стрелки, то значение двоичного счетчика уменьшается на 1, что также отображается с помощью светодиодов.

Для данной схемы мы никоим образом не изменяем фьюзы (fuse bits) микроконтроллера atmega8, поэтому он будет работать на частоте 1 МГц от своего внутреннего генератора.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

#include <avr/io.h> // заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000UL // задание тактовой частоты микроконтроллера
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе
int main(void)
{
DDRD = 0xFF; // установка portD на вывод данных
PORTD =0;
DDRC= 0; // установка portC на ввод данных
int count =0;
int i=0;
while(1)
{
if (i==0)
{
if ((bit_is_clear(PINC,0))||(bit_is_clear(PINC,1)))
// если в течение цикла на каких-нибудь контактах углового кодера имеет место отрицательный перепад сигнала
{
i= 1;
_delay_ms(10);
if (bit_is_clear(PINC,0) )
// если на PINB отрицательный перепад сигнала случился вторым (то есть после PINA)
{
if (count<255)
{
count++;
// увеличение двоичного счетчика на 1 если его значение менее 255
}
}
if (bit_is_clear(PINC,1))
// если на PINA отрицательный перепад сигнала случился вторым (то есть после PINB)
{
if (count>0)
{
count--;
// если значение двоичного счетчика больше 0, то уменьшить его значение на 1
}
}
}
}
PORTD = count;
if ((bit_is_set(PINC,0))&&(bit_is_set(PINC,1) )) // ждем пока не сбросится позиция ручки кодера
{
i = 0;
}
}
}

Видео, демонстрирующее работу схемы

 

(1 голосов, оценка: 5,00 из 5)
Загрузка...
2 просмотров


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *