| Автор |
Съобщение |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
 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) са прекалено сложни (на пръв поглед)
идеи?
|
| Съб Сеп 25, 2010 9:34 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Аз се боря с шумовете софтуерно, като след първия if за настъпило събитие, слагам един delay от 50ms(обикновено за натискане на бутони) и правя втора проверка за условието и чак тогава сработва блока за последствието. Опитай с различни времена за delay, докато ти хареса.
|
| Съб Сеп 25, 2010 10:04 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
по принцип да, но когато е с прекъсване не можеш да чакаш. Трябва да излезеш колкото се може по-бързо. По всичко изглежда че ще трябва да ползвам таймер. Просто исках да попитам дали някой няма някакъв прост и ефективен метод
|
| Съб Сеп 25, 2010 11:33 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Ами може да пробваш и в прекъсването. Просто проверявай между две последователни прекъсвания, дали сигнала е наличен. Изполвай една битова променлива, като я сетваш по време на проверката при наличие на сигнал. При следващото ако още държи фронта, я нулираш и правиш там каквото трябва. Също така си я нулираш в else на проверката.
|
| Нед Сеп 26, 2010 2:33 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
Нещо не разбрах.
|
| Нед Сеп 26, 2010 3:07 pm |
|
 |
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 7:26 pm Мнения: 672
|
За по сигурно 
_________________ Вниманиене съмвишист....ИЙ.
|
| Нед Сеп 26, 2010 3:33 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
а някой чувал ли е за такива с оптрони? ... и да не са много скъпи
|
| Нед Сеп 26, 2010 4:04 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Е па шумят, ама при мен няма чак такива проблеми. Нещо бъркаш някъде. Аз като им сложа 100нФ и спират да шумят. Резисторите 4,7 к.
|
| Нед Сеп 26, 2010 6:53 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
при 9 от 10 оборота всичко е наред. Най много да избягат с 1 ... "щрак" т.е. вместо 20 на оборот изкарва 21. Обаче на 1 от 10 прескача с 4-5. Рядко се случва, но е дразнещо. Ще намаля на 4.7к да видя дали ще се случва.
|
| Пон Сеп 27, 2010 12:13 am |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
ето това сглобих на 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);
};
Обаче има и проблем, когато фронта на сигнала е доста по-дълъг от времето за прекъсване. Тогава ще трябва да следиш и по време на фронта условието да се задейства само веднъж.
|
| Пон Сеп 27, 2010 10:02 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Ема той проблема му е в разцъкване на контактите. Ама пък аз със същите енкодери доста различни неща съм правил и не съм имал чак такива проблеми. На 20 цъкания едно да има дабъл. Ама такива 4-5 не съм засичал.
|
| Пон Сеп 27, 2010 10:40 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Пробвай това свързване. Може да си поиграеш със стойността на 100к. Доста ми е помагало при механични контакти.
|
| Пон Сеп 27, 2010 11:03 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Прави се с цифрова филтрация.
Ето една моя библиотека за това. Позволява работа с повече от един енкодер и затова е малко усложнена.
Малко пояснения.
Първо се създава структура за съотвениия енкодер от тип 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 са физическото състояние на линиите на енкодера.
|
| Вто Сеп 28, 2010 1:18 am |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
С този енкодер и код взет от тук не съм забелязал и 1 "изпускане" да има. Също тук има, почти по същия начин реализирано.
|
| Вто Сеп 28, 2010 5:27 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
Значи все пак няма да се оттърва от таблицата с 16-те състояния. А аз си мислех че съм минал метър с една единствена проверка.
|
| Сря Сеп 29, 2010 3:43 pm |
|
|