Отговори на тема  [ 28 мнения ]  Отиди на страница 1, 2  Следваща
Rotary encoder 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 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) са прекалено сложни (на пръв поглед)


идеи?


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

_________________
PIC SPBRG values calculator
Съб Сеп 25, 2010 9:34 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
Аз се боря с шумовете софтуерно, като след първия if за настъпило събитие, слагам един delay от 50ms(обикновено за натискане на бутони) и правя втора проверка за условието и чак тогава сработва блока за последствието. Опитай с различни времена за delay, докато ти хареса.


Съб Сеп 25, 2010 10:04 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
по принцип да, но когато е с прекъсване не можеш да чакаш. Трябва да излезеш колкото се може по-бързо. По всичко изглежда че ще трябва да ползвам таймер. Просто исках да попитам дали някой няма някакъв прост и ефективен метод

_________________
PIC SPBRG values calculator


Съб Сеп 25, 2010 11:33 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
npelov написа:
по принцип да, но когато е с прекъсване не можеш да чакаш. Трябва да излезеш колкото се може по-бързо. По всичко изглежда че ще трябва да ползвам таймер. Просто исках да попитам дали някой няма някакъв прост и ефективен метод


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


Нед Сеп 26, 2010 2:33 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Нещо не разбрах.

_________________
PIC SPBRG values calculator


Нед Сеп 26, 2010 3:07 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 672
Мнение 
Код:
// 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

_________________
Вниманиене съмвишист....ИЙ.


Нед Сеп 26, 2010 3:33 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
а някой чувал ли е за такива с оптрони? ... и да не са много скъпи

_________________
PIC SPBRG values calculator


Нед Сеп 26, 2010 4:04 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Е па шумят, ама при мен няма чак такива проблеми. Нещо бъркаш някъде. Аз като им сложа 100нФ и спират да шумят. Резисторите 4,7 к.


Нед Сеп 26, 2010 6:53 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

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

_________________
PIC SPBRG values calculator


Пон Сеп 27, 2010 12:13 am
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
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);
};

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


Пон Сеп 27, 2010 10:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Ема той проблема му е в разцъкване на контактите. Ама пък аз със същите енкодери доста различни неща съм правил и не съм имал чак такива проблеми. На 20 цъкания едно да има дабъл. Ама такива 4-5 не съм засичал.


Пон Сеп 27, 2010 10:40 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
Пробвай това свързване. Може да си поиграеш със стойността на 100к. Доста ми е помагало при механични контакти.


Прикачени файлове:
scheme.JPG
scheme.JPG [ 4.88 KiB | Прегледано 6534 пъти ]
Пон Сеп 27, 2010 11:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 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 са физическото състояние на линиите на енкодера.


Прикачени файлове:
IncrementalEncoder.rar [1.42 KiB]
414 пъти
Вто Сеп 28, 2010 1:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
С този енкодер и код взет от тук не съм забелязал и 1 "изпускане" да има. Също тук има, почти по същия начин реализирано.


Вто Сеп 28, 2010 5:27 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Значи все пак няма да се оттърва от таблицата с 16-те състояния. А аз си мислех че съм минал метър с една единствена проверка.

_________________
PIC SPBRG values calculator


Сря Сеп 29, 2010 3:43 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 28 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни