| Микроконтролери и електроника 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) са прекалено сложни (на пръв поглед) идеи?
|
||||
| Автор: | Zeus [ Съб Сеп 25, 2010 10:04 pm ] |
| Заглавие: | |
Аз се боря с шумовете софтуерно, като след първия if за настъпило събитие, слагам един delay от 50ms(обикновено за натискане на бутони) и правя втора проверка за условието и чак тогава сработва блока за последствието. Опитай с различни времена за delay, докато ти хареса. |
|
| Автор: | npelov [ Съб Сеп 25, 2010 11:33 pm ] |
| Заглавие: | |
по принцип да, но когато е с прекъсване не можеш да чакаш. Трябва да излезеш колкото се може по-бързо. По всичко изглежда че ще трябва да ползвам таймер. Просто исках да попитам дали някой няма някакъв прост и ефективен метод |
|
| Автор: | Zeus [ Нед Сеп 26, 2010 2:33 pm ] | |||||||||
| Заглавие: | ||||||||||
Ами може да пробваш и в прекъсването. Просто проверявай между две последователни прекъсвания, дали сигнала е наличен. Изполвай една битова променлива, като я сетваш по време на проверката при наличие на сигнал. При следващото ако още държи фронта, я нулираш и правиш там каквото трябва. Също така си я нулираш в else на проверката. |
||||||||||
| Автор: | npelov [ Нед Сеп 26, 2010 3:07 pm ] |
| Заглавие: | |
Нещо не разбрах. |
|
| Автор: | RM [ Нед Сеп 26, 2010 3:33 pm ] | |||||||||
| Заглавие: | ||||||||||
За по сигурно |
||||||||||
| Автор: | 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 ] | |||||||||
| Заглавие: | ||||||||||
ето това сглобих на 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к. Доста ми е помагало при механични контакти.
|
|||
| Автор: | 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 са физическото състояние на линиите на енкодера.
|
|||
| Автор: | 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/ |
|