Например TDA7294

Форум РадиоКот • Просмотр темы - Енкодер + антидребезг + микроконтролер = "работаю как хочу"
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 18, 2024 19:47:20

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 43 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Енкодер + антидребезг + микроконтролер = "работаю как хочу"
СообщениеДобавлено: Чт июл 26, 2012 19:29:08 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс фев 14, 2010 14:48:19
Сообщений: 66
Откуда: Львов
Рейтинг сообщения: 0
Прошу помощи или подскажите в какую сторону копать

Есть енкодер, подключенный к микроконтроллеру(atmega8) к ножкам PINB.2, PINB.1. схема подключения - стандартная

с1,с2 = 0,1 мкф, r1,r2 = 10 ком

Изображение

Но вот проблема в том, что иногда при бистром повороте в одном направление, "программа" может подсчитать 10 положительных импульсов и 3 отрицательных, хотя должно быть 13 положительных. И наоборот.

Вот такой программный код


Код:
#define DECODER_BUTTON_PLUS_IN  PINB.2
#define DECODER_BUTTON_MINUS_IN PINB.1

#define DEC_0 0
#define DEC_STEP 1
#define DEC_FIN 2

PrintLineText, PrintLineNumber - вивод текста на екраy типа wh1602

char ShowDialogInt(const char* sCaption, int* iRes, int iMin, int iMax)
{
    int i = 0, iStep = 0;
    char iCurDec = DEC_0;
   
    PrintLineText(0, sCaption);
    PrintLineNumber(1, *iRes);

    while(1)
    {                         
        if(0 == DECODER_BUTTON_PLUS_IN && 0 == DECODER_BUTTON_MINUS_IN)
        {     
            if(DEC_FIN == iCurDec)
            {
                (*iRes) = (*iRes) + (int)iStep;         
                if((*iRes) < iMin) (*iRes) = iMin;
                if((*iRes) > iMax) (*iRes) = iMax;
                PrintLineNumber(1, *iRes);
                iCurDec = DEC_0;   
            }
        }
        else if(1 == DECODER_BUTTON_PLUS_IN && 0 == DECODER_BUTTON_MINUS_IN)
        {                           
            if(DEC_0 == iCurDec)
            {           
                iCurDec = DEC_STEP;
                iStep = -1;
            }       
        }
        else if(0 == DECODER_BUTTON_PLUS_IN && 1 == DECODER_BUTTON_MINUS_IN)
        {         
            if(DEC_0 == iCurDec)
            {           
                iCurDec = DEC_STEP;
                iStep = 1;
            }       
        }
        else
        {
            if(DEC_STEP == iCurDec)
            {
                iCurDec = DEC_FIN;           
            }
       
        }                         
    }
}



есть подозрения что это дребезг контактов на енкодере, но как от него избавится?
Спасибо!


Последний раз редактировалось pierro Чт июл 26, 2012 19:50:35, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Чт июл 26, 2012 19:44:40 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
Картинка маленькая, ничего не видно.
Пробуйте избавляться программно, статей валом, ищите поиском.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Чт июл 26, 2012 19:54:38 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс фев 14, 2010 14:48:19
Сообщений: 66
Откуда: Львов
Рейтинг сообщения: 0
hybroid писал(а):
Картинка маленькая

за картинку - извините - исправил

Программным - это ставит задержки? (а-ля delay_ms(5))


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Чт июл 26, 2012 22:00:17 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
Хотя бы задержки. Алгоритм прост. Словили нажатие, подождали, проверили ещё раз, если осталось - значит окей. Сколько обычно длится дребезг контактов механических энкодеров подскажет ещё кто-то.. Ну или сами поищите, я не помню. Не сильно долго, 5мс это жирно, имхо.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 07:05:58 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Использовал года 2 назад код ув. Леонида Ивановича с обсуждения на сахаре, вроде этот: http://caxapa.ru/207402.html
все работало


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 09:04:38 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 65
Зарегистрирован: Пн янв 10, 2011 03:06:36
Сообщений: 736
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
oleg110592 писал(а):
Использовал года 2 назад код ув. Леонида Ивановича с обсуждения на сахаре, вроде этот: http://caxapa.ru/207402.html
все работало
Действительно работает? Я бегло просмотрел, показалось, что тут не все гладко:
Код:
//---------- Обработка энкодера: ----------

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,
        Msg = ENC_UP;               //шаг вверх
      else                          //иначе
        Msg = ENC_DN;               //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }
}

Насколько могу судить, при смене состояний AB -> B -> AB -> B ... диск фактически стоит на месте, а программа неуклонно шагает вверх. Поправьте меня, пожалуйста, если я ошибаюсь.

_________________
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 09:12:26 
Мучитель микросхем
Аватар пользователя

Карма: 8
Рейтинг сообщений: 28
Зарегистрирован: Вс авг 10, 2008 19:35:49
Сообщений: 411
Откуда: Евпатория
Рейтинг сообщения: 0
Здесь посмотрите


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 09:33:16 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 2
Рейтинг сообщений: 11
Зарегистрирован: Пт май 23, 2008 19:32:22
Сообщений: 2401
Откуда: Россия, Волгоград
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
pierro писал(а):
hybroid писал(а):
Картинка маленькая

за картинку - извините - исправил

Программным - это ставит задержки? (а-ля delay_ms(5))

5 мс мало, они звенят 60-120 мс

_________________
Чем дальше, тем больше становлюсь занудой...
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 09:38:43 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
По коду Леонида Ивановича тут еще обсуждалось: http://www.530.ru/wwwboards/mcontrol/21 ... 0755.shtml
Лень искать на внешнем винчестере проект, но устройство с энкодером работает без нареканий со стороны заказчика.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 09:45:22 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 65
Зарегистрирован: Пн янв 10, 2011 03:06:36
Сообщений: 736
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
s_black писал(а):
Здесь посмотрите
Спасибо, посмотрел. Этот вариант понравился гораздо больше - аккуратная автоматная реализация, явно не боящаяся дребезга и дрожания диска.

(Разве что я бы еще добавил флаг ошибки при запрещенных переходах, например, из state_0 в state_3: полезно знать о том, что лезут помехи или контроллер не угоняется за скоростью диска; но это уже детали).

Вопрос не в том, что в принципе невозможно корректно работать с энкодером (чай не бином Ньютона), а в корректности конкретной реализации, которая предложена как рабочая.

_________________
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 10:27:53 
Друг Кота
Аватар пользователя

Карма: 82
Рейтинг сообщений: 1027
Зарегистрирован: Сб апр 02, 2011 12:40:46
Сообщений: 4779
Откуда: Минск
Рейтинг сообщения: 0
Goldsmith писал(а):
Насколько могу судить, при смене состояний AB -> B -> AB -> B ... диск фактически стоит на месте, а программа неуклонно шагает вверх. Поправьте меня, пожалуйста, если я ошибаюсь.


Ничего подобного происходить не будет. Для этой ситуации есть проверка EncCur != EncPrevPrev. Наоборот, в этой реализации имеется механический гистерезис. Чтобы произошел инкремент или декремент, должны последовательно пройти 3 состояния энкодера. При дрожании ручки энкодера между двумя соседними состояниями никакого изменения редактируемой величины происходить не будет. Чем, кстати, страдают многие варианты функций обработки энкодера. К тому же, это позволяет отказаться от обычного подавления дребезга, основанного на повторном считывании состояния с задержкой. Такое подавление вызывает пропуски шагов при большой скорости вращения. Данную реализацию обработки сигналов энкодера тестировал на предмет соответствия тактильных ощущений и реакции на поворот энкодера. Ведь для момента переключения можно выбрать разные условия. Остановился именно на таком варианте. Теперь использую его во всех проектах, никаких нареканий нет. Вот полный текст модуля:

Код:
//----------

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

//Энкодер подключается к портам 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;               //сохранение предыдущего состояния
  }
}

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Пт июл 27, 2012 11:19:38 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 65
Зарегистрирован: Пн янв 10, 2011 03:06:36
Сообщений: 736
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
Леонид Иванович писал(а):
Ничего подобного происходить не будет. Для этой ситуации есть проверка EncCur != EncPrevPrev.
Точно, прошу прощения. Слишком быстро просматривал текст.

_________________
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Вс июл 29, 2012 13:03:29 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс фев 14, 2010 14:48:19
Сообщений: 66
Откуда: Львов
Рейтинг сообщения: 0
Спасибо всем. Исправил код - вроде работаєш хорошо. :beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Енкодер + антидребезг + микроконтролер = "работаю как х
СообщениеДобавлено: Вс июл 29, 2012 17:53:27 
Открыл глаза

Зарегистрирован: Пт апр 24, 2009 11:25:34
Сообщений: 71
Откуда: Rus
Рейтинг сообщения: 0
В STM32 есть аппаратная поддержка энкодера, по этому программно не пройдет защита от дребезга.
Проанализировав промсхемы сделал так:
В схеме топикстартера последовательно с выходами энкодера поставил резисторы номиналом 15-25% от подтягивающего.
Дребез полностью пропал.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Дребезг контактов и МК
СообщениеДобавлено: Ср янв 15, 2014 02:03:42 
Это не хвост, это антенна
Аватар пользователя

Карма: 7
Рейтинг сообщений: 72
Зарегистрирован: Вт окт 28, 2008 09:00:18
Сообщений: 1438
Откуда: Украина, Харьков
Рейтинг сообщения: 0
Ну и как-же, всё-таки, бороться с преславутым дребезгом? Делать задержки, ставить тригерные защёлки.... А каков на самом деле самый изящный метод, применимый и к микроконтроллерам?

_________________
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дребезг контактов
СообщениеДобавлено: Ср янв 15, 2014 07:38:45 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 390
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7010
Откуда: Ижевск
Рейтинг сообщения: 0
Тот же самый, что и при приеме бита по уарту. Три раза прочитали вход, за значение принимаем тот уровень, который встречается два или три раза.
Я делаю так:
Код:
// каждые 20..30 мсек
old_key= key;
key= PINX.Y;
if(old_key && !key) push= 1; // момент нажатия
if(!old_key && key) pop= 1; // момент отпускания
if(old_key && key) NotPressed= 1; // не нажата
if(!old_key && !key) Pressed= 1; // удерживается нажатой

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дребезг контактов
СообщениеДобавлено: Ср янв 15, 2014 08:05:44 
Говорящий с текстолитом
Аватар пользователя

Карма: 11
Рейтинг сообщений: 143
Зарегистрирован: Пт дек 28, 2012 21:56:46
Сообщений: 1518
Откуда: St. Petersburg
Рейтинг сообщения: 0
Задержки в самой программе - наиболее распространенный и универсальный вариант. Три раза ловить нажатие не нужно, достаточно одного. Суть в том, чтобы после первого сигнала о нажатии заблокировать кнопку на короткое время, чтобы пропустить дребезг. Может быть есть какие-нибудь библиотеки для организации задержки на разных кнопках, для тех же AVR. Думаю, правильная организация защиты от дребезга в программе и будет наиболее изящным решением. Но я таких правильных универсальных решений не знаю, всегда приходится делать по разному под конкретную программу.

_________________
Изображение only pure true norwegian blackx Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дребезг контактов
СообщениеДобавлено: Ср янв 15, 2014 08:11:57 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21804
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
pyzhman писал(а):
Я делаю так:

А кто будет ресетить флаги состояния?
else не хватает...
blackx писал(а):
Суть в том, чтобы после первого сигнала о нажатии заблокировать кнопку на короткое время

Это если кнопку.
А если произвольный механический контакт, энкодер, например?
Там ловля срабатывания по любому фронту чревата "странной" логикой работы...
Лучше все таки фильтровать фронт срабатывания буфером на 2...3 бита.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дребезг контактов
СообщениеДобавлено: Ср янв 15, 2014 08:35:41 
Друг Кота

Карма: 27
Рейтинг сообщений: 206
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Сообщений: 6015
Откуда: Москва
Рейтинг сообщения: 0
Таких тем был миллион, и это не считая тем по дребезгу энкодеров (а это отдельная история):

viewtopic.php?f=57&t=5931&start=1680
viewtopic.php?f=20&t=42986
viewtopic.php?f=20&t=50083
viewtopic.php?f=20&t=32&start=6800
viewtopic.php?f=20&t=79801
viewtopic.php?f=59&t=67578&start=820
viewtopic.php?f=20&t=5560&start=2820 (на эту ссылку браузер ругается)
...
и т.д., Гугл поможет.

Единого рецепта нет, есть разные способы, как программные, так и аппаратные.

К слову сказать, есть свежий цикл статей в журнале "Everyday Practical Electronics", называются "Mastering Rotary Encoders", 2013 год, номера 10-12. К сожалению, именно про удаление дребезга энкодера там нет ничего полезного, но просто по удалению дребезга интересно почитать, особенно про раритетные аппаратные способы. Язык - английский.


Последний раз редактировалось SmarTrunk Ср янв 15, 2014 08:50:43, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дребезг контактов
СообщениеДобавлено: Ср янв 15, 2014 08:41:06 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21804
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
SmarTrunk писал(а):
...не считая тем по дребезгу энкодеров (а это отдельная история)

Делать ее "отдельной историей" не очень удобно...
Учитывая общий тик для анализа всей "механики" устройства...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  1, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y