Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Inkrementalni opticki enkoder

[es] :: Elektronika :: Inkrementalni opticki enkoder

Strane: 1 2

[ Pregleda: 6679 | Odgovora: 26 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.isp.telekom.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Inkrementalni opticki enkoder25.04.2015. u 10:11 - pre 108 meseci
@veselinovic

Da to moze da bude od pomoci ali u sustini nema nesto preterane potrebe za tim.

Interapt rutina ISR mora (veoma preporucljiva) da se u svakom slucaju koristi.
Kad se vec udje u ISR, par komandi vise-manje ne pravi neku bitnu razliku.

Cak pojedini MCU imaju interno specifican hardware za baratanje sa njima (QE modul, npr STM32F3 i F4 uglavnom imaju), predvidjeni za vrlo brze signale koji rade nezavisno od procesora i posle se samo periodnicno po potrebi cita njihovo stanje.

---

Sto se tice C i C++, kod Keil uVision su skoro svi primeri uradjeni u C++, koriste se objekti i strukture (variable) i ako se to ne razume, to je ogroman hendikep za programera!
Naravno, moze i bez C++ ali onda mora da se poznaje detaljno HW i odprilike se tako onda stize na Asemblerski nivo jer mora da se poznaju svi registri i sta/koji rade.

---

Dalje, sta ovde nije jasno?
Ovo je C jezik, koriste se nizovi i osnovne logicke operacije (shift, and, or)?!
Ako ovo nije jasno, hmm, taj programer je u velikom problemu ...

Code:
/* returns change in encoder state (-1,0,1) */
int8_t read_encoder()
{
  static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
  static uint8_t old_AB = 0;
  /**/
  old_AB <<= 2;                   //remember previous state
  old_AB |= ( ENC_PORT & 0x03 );  //add current state
  return ( enc_states[( old_AB & 0x0f )]);
}





Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

draganko2000

Član broj: 214461
Poruke: 5
62.68.97.*



Profil

icon Re: Inkrementalni opticki enkoder28.04.2015. u 13:06 - pre 108 meseci
Evo dio koda u mikroC PRO for PIC, koji u prekidnoj rutini odredjuje smjer vrtnje enkodera.


sbit enkoderA at RB0_bit;
sbit enkoderB at RB1_bit;
sbit enkoderA_Direction at TRISB0_bit;
sbit enkoderB_Direction at TRISB1_bit;

long impENKO=0;

GIE_bit=1; // Omoguci sve prekide
INT0IE_bit=1; // Omoguci vanjski prekid na RB0 (INT0)
INTEDG0_bit=1; // prekid na POZITIVNU ivicu na RB0

.
.
.

void interrupt() {

if (INT0IF_bit==1) { // prekid sa RB0

if(enkoderB==0) impENKO++; // smjer CW,
if(enkoderB==1) impENKO--; // smjer CCW,

INT0IF_bit=0;
}

}

Da bi se dobilo 2x vise impulsa potrebno je omoguciti prekid i na zadnju ivicu na RB0.
Ako bi se koristio prekid na prednju i zadnju ivicu na RB1 (kao na RB0) dobili bi 4x vise impulsa!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Inkrementalni opticki enkoder28.04.2015. u 13:55 - pre 108 meseci
@draganko, jedina mana toga sto si stavio je sto moras da imas dobar externi debouncing inace ces da imas haos, kad se malo zaprlja enkoder krenes da dobijas signale napred nazad ko blesave, posebno kod mehanickih enkodera

ima sema, zas011 je stavljao vec 2-3 puta, da sa enkodera direkt dobijes + i - signal, 2 flipflopa

na primer


za encoder rutinu sa debouncingom pogledaj https://sourceforge.net/p/arhi...EAD/tree/SID/SID_GEN4.X/main.c
isr je od linije 184

Code:

    if (INTCON3bits.INT1IF) { //ENC1 falling edge
     if ((isr_started - debounce_B_prev) > DEBOUNCE_TIME)  {
            if (PIN_E2) {
                if (encoder > encoderMIN) encoder--;
                changed = 1;
                debounce_B_prev = isr_started;
            } else {
                if (encoder < encoderMAX) encoder++;
                changed = 1;
                debounce_B_prev = isr_started;
            }
        }
        INTCON3bits.INT1IF = 0;
        
    } else if (INTCON3bits.INT2IF) { //ENC2 falling edge    
        if (isr_started - debounce_B_prev > DEBOUNCE_TIME) {

#ifndef DETENT_DOUBLE
            if (PIN_E1) {
                if (encoder < encoderMAX) encoder++;
                changed = 1;
                debounce_B_prev = isr_started;
            } else {
                if (encoder > encoderMIN) encoder--;
                changed = 1;
                debounce_B_prev = isr_started;
            }
#endif
        }
        INTCON3bits.INT2IF = 0;
    } else if ...


 
Odgovor na temu

draganko2000

Član broj: 214461
Poruke: 5
62.68.97.*



Profil

icon Re: Inkrementalni opticki enkoder28.04.2015. u 14:44 - pre 108 meseci
Signale od enkodera (A i B) prenosim preko RS485, a prije enkodera koristim i optokapler sa s
mit trigerom.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Inkrementalni opticki enkoder28.04.2015. u 14:57 - pre 108 meseci
kao sto rekoh neophodan je externi debouncing, kako ces isti da izvedes nebitno je .. ja sam do duse poceo da dodajem sw debouncing cak i kada postoji hardwerski, opekoh se par puta

 
Odgovor na temu

draganko2000

Član broj: 214461
Poruke: 5
62.68.97.*



Profil

icon Re: Inkrementalni opticki enkoder28.04.2015. u 15:05 - pre 108 meseci
Hvala na sugestiji za sw debouncing.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Inkrementalni opticki enkoder28.04.2015. u 15:24 - pre 108 meseci
nema na cemu, kao sto vidis to je samo par linija koda vise, nista znacajno, naravno podrazumeva da imas neki tajmer u kodu no ako radis bilo sta ozbiljno verovatno vec imas tako da te to nista ne kosta (kod mene ako pogledas ceo fajl vidis da ima "millis" varijabla koja se inkrementuje za 2 u tajmeru na svake dve milisekunde) .. ako imas vec hw debouncing idealno je da izracunas vreme koje debounceuje hw i isto vreme podesis za sw tako da sve radi skladno ali ako hw slucajno zakaze (npr iscuri ti kapacitet konda pred schmidt-om posle godinu dana) sw to iskompenzuje i sve i dalje radi kako treba :) ... e sad kad te mrzi da racunas, stavis neko vreme za sw debounce da ti enkoder radi lepo bez hw debouncinga i onda vratis nazad hw i vozi misko :D
 
Odgovor na temu

[es] :: Elektronika :: Inkrementalni opticki enkoder

Strane: 1 2

[ Pregleda: 6679 | Odgovora: 26 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.