za CW imas rastucuA rastucuB opadajucuA opadajucuB
mozes da vatas sve ivice i dobijes extra preciznost mada je to preveliko cimanje, mozes da vatas samo rastucu ili samo opadajucu ivicu na A i na B ili samo da vatas rastucu ili opadajucu samo na A ili B
najjednostavnije je da radis samo jednu ivicu samo jednog izlaza. To je najmanja rezolucija ali ubedljivo najjednostavnije za izvedbu
1. stavis da ti je A vezan za interrupt pin (na primer EXT)
2. napravis interrupt na tom pinu (npr rastuci)
3. izlaz sa B stavis na obican input pin (Bez interrapta)
i onda radis samo:
Code:
interrupt (void)
{
if (tvoj_interrupt){ //RASTUCA IVICA NA A
if (ako je B==1){ //dakle interapt je bio na rastuce A tako da je A sigurno 1, ako je i B 1 onda znaci da idemo u rikverc
if (encoder > encoderMIN) encoder--;
} else { //ovde je dakle A1 a B je 0, dakle idemo napred
if (encoder < encoderMAX) encoder++;
}
}
}
e sad, ovo ti je idealno za rucni enkoder, ono za menije i slicno, ako oces max rezoluciju sa nekog enkodera sa motora i slicno onda mozes da turis i A i B na on change i imas nesto tipa (ovo nije provereno, sad cukam iz glave)
Code:
interrupt (void) //ovo je interrupt on change za te pinove
{
if (overi el tvoj interrupt){
if (A=1){
if (A==B) encoder++ else encoder--;
} else {
if (A==B) encoder-- else encoder++;
}
}
}
ova varijanta ti daje najvecu preciznost zato sto brojis korak i na uzlaznoj i na silaznoj ivici oba signala, obrati samo paznju da IOC ima svoje limite sto se tice brzine, proveri datasheet ali ako imas neke 800 ili 1600 koracne enkodere koji trce u hiljadama rpm trebace ti neki zahebano brz mcu da to pokupi...
inace isplati se turiti jedan 7474 i resiti problem :) ustedis nekoliko taktova na mcu-u u svakom interaptu, zavisno koliko je opterecen mcu to moze da bude znacajno poboljsanje