Страница 1 из 1

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

Добавлено: Пт сен 28, 2018 14:05:07
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: Да простит меня модератор, если не там неписал..

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

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

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

Добавлено: Пт сен 28, 2018 20:45:05
Dream555
Значит энкодер новый. Потому, как с поношенным энкодером бывают всякие чудеса.


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

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

Добавлено: Пт ноя 22, 2019 20:20:02
sunjob
так и не сознался, какой масштаб по оси времени на его осциллограммах
там есть метка с длительностью :)

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

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

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

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