Подавление дребезга контактов на инкрементном энкодере
Добавлено: Пт сен 28, 2018 14:05:07
Всем привет!
Тема конечно много раз мусолилась, но все таки хочется Ваши замечания...
Строю себе печь радиолюбителя на ATmega48PA. Из органов управления там только поворотный енкодер, который в общем-то все и управляет (установки, вкл/выкл и тп)
Долго гулял по форумам и смотрел разные решения программного подавления дребезга контактов. Пробовал всякие разные и все таки осенило сделал вот такое:
Вариант на прерывании по таймеру.
Коллеги, я проверил это уже на собранной плате и работает вроде как очень даже хорошо.
Хочется услышать Ваше мнения и замечания..
PS: Да простит меня модератор, если не там неписал..
Тема конечно много раз мусолилась, но все таки хочется Ваши замечания...
Строю себе печь радиолюбителя на 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: Да простит меня модератор, если не там неписал..