энкодер

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Родился
Аватара пользователя
Сообщения: 16
Зарегистрирован: Сб авг 10, 2013 08:45:59

Сообщение avr_proger »

Имею в наличии энкодер EC12E24204A9, механический, 24 тыковый.
Изображение
Пока не трогаю J3, J4 в единичку. Вращаю, вижу следующее
J3--- 1 1 0 0 1
J4--- 1 0 0 1 1
шаг--1 2 3 4 5

Но, очень часто состояние замирает в положении 10, либо 01 (на четвёртом шаге в общем). Причём крутилка находится в устойчивом состоянии. Два энкодера, такое дело на обоих. Сходил купил ещё, то же самое. Это нормально? Как подобный случай обрабатывать?

Если слегка пошевелить - в состояние 11 не переходит, переходит, возможно, на следующем шаге, как повезёт в общем.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 16545
Зарегистрирован: Вт сен 07, 2010 03:01:06
Откуда: Moscow-Izmaylovo

Сообщение m.ix »

Энкодеры бывают различные.
И даже такие - правда не было у меня на 16


встречались три различных типа энкодера как минимум, хотя по корпусу они были почти такими 3х или 5ти ногими

Изображение

после разброки на диске вала были иные рисунки в отличии от этого стандартного.
Лечу лечить WWWашу покалеченную технику.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

avr_proger писал(а):Но, очень часто состояние замирает в положении 10, либо 01
И что с того? Это нормально. Как обрабатывать - например, так:
Спойлер

Код: Выделить всё

//----------------------------------------------------------------------------

//Модуль поддержки энкодера

//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2).
//Для подавления дребезга используется анализ двух последовательных
//состояний. Это позволяет обойтись без временных задержек.
//Функция Encoder_Init() должна вызываться один раз в начале программы.
//Функция Encoder_Exe() должна вызываться в основном цикле.
//При повороте энкодера на шаг вправо или влево вызываются функции
//To_Do_Step_Up() и To_Do_Step_Dn() соответственно.

//----------------------------------------------------------------------------

#include "Main.h"
#include "Encoder.h"

//----------------------------- Константы: -----------------------------------

#define ENC_F1   (1 << PC0) //фаза энкодера F2
#define ENC_F2   (1 << PC1) //фаза энкодера F1

#define Pin_ENC_F1 (PINC & ENC_F1)
#define Pin_ENC_F2 (PINC & ENC_F2)

enum { State0, StateA, StateB, StateAB }; //состояния энкодера

//----------------------------- Переменные: ----------------------------------

static char EncPrev;      //предыдущее состояние энкодера
static char EncPrevPrev;  //пред-предыдущее состояние энкодера

//----------------------- Инициализация энкодера: ----------------------------

void Encoder_Init(void)
{
  DDRC  &= ~(ENC_F1 | ENC_F2); //настройка портов на ввод
  PORTC |= ENC_F1 | ENC_F2;    //включение подтягивающих резисторов
  EncPrev = State0;       //инициализация предыдущего состояния
  EncPrevPrev = State0;   //инициализация пред-предыдущего состояния
}

//------------------------- Обработка энкодера: ------------------------------

void Encoder_Exe(void)
{
  char EncCur = 0;
  if(!Pin_ENC_F1) EncCur  = StateA; //опрос фазы 1 энкодера
  if(!Pin_ENC_F2) EncCur |= StateB; //опрос фазы 2 энкодера
  if(EncCur != EncPrev)             //если состояние изменилось,
  {
    if(EncPrev == StateAB &&        //если предыдущее состояние StateAB
       EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
    {
      if(EncCur == StateB)          //если текущее состояние StateB,
        To_Do_Step_Up();            //шаг вверх
      else                          //иначе
        To_Do_Step_Dn();            //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }
}

//----------------------------------------------------------------------------
Контактная информация:
Ответить

Вернуться в «Периферия»