Обсуждаем контроллеры компании Atmel.
Ответить

Подавление дребезга контактов на инкрементном энкодере

Пт сен 28, 2018 14:05:07

Всем привет!

Тема конечно много раз мусолилась, но все таки хочется Ваши замечания...
Строю себе печь радиолюбителя на ATmega48PA. Из органов управления там только поворотный енкодер, который в общем-то все и управляет (установки, вкл/выкл и тп)

Долго гулял по форумам и смотрел разные решения программного подавления дребезга контактов. Пробовал всякие разные и все таки осенило сделал вот такое:

Вариант на прерывании по таймеру.

Код:
unsigned char _encoderTurned; // PORTD Encoder connected pins
unsigned char _encoderMask = 0b00000011; //Маска
unsigned char _encoderCurrentValue;
unsigned char _encoderTurned; //Флаг поворота енкодера

void TimerCounter0Init()
{
   TCCR0A = 0;
   TCCR0B = 0;
   
   TCCR0A |= (1<<WGM01);
   TCCR0B |= (1<<CS00);
   
   TCCR0B = (1<<CS02); //Div  256
   OCR0A = 30;
   TIMSK0 |= (1<<OCIE0A);
}

ISR(TIMER0_COMPA_vect)
{
   if((PIND&_encoderMask)==3) //Проверяем положение енкодера и очищаем флаг если он дощелкнулся
   {
      _encoderTurned=0;       
      return;   
   }
   
   if(_encoderTurned==0)ReadEncoder();
}

void ReadEncoder()
{
   _encoderCurrentValue = (PIND&_encoderMask); //Читаем два пина

   if(_encoderCurrentValue==1)Increment(); //Проверяем фазу А
   if(_encoderCurrentValue==2)Decrement();//Проверяем фазу В

//Кто быстрей сработал тот и прав
   
   _encoderTurned = 1; // Устанавливаем флаг поворота.
}


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

PS: Да простит меня модератор, если не там неписал..

Re: Подавление дребезга контактов на инкрементном энкодере

Пт сен 28, 2018 16:20:40

Dream555 писал(а):Коллеги, я проверил это уже на собранной плате и работает вроде как очень даже хорошо.
Значит энкодер новый. Потому, как с поношенным энкодером бывают всякие чудеса. Это недавно обсуждалось, отсюда и дальше. Сначала в конференции, потом мы с коллегой sunjob ушли в личку, то, что у меня получилось в итоге, sunjob выложил в последней мессаге. По-хорошему, там надо еще подобрать коэффициенты, и будет все ОК. Правда, sunjob так и не сознался, какой масштаб по оси времени на его осциллограммах, поэтому я не довел дело до конца. Да, проект там под Мегу 328PA, так, что на 48-ю он скомпилируется без вопросов.

Re: Подавление дребезга контактов на инкрементном энкодере

Пт сен 28, 2018 20:45:05

Значит энкодер новый. Потому, как с поношенным энкодером бывают всякие чудеса.


У меня и с новым енкодером тоже были чудеса. Вроде берешь не один рабочий пример и даже почти работает. Но все равно проскакивает... Крутишь в оду сторону, а показывает то так то этак.
Мой таймер настроен на 1 микросекунду. Да и кода там почти ноль, так что спасло. По правде говоря мой бесконечный цикл настолько нагружен, что через него не получилось нормально обработать енкодер. Но прерывания спасли..

Re: Подавление дребезга контактов на инкрементном энкодере

Пт ноя 22, 2019 20:20:02

так и не сознался, какой масштаб по оси времени на его осциллограммах

там есть метка с длительностью :)

Re: Подавление дребезга контактов на инкрементном энкодере

Вс фев 23, 2020 02:19:13

Я делал где-то на 400 Гц опрос энкодера на прерываниях, вроде полёт нормальный, сбоев не наблюдал
Угол поворота энкодера повторял угол поворота вала на Шаговом Двигателе (примерно)

Re: Подавление дребезга контактов на инкрементном энкодере

Вс фев 23, 2020 10:03:17

Мой таймер настроен на 1 микросекунду.

В сам деле? О""""ть ! И МК успевает ещё что-то сделать кроме прерывания?
Думаю, описка. Миллисекунда. Да ?
Ответить