Jump to content
ELFORUM - Forumul electronistilor

Utilizare rotita satelit comanda volan + 12F675


Recommended Posts

Salutare

Am o rugaminte...

Am un satelit comanda volan, la care folosesc switch-urile. Mi-a ramas nefolosit rotita din spatele lui. Acea rotita are 4 fire. Un fir comun, iar restul 3 switch-uri, in functie de rotare. Ar veni 1 - 2 - 3 sau 3- 2- 1.

Ma intereseaza sa folosesc acea rotita pentru a schimba temporizarea la stergatoarele de parbriz.

As face schema din imagine.

As folosi doar 2 pozitii.

Problema este... cum pot in pic 12f675 sa verific daca rotesc intr-o parte sau in cealalta acea rotita. Limbajul de programare... oricare.. (mai putin asm-ul ;) )

Multumesc anticipat.

 

post-184190-0-83770400-1401262879_thumb.jpg

Edited by critix
Link to comment
  • Replies 11
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Folosind un singur pin al pic-ului in mod sigur n-ai cum sa te prinzi de directie. *)

Pe de alta parte, encoderele (ca cel din mouse-ul cu bila, de exemplu) nu trimit numai sw1-sw2-sw1-sw2... ci au mai multe stari (pentru 2 switch-uri ar trebi sa iasa 4 stari, vezi "diagramale" de functionare din documentatii de encodere) cu ajutorul careia te poti prinde de directie.

 

*) M-am mai uitat o data si am vazut ca ai rezistente de valori diferite inseriate cu switch-urile, ceea ce sugereaza ca vrei sa folosesti adc-ul pentru "masuratori", da' nu ma prind cum ar trebui sa functioneze. 

Link to comment

Pai ti-am zis, pui osciloscopul/aparatul de masura pe pinii encoderului (rotitei) intre switchiuri si rezistente (cu celalat capat al rezistentelor la VDD), rasucesti de rotita si vezi ce obtii la iesiri.

In program salvezi starea curenta si, la o modificare, compari starea curenta cu ce obtii si decizi directia de rasucire. 

Cam asa arata la mine bucata de cod in care prelucrez un encoder (am sters ce nu era legat de prelucrarea encoderului):

        if (bNewEncData) //am detectat o intrerupere la encoder        {            bNewEncData = 0;            ucEncNewVal = ucEncNewVal & 0x30; // mask al other bits            switch (ucEncNewVal) //detectez sensul de rotatie in functie de starea anterioara si starea actuala            {                case 0x00: if (ucOldEncValue == 0x10)                        ucEncDir = 'D';                    else if (ucOldEncValue == 0x20)                        ucEncDir = 'S';                    break;                case 0x10: if (ucOldEncValue == 0x30)                        ucEncDir = 'D';                    else if (ucOldEncValue == 0x00)                        ucEncDir = 'S';                    break;                case 0x20: if (ucOldEncValue == 0x00)                        ucEncDir = 'D';                    else if (ucOldEncValue == 0x30)                        ucEncDir = 'S';                    break;                case 0x30: if (ucOldEncValue == 0x20)                        ucEncDir = 'D';                    else if (ucOldEncValue == 0x10)                        ucEncDir = 'S';                    break;                default: ucEncDir = 'N';                    break;            } //switch            ucOldEncValue = ucEncNewVal; //memoreaza valoarea actuala a encoderului pentru urmatoarea rotire            ucOldEncDir = ucEncDir; //memoreaza directia actuala de rotire.            TMR1IE = 1;            INTCONbits.RBIF = 0;            INTCONbits.RBIE = 1;        } //if(bNewEncData)

Detectia propriuzisa o fac prin intreruperi:

void interrupt isr(void){    if(INTCONbits.RBIE && INTCONbits.RBIF)    {        //RB4-RB5 - rotary encoder                INTCONbits.RBIE = 0;        INTCONbits.INTE = 0;        INTCONbits.INTF = 0; //       TMR1IE = 0;  // !!!daca-l opresc pe asta nu mai pot iesi din programare!!!        TMR0IF = 0;        TMR0IE = 0;        ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition        INTCONbits.RBIF = 0;        ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition        bEnc0 = PORTBbits.RB4;        bEnc1 = PORTBbits.RB5;        bNewEncData = 1;    }}
Edited by Liviu M
Link to comment

Sorry, am browserul setat sa ma conecteze automat, asa ca nu m-am prins ca unele chestii nu se vad.

 

Uite si schema. Encoderul e ala din coltul dreapta sus. Aia e schema pentru encoderul din mouse. Encoderul folosit in schema finala are si contact la apasare (al treilea switch din schema), asa ca-l folosesc si pe ala, dar separat de encoder.

post-175022-0-19743900-1401349939_thumb.png

Edited by Liviu M
Link to comment

La encoderele incrementale cele doua semnale sunt defazate la 90grade , ordinea ar fi 00->01->11->10 adica un cod Gray.

Aici e o metoda mai simpla de calculat sensul:

 

encold<<=1;

encold^=encnew

if(encold.1)

  sens1

else

 sens2

encold=encnew

 

encold - valoarea anterioara a encoderul

encnew - valoarea curenta

encold.1 = bit-ul 1 din encold

Edited by Elef
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines