Используем Энкодер

ascon
ascon аватар
Offline
Зарегистрирован: 14.08.2013

Vittorio пишет:
Если медленно вращать, стабильно отрабатывает или проскакивает?

если быстро вращать проскакивает. А если медленно,то  все хорошо )))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Мой вариант обработчика энкодера. Очень простой и совершенно безглючен. Обработчик сидит в теле внешнего прерывания PCINT.   В нижеследующем скетче задействованы входы A0 и A1 как цифровые. Используется подтяжка к питанию (распаянная на платке стандартного энкодера),  и антидребезговые конденсаторы 0,1мкф на землю. Кому нужно на другие ноги - смотреть даташит страница 73 и маскировку битов сделать по аналогии.

volatile int enc;
void setup() {                
Serial.begin(9600);
PCICR=1<<PCIE1; //разрешить пренрывание
PCMSK1=(1<<PCINT9)|(1<<PCINT8); //выбрать входы
}

ISR (PCINT1_vect){
static byte old_n=PINC&3; // маска B00000011 что б читать только нужные 2 бита
byte new_n=PINC&3;
if (old_n==1&&new_n==3||old_n==2&&new_n==0) {enc++;}
if (old_n==2&&new_n==3||old_n==1&&new_n==0) {enc--;}
old_n= new_n;
}

void loop() {
Serial.println(enc); 
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Нет слов.....   0.1 мкФ я думаю многовато будет, 10 нан  вроде достаточно

0.1 на 20 кил нашей привязки тау будет 2 миллисекунды, 500 Герц и меньше.... вроде не страшно,
но разряжать контактами энкодера ( закорачивать кондёр на землю) 0.1 или 0.01 - лучше поменьше для срока службы контактов. По идее должно  и с 1000 пиками работать
http://www.digikey.com/en/resources/conversion-calculators/conversion-calculator-time-constant

Жалко что 10 плюсов нельзя поставить.
 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а вот это: if (old_n==1&&new_n==3||old_n==2&&new_n==0) в каком порядке обрабатывается?

Может лучше так: if ( (old_n==1&&new_n==3) || (old_n==2&&new_n==0) )?

Для Меги как этот обработчик подправить?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tomasina, у операций && приоритет выше, чем у ||, поэтому можно без доп. скобок.

Для  меги лучше поменять порты,  вход A8, A9
PCICR=1<<PCIE2;
PCMSK2=(1<<PCINT16)|(1<<PCINT17);
Порт и маска соответсвенно: PINK&3  И  в ISR исправить на PCINT2
 

Logik
Offline
Зарегистрирован: 05.08.2014

Получил с Китая это чудо, такое - http://www.doneathome.ru/wp-content/uploads/2013/11/Encoder5.jpg.

Библиотеки, что нашел не очень, взялся сам писать, получилось очень даже прикольно. Исходные мысли:

1. Подключаем к "малоценным" пинам.

2. Работаем через прерывания.

3. Защита от дребезга логическая, не по времени. Чтоб исключить проблемы при быстром вращении.

4. Учитываем скорость вращения, ускоряем изменение величины при быстром вращении.

5. Внешних элементов не использовать.

6. Кнопку игнорируем.

Получилось дето так:

Encoder.h

#ifndef Encoder_Int_h
#define Encoder_Int_h

/* Енкодер через прерывания   */

#define ENCODER_ACCELERATION

#include <Arduino.h>


#ifndef cbi
#define cbi(sfr, bit) (sfr &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif 

#define ENCODER_MAX_VALUE 10000

#ifndef ENCODER_INPUT_PORT
#define ENCODER_INPUT_PORT     PINB
#define ENCODER_INPUT_PIN1      3
#define ENCODER_INPUT_PIN2      4
#endif


class ENCODER
{
    //управляем прерываниями по изменению состояния от группы ног
#define ENCODER_INTERRUPT_ENABLE        cbi(EICRA, ISC01);sbi(EICRA, ISC00);sbi(PCICR, PCIE0);    /* разрешаем прерывания PCINT3 */  

#define ENCODER_INTERRUPT_DISABLE      cbi(PCICR, PCIE0);     // запрещаем прерывания PCINT0..7   

//разрешим прерватся прм изменении ENCODER_INPUT_PIN1
#define ENCODER_INTERRUPT_PIN1           cbi(PCMSK0, ENCODER_INPUT_PIN2);sbi(PCMSK0, ENCODER_INPUT_PIN1);

//разрешим прерватся прм изменении ENCODER_INPUT_PIN2
#define ENCODER_INTERRUPT_PIN2           cbi(PCMSK0, ENCODER_INPUT_PIN1);sbi(PCMSK0, ENCODER_INPUT_PIN2);

public:
    ENCODER(word Val);
    void Run();
	void Done(void);
    word Get(void);
    void Interrupt(void);
private:
    word m_Val;
    byte Flags;
#ifdef ENCODER_ACCELERATION
    word Time;
#endif /* ENCODER_ACCELERATION */
};

#endif /*  Encoder_Int_h  */

Encoder.cpp


/* Енкодер через прерывания   */

#include "Encoder.h " 
#include <PINs.h>

ENCODER::ENCODER(word Val)
{
      m_Val=Val;
}

void ENCODER::Run()
{
    Flags=0;
    ENCODER_INTERRUPT_PIN1
    ENCODER_INTERRUPT_ENABLE
}


void ENCODER::Interrupt()
{
  byte tmp=ENCODER_INPUT_PORT;  //текущее состояние порта
  signed char d=-1;
  word t;

  if (bit_is_set(PCMSK0, ENCODER_INPUT_PIN2)) //разрешено было прерватся по ENCODER_INPUT_PIN2
  {
      ENCODER_INTERRUPT_PIN1
      
      //уровень пина, прерывание которого будем ожидать
      tmp=tmp & _BV(ENCODER_INPUT_PIN1)?1:0;

  }
  else
  {
      ENCODER_INTERRUPT_PIN2

      //уровень пина, прерывание которого будем ожидать
      tmp=tmp & _BV(ENCODER_INPUT_PIN2)?1:0;

      Flags^=1;
  }

  d=1;

#ifdef ENCODER_ACCELERATION

  /* Ускорение при быстром вращении*/
  if ((millis()&0xffff)-Time<10) //"быстрый" такт 
  {
      if (bit_is_set(Flags,6)) //дотикал счетчик количества "быстрых" тактов
          d=100;
      else
          Flags+=2;    //счетчик количества "быстрых" тактов
  }
  else
      Flags&=1; //очистка счетчика количества "быстрых" тактов

  Time=millis();
#endif /* ENCODER_ACCELERATION */

  /* направление вращения */
  if ((Flags&1)!=tmp)
      d=-d;

  /* Проверка выхода из диапазона */
  if(d>0)
  {
      if(ENCODER_MAX_VALUE-m_Val<d)
      {
          d=ENCODER_MAX_VALUE-m_Val;
      }
  }
  else
  {
      if(m_Val<-d)
      {
          d=-m_Val;
      }
  }


  m_Val+=d;
  
  cbi(Flags,0);
  Flags|=tmp;
}

void ENCODER::Done()
{
   ENCODER_INTERRUPT_DISABLE
}

word ENCODER::Get(void)
{
    volatile word t;
    cbi(PCICR, PCIE0);
    t=m_Val;
    sbi(PCICR, PCIE0);
    return t;
}

Выводы енкодера на пины 11 и 12. Можно и на другие пины порта B

В скетче обявляем

ENCODER enc(0);

ISR(PCINT0_vect)
{
    enc.Interrupt();
}

 

В сетапе -

   pinMode(11, INPUT);
  pinMode(12, INPUT);
   
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);

 enc.Run();

  после этого можно получать значения enc.Get();

При медленном вращении на один шаг добавляется около 4 единиц, при быстром - много. Диапазон регулируемой величины enc.Get() 0-10000. Немного смахлевал на определении длительности такта - if ((millis()&0xffff)-Time<10), но вроде пашет, жизнь покажет как. Может потом поправлю.

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

кнопу не надо игнорировать, с ней гораздо удобнее.

Разве не получится для нее использовать то же самое прерывание?

Logik
Offline
Зарегистрирован: 05.08.2014

Получится конечно. Но филосовский вопрос появляется - А зачем? Прерывания используются для быстрой реакции на аппаратное событие. Кнопка - штука медленная по сравнению с тем же енкодером, не требующая быстрой реакции. Если луп достаточно быстрый, сотня другая милисекунд, без delay и прочей нечести, то проверять кнопку и реагировать на нажатия адекватней именно в нем. К тому же обработка нажатия кнопки (вывод на экран или канал, например) достаточно громоздкое дело, как для прерывания, будет тормозить реакцию на тот же енкодер. Хотя многое зависит от конкретного проекта.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Энкодеровской кнопкой можно добавить удобство в скролле. Вот например вариант моего обработчика, вращение не нажимая кнопки инкременирует/декременирует по единице. А если вращать с нажатой кнопкой -то прибавляются/убавляются сразу по 100. Очень удобно подстраивать всякие множители, делители, итд. Кнопка на А2, энкодер на А0, А1. Конденсаторы на землю нужны.

volatile int enc;
void setup() {                
Serial.begin(9600);
PCICR=1<<PCIE1; //разрешить пренрывание
PCMSK1=(1<<PCINT9)|(1<<PCINT8); //выбрать входы
pinMode(A2,INPUT_PULLUP);
}

ISR (PCINT1_vect){
static byte old_n=PINC&3; // маска B00000011 что б читать только нужные 2 бита
byte new_n=PINC&3;
if (old_n==1&&new_n==3||old_n==2&&new_n==0) {PINC&4? enc++ : enc+=100 ;}
if (old_n==2&&new_n==3||old_n==1&&new_n==0) {PINC&4? enc-- : enc-=100 ;}
old_n= new_n;
}

void loop() {
Serial.println(enc);

}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Можна конечно и так кнопку применить, но интересней другой вариант применения. В меню: без нажатия - навигация по пунктам меню; нажатие - вход в подменю или выбор конечной редактируемой величины; вращение при нажатой - навигация между уровнями меню от корня до последней выбираемой конечной величины или места где находились в меню в момент. После выбора конечной величины: вращение - изменение величины; нажатие(точней отпускание) - подтверждение ввода; вращение при нажатии - перебор вариантов ввод, отмены изменения и нескольких предустановок. Так на одном энкодере делается удобное управление многоуровневым меню. Но все зависит от задачи.

Изначально вопрос о том, почему не рассматриваю кнопку в библиотеке - ускорение сделано и без неё, а остальное - вне библиотечный функционал.

Hleb13
Offline
Зарегистрирован: 16.04.2015

Помогите, пожалуйста, с энкодером.

Есть три светодиода. Надо, чтобы работало так: кручу энкодер по часовой - предыдущий светодиод гаснет, следующий загорается (по часовой стрелке), в обратную сторону кручу - светодиоды выключаются и включаются в другую сторону (противчасовой).

В данный момент энкодер подключен через триггер Шмитта и резисторами контакты подтянуты к +5V.

Вот скетч

unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;       // pin 12
const int pin_B = 11;       // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
int a = 8;
 
void setup()  {
Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime; 
  digitalWrite(a, HIGH);

digitalWrite(pin_A, HIGH);

digitalWrite(pin_B, HIGH);

} 
 
void loop()  {
  currentTime = millis();
  if(currentTime > (loopTime + 2)){ // проверяем каждые 3мс
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
      if(encoder_B) {
        // выход В в полож. сост., значит вращение по часовой стрелке
     Serial.print("A="); Serial.println(encoder_A); Serial.print("B="); Serial.println(encoder_B); 
 if (a == 10) {digitalWrite(a, LOW), a = 8, digitalWrite(a, HIGH); }
     else
        {
         digitalWrite(a, LOW);
         a++;    
         digitalWrite(a, HIGH);
        }
    
        }   
      else {
        // выход В в 0 сост., значит вращение против часовой стрелки     
   Serial.print("A1="); Serial.println(encoder_A); Serial.print("B1="); Serial.println(encoder_B);   
 if (a == 8) {digitalWrite(a, LOW), a = 10, digitalWrite(a, HIGH);} 
      else
        {
        digitalWrite(a, LOW);
        a--;
        digitalWrite(a, HIGH);
 
          } 
      }  
   }

    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла     
   
    loopTime = currentTime;
  } 
  
}

Скетч работает, все переключается. Но периодически, особенно если крутить энкодер быстро, включается не следующая лампочка, как должна, а происходит включение предыдущей (на одну лампочку обратно). Если посмотреть монитор последовательного порта и крутить по часовой энкодер, будем видеть A=0, B=1, но стоит крутнуть по-сильнее, как вылезает A1=0, B1=0, в этот момент как раз светодиод переключается в обратном положении.

Не могу никак понять откуда это вылезает?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Hleb13, так и должно быть, вы же с дребезгом никак не боритесь, ни программно, ни аппаратно.

Hleb13
Offline
Зарегистрирован: 16.04.2015

dimax, а разве триггер Шмитта не является аппаратным средством против дребезга?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Hleb13, является, но для кнопки. Для энкодера он плохо подходит,  т.к. затягивает сигнал, при определённой скорости вращения энкодера триггер ещё не отпустит старое состояние, когда уже может подойти новое. Вы тему читали? Достаточно пары ёмкостей на землю для аппаратного решения.

Hleb13
Offline
Зарегистрирован: 16.04.2015

dimax, спасибо! Тему читал, но, к сожалению, пока не все понимаю, только начинаю осваивать! То есть, как я понял, нужно два конденсатора от пина A и B энкодера, соединяющиеся с землей? У меня есть конденсаторы 10мкФ, такие подойдут? Подтягивающие резисторы до 5V при этом нужно убрать?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Hleb13
Offline
Зарегистрирован: 16.04.2015

Tomasina, спасибо большое! Буду разбираться...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Не могу никак понять откуда это вылезает?
не смотрел код... ещё есть персистенция, даже при правильном коде при трёх светиках можно поймать эффект 25 Hz
....как вращение колёс ( гусениц ) назад в кино

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Tomasina пишет:

хочу обратить внимание народ на вышеприведённую схему - я не спорю, что оно будет работать, но скажите кто-нибудь, что делают в схеме резисторы выделенные ниже 10К?

*не, ну просто интересно в качестве повышения квалификации.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

чуть-чуть снижают ток пина ( их можно не применять )

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

SU-27-16 пишет:

чуть-чуть снижают ток пина ( их можно не применять )

какой нахрен токпина? - пины сконфигурированы как входы.

*вопрос остаётся в силе.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

втекающий при 1 и вытекающий при 0 ток входного каскада пина в режиме input float :)

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

SU-27-16 пишет:

втекающий при 1 и вытекающий при 0 ток входного каскада пина в режиме input float :)

ясно, спасибо - больше не отвечайте на мой вопрос.

*у кого есть оригинальные ответы по сабжу - спасибо.

Kolchugin
Offline
Зарегистрирован: 15.12.2013

Это обратный RC - фильтр низких частот.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Kolchugin пишет:

Это обратный RC - фильтр низких частот.

ок. откуда у нас берётся низкочастотный сигнал в цепях энкодера? ...кроме сигнала пререключений генерируемого самим энкодером, конечно.

кто подкован теоретически - рассчитайте частоту, которую фильтрует данный фильтр, пожалуйста.

 

Kolchugin
Offline
Зарегистрирован: 15.12.2013

Частота среза 1,5 Кгц.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

знака вопроса = нет ! :)
Это обратный RC - фильтр низких частот.
t=kRC
...применяется для принудительного поворота энкодера внешним сигналом , на канал А сигнал - крутится влево , на канал B сигнал - крутится вправо
:)

...опробовал только режим - нет сигналов на каналах - вал энка стоит на месте !
т.е. - всё правильно , работает схема !

 

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Клапауций 999 пишет:

ок. откуда у нас берётся низкочастотный сигнал в цепях энкодера? ...кроме сигнала пререключений генерируемого самим энкодером, конечно.

кто подкован теоретически - рассчитайте частоту, которую фильтрует данный фильтр, пожалуйста.

сам спросил - сам ответил: нифига это не RC - фильтр низких частот.

т.к. меня интересует резистор после конденсатора, который в схеме фильтра отсутсвует.

*гадаем на хрустальном шаре дальше - т.к. схему используют уважаемые производители дуино.

Kolchugin
Offline
Зарегистрирован: 15.12.2013

Хорошо. Встречается ещё вот такое подключение где конденсатор после резистора.

maksim
Offline
Зарегистрирован: 12.02.2012

Клапауций 999 пишет:

*гадаем на хрустальном шаре дальше - т.к. схему используют уважаемые производители дуино.

Да все просто - это защита от дурака, предохранительные резисторы. Ведь можно выводы, к которым подключатся энкодер настроить и на выход.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Kolchugin пишет:

Хорошо. Встречается ещё вот такое подключение где конденсатор после резистора.

ок.

вывод1: прошлая схема является изначально бессмысленной в применении резистора 10К.

если не получу ответа, зачем нам требуется фильтрация сигнала выше 1,5 Кгц, то и эту признаю бессмысленной.

*заранее благодарю за аргументированные ответы по сабжу.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

maksim пишет:

Да все просто - это защита от дурака, предохранительные резисторы. Ведь можно выводы, к которым подключатся энкодер настроить и на выход.

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

кнопкой тоже можно выход закоротить.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

и на Vin можно ~220  подать.... 

maksim
Offline
Зарегистрирован: 12.02.2012

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

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

maksim пишет:

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

ну, да... а, ещё механика контактов энкодера может выйти из строя и замкнуть все три пина энкодера.

*ну, не знаю - может быть.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Резистор 10к является фильтром импульсных помех. В двух словах не объяснить, но если интересно, почитайте статью Алексея Кузнецова - там все подробно. Для "домашних применений" резистор можно не ставить ;)

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

AlexFisher пишет:

Резистор 10к является фильтром импульсных помех. В двух словах не объяснить, но если интересно, почитайте статью Алексея Кузнецова - там все подробно. Для "домашних применений" резистор можно не ставить ;)

ок. принимается проходной резистор, как фильтр обладающий одновременно и сопротивлением, и ёмкостью.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

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

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

AlexFisher пишет:

Емкость резистора непричем. Резистор расчитывают так, 

ок. я предполагаю, а вы располагаете - согласно каким рассчётам в вышеприведённых схемах влупили резисторов куда-попало, но строго по 10К? не 7,5, не 4,2, а 10-ть?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Трудно сказать, почему автор поставил 10к. Значение емкости входа я не нашел, но полагаю, она где-то 10-20 пф, тогда 10к дадут частоту среза примерно 10 МГц. Я ставлю в свои схемы резисторы 510 - 1к (по возможности ближе к процессору). Но это все важно при проэктировании схемы на "голом" процессоре. На плате адуины этим резистором можно смело принебречь.

Р.S. я, когда не знаю, какой номинал воткнуть, тоже беру из линейки 1к, 10к, 100к, 1М :)

Hleb13
Offline
Зарегистрирован: 16.04.2015

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

Схема с тригером Шмитта и подтягивающим резистором до 5V мне показалась стабильнее.

neospromiy
Offline
Зарегистрирован: 15.07.2013

У меня так всё зарабатоло 

int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0;
volatile int encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {
  Serial.begin (9600);
  pinMode(encoderPin1, INPUT); 
  pinMode(encoderPin2, INPUT);
  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);
  lcd.init(); 
  lcd.backlight();
}

void loop(){ 

  Serial.println(encoderValue/2);
  delay(10);
}


void updateEncoder(){
  int MSB = digitalRead(encoderPin1);
  int LSB = digitalRead(encoderPin2);

  int encoded = (MSB << 1) |LSB;
  int sum  = (lastEncoded << 2) | encoded;

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) 
  {
    
    encoderValue ++;
    
    }
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
  {
    
    encoderValue --;
    
    }

  lastEncoded = encoded;
}

 

Hleb13
Offline
Зарегистрирован: 16.04.2015

А какая у Вас схема подключения энкодера?

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Hleb13 пишет:

А какая у Вас схема подключения энкодера?

при правильном коде достаточно одних конденсаторов - рекомендую специализированную библиотеку.

http://www.pjrc.com/teensy/td_libs_Encoder.html

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 999 пишет:

при правильном коде достаточно одних конденсаторов

При правильном коде и конденсаторы не нужны.  Использование конденсаторов без резисторов ускорит окисление контактов енкодера, а они там и так не очень. Это только усилит дребезг в процессе эксплуатации.

И вобще применение ФНЧ - прямая дорога к пропускам при быстром вращении.

neospromiy
Offline
Зарегистрирован: 15.07.2013

У меня все четко пока работает при любой скорости вращения.
Подключение: ножки энокодера А В подтянуты к 5в резистором на 10ком. Между землей и ножками А В по керамическому кондеру на 0.047мкф

Logik
Offline
Зарегистрирован: 05.08.2014

Ключевое слово - пока. У вас постоянная времени фильтра 0,5мс и разряд конденсатора на контакты из-за чего они быстрей окислятся, и дребезг усилится, пропадани контакта станет больше постоянной времени фильтра (грубо говоря) и начнет глючить.  После этого Вы станете ярым поклонником оптических энкодеров.

А чего сделана внешная подтяжка, а не внутренними резисторами?

 

neospromiy
Offline
Зарегистрирован: 15.07.2013

Пока собираю все на макетке, купил на али для бредборда, энкодер уже собранный на маленькой плате там он подтянут с завода резисторами на10к

Вопрос, есть какая нибудь статистика как долго живет энкодер если оставить кондеры?

Если так подумать то контакты энкодера всегда подтянуты к +5в так какая разница если оставить кондер, ведь они всегда или + или gnd.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

0.047 мкФ многовато... Достаточно 0.01 мкФ или даже 1000 пФ. А внутренние резисторы подтяжки великоваты.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

С кондёром дела такие: 
Заряжаем мы его через резистор допустим 10 килоом.
А вот разряжаем закорачивая на землю контактами энкодэра. Через "0" Ом.
Ну а по второму закону коммутации ток равен бесконечности что не есть хорошо для контактов.
Поэтому сильно завышать емкость конденсатора не стоит.
Ну и на разрядку каких-то  символических 100 Ом можно поставить.
Хотя на 1000 пик будет работать и так.
По поводу великоватости внутренних резисторов: ставьте меньше кондёр.