Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Rotary encoder
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=8142
Страница 1 от 2

Автор:  npelov [ Съб Сеп 25, 2010 9:34 pm ]
Заглавие:  Rotary encoder

Взех си един ED1112S да го пробвам и евентуално да ми върши работа когато трябва да променям някаква стойност в пика и с копчета е прекалено бавно.
Проблемът на това нещо е че от триенето излиза много шум.
Свръзал съм го по схемата в даташита (стори ми се логична пък и ми е удобна). Когато е неподвижен няма контакт и резисторите "дърпат" към 5V.Когато се превърти с едно щракане (1/20 оборот) се появяват 2 импулса изместени фазово един от друг. Вързал съм единия пин на RB2/INT2 и другия на RB5. Алгоритъма ми е прост - при прекъсване INT2 проверявам ако RB5 e 0 - увеличавам, ако е 1 - намалявам (или обратното - не помня).
Сложих му кондензатори 100 нФ паралелно на резисторите за да запазя задния фронт стръмен, понеже прекъсването ми е сетнато да цъка по задния фронт.

Поблемът почти се изчисти, но все още има прескачания - едно щракане за 2-3 прекъсвания. Може да намаля повдигащите резистори на 1к за да се разреждат по-бързо кондензаторите ... като 1к е минимума защото контактите държат на не повече от 5 мА. Може би 1.5 или 2к. но ще харчи повечко ток и не съм сигурен че ще помогне много
Другия начин е да му заделя един таймер и да правя проверки за времето или да му заделя CCP модул да го измерва при прекъсване. Обаче условията за "шум" и прескачания (noise, chattering) са прекалено сложни (на пръв поглед)


идеи?

Прикачени файлове:
Коментар на файл: "надолу" или по обратно на часовниковата стрелка
DOWN.png
DOWN.png [ 3.8 KiB | Прегледано 6882 пъти ]
Коментар на файл: "нагоре" или по часовниковата стрелка
UP.png
UP.png [ 4.75 KiB | Прегледано 6882 пъти ]

Автор:  Zeus [ Съб Сеп 25, 2010 10:04 pm ]
Заглавие: 

Аз се боря с шумовете софтуерно, като след първия if за настъпило събитие, слагам един delay от 50ms(обикновено за натискане на бутони) и правя втора проверка за условието и чак тогава сработва блока за последствието. Опитай с различни времена за delay, докато ти хареса.

Автор:  npelov [ Съб Сеп 25, 2010 11:33 pm ]
Заглавие: 

по принцип да, но когато е с прекъсване не можеш да чакаш. Трябва да излезеш колкото се може по-бързо. По всичко изглежда че ще трябва да ползвам таймер. Просто исках да попитам дали някой няма някакъв прост и ефективен метод

Автор:  Zeus [ Нед Сеп 26, 2010 2:33 pm ]
Заглавие: 

npelov написа:
по принцип да, но когато е с прекъсване не можеш да чакаш. Трябва да излезеш колкото се може по-бързо. По всичко изглежда че ще трябва да ползвам таймер. Просто исках да попитам дали някой няма някакъв прост и ефективен метод


Ами може да пробваш и в прекъсването. Просто проверявай между две последователни прекъсвания, дали сигнала е наличен. Изполвай една битова променлива, като я сетваш по време на проверката при наличие на сигнал. При следващото ако още държи фронта, я нулираш и правиш там каквото трябва. Също така си я нулираш в else на проверката.

Автор:  npelov [ Нед Сеп 26, 2010 3:07 pm ]
Заглавие: 

Нещо не разбрах.

Автор:  RM [ Нед Сеп 26, 2010 3:33 pm ]
Заглавие: 

Код:
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
TCNT2=0xF5;
// Place your code here
if(alarm2){
        conter4++;
        if(PIND.3){
        conter3++;
        else conter3=0;
        if((conter4==conter3)&&(conter3>=200)){
        port2=1;
        alarm2=0;
        };
        }
}

За по сигурно :D

Автор:  npelov [ Нед Сеп 26, 2010 4:04 pm ]
Заглавие: 

а някой чувал ли е за такива с оптрони? ... и да не са много скъпи

Автор:  Cekins [ Нед Сеп 26, 2010 6:53 pm ]
Заглавие: 

Е па шумят, ама при мен няма чак такива проблеми. Нещо бъркаш някъде. Аз като им сложа 100нФ и спират да шумят. Резисторите 4,7 к.

Автор:  npelov [ Пон Сеп 27, 2010 12:13 am ]
Заглавие: 

при 9 от 10 оборота всичко е наред. Най много да избягат с 1 ... "щрак" т.е. вместо 20 на оборот изкарва 21. Обаче на 1 от 10 прескача с 4-5. Рядко се случва, но е дразнещо. Ще намаля на 4.7к да видя дали ще се случва.

Автор:  Zeus [ Пон Сеп 27, 2010 10:02 pm ]
Заглавие: 

npelov написа:
Нещо не разбрах.


ето това сглобих на CCS по памет, понеже май от 1 година не съм писал( кво да се прави: няма време). Дано не греша някъде.

int1 flag=FALSE;
int1 signal; // твоето условие
......
#int_TIMER0
void interup1() {
disable_interrupts(INT_TIMER0);
if(signal) {
if(flag) {
.......
//твоят код за изпълнение на условието
........
flag=FALSE;
}
else
flag=TRUE;
}
else
flag=FALSE;
enable_interrupts(INT_TIMER0);
};

Обаче има и проблем, когато фронта на сигнала е доста по-дълъг от времето за прекъсване. Тогава ще трябва да следиш и по време на фронта условието да се задейства само веднъж.

Автор:  Cekins [ Пон Сеп 27, 2010 10:40 pm ]
Заглавие: 

Ема той проблема му е в разцъкване на контактите. Ама пък аз със същите енкодери доста различни неща съм правил и не съм имал чак такива проблеми. На 20 цъкания едно да има дабъл. Ама такива 4-5 не съм засичал.

Автор:  Zeus [ Пон Сеп 27, 2010 11:03 pm ]
Заглавие: 

Пробвай това свързване. Може да си поиграеш със стойността на 100к. Доста ми е помагало при механични контакти.

Прикачени файлове:
scheme.JPG
scheme.JPG [ 4.88 KiB | Прегледано 6541 пъти ]

Автор:  Nikola Kirov [ Вто Сеп 28, 2010 1:18 am ]
Заглавие: 

Прави се с цифрова филтрация.
Ето една моя библиотека за това. Позволява работа с повече от един енкодер и затова е малко усложнена.
Малко пояснения.

Първо се създава структура за съотвениия енкодер от тип encoder_t

после се дефинират две функции void funct_up(void) void funct_down(void) които ще се извикват при всеки импулс на енкодера.

Някъде в началото на програмата преди първото използване на encoder_serve() трябва да се инициализира с

void encoder_init(encoder_t *enc,void (*funct_up)(void),void (*funct_down)(void));

и през небходимия интервал се извиква

void encoder_serve(ut fis_state,encoder_t *enc);

битове 0 и 1 на fis_state са физическото състояние на линиите на енкодера.

Прикачени файлове:
IncrementalEncoder.rar [1.42 KiB]
414 пъти

Автор:  michev [ Вто Сеп 28, 2010 5:27 pm ]
Заглавие: 

С този енкодер и код взет от тук не съм забелязал и 1 "изпускане" да има. Също тук има, почти по същия начин реализирано.

Автор:  npelov [ Сря Сеп 29, 2010 3:43 pm ]
Заглавие: 

Значи все пак няма да се оттърва от таблицата с 16-те състояния. А аз си мислех че съм минал метър с една единствена проверка.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/