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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 99
Зарегистрирован: Сб апр 28, 2018 20:29:42

Сообщение Dream555 »

Всем привет!

Тема конечно много раз мусолилась, но все таки хочется Ваши замечания...
Строю себе печь радиолюбителя на 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: Да простит меня модератор, если не там неписал..
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

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

Сообщение Dream555 »

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


У меня и с новым енкодером тоже были чудеса. Вроде берешь не один рабочий пример и даже почти работает. Но все равно проскакивает... Крутишь в оду сторону, а показывает то так то этак.
Мой таймер настроен на 1 микросекунду. Да и кода там почти ноль, так что спасло. По правде говоря мой бесконечный цикл настолько нагружен, что через него не получилось нормально обработать енкодер. Но прерывания спасли..
Вымогатель припоя
Аватара пользователя
Сообщения: 620
Зарегистрирован: Ср дек 08, 2010 19:03:17

Сообщение sunjob »

так и не сознался, какой масштаб по оси времени на его осциллограммах
там есть метка с длительностью :)
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 110
Зарегистрирован: Чт янв 14, 2016 14:42:05
Откуда: City

Сообщение CATяра »

Я делал где-то на 400 Гц опрос энкодера на прерываниях, вроде полёт нормальный, сбоев не наблюдал
Угол поворота энкодера повторял угол поворота вала на Шаговом Двигателе (примерно)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6322
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

[uquote="Dream555",url="/forum/viewtopic.php?p=3467642#p3467642"]Мой таймер настроен на 1 микросекунду.[/uquote]
В сам деле? О""""ть ! И МК успевает ещё что-то сделать кроме прерывания?
Думаю, описка. Миллисекунда. Да ?
Изображение
Реклама
Ответить

Вернуться в «AVR»