Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Doppio encoder Robot

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: Doppio encoder Robot

Messaggioda Foto UtentePaolino » 19 gen 2010, 14:09

Ciao Galaxi93.
Sempre di corsa, ho buttato giù due conti che spero siano corretti.
Con Fosc = 16MHz, il timer TMR0 si incrementa ogni 0.25 us, valore ottenuto dal rapporto 4/Fosc. TMR0 ha un registro a 8 bit, il che significa che andrebbe in overflow ogni 0.25 * 256 = 64 ms. Valore del tutto insufficiente per te, dobbiamo introdurre un prescaler. Supponiamo di utilizzare un prescaler 1:4: TMR0 si incrementa ogni 4*0.25 = 1ms. Questo numero mi piace ;-)
Per far sì che il registro vada in overflow in 100ms, è necessario precaricare un valore diverso da 0 a partire dal quale il micocontrollore inizia a contare. Questo valore è TMR0 = 256-100 = 156
In questo modo, per ciascun millisecondo che trascorre, il registro viene incrementato di un valore. Partendo da 156 fino a 256 abbiamo 100 valori, ossia 100ms.

Per abilitare gli interrupt dobbiamo dare un'occhiata al datasheet. Per quanto concerne TMR0, la risposta all'interrupt va abilitata con
Codice: Seleziona tutto
INTCON.TMR0IE = 1;


mentre per l'abilitazione dell'IOC va fatta con:
Codice: Seleziona tutto
INTCON.RBIE = 1;
INTCON.PEIE = 1;


Non basta. L'abilitazione generale dell'interrupt avviene con:
Codice: Seleziona tutto
INTCON.GIE = 1;


Verifica e poi dimmi se hai altri dubbi.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[22] Re: Doppio encoder Robot

Messaggioda Foto UtenteGalaxi93 » 19 gen 2010, 15:42

Anche io avevo fatto questo tipo do conto, ma anche tu come me, abbiamo sbagliato l'unità di misura!

Paolino ha scritto:Con Fosc = 16MHz, il timer TMR0 si incrementa ogni 0.25 us, valore ottenuto dal rapporto 4/Fosc. TMR0 ha un registro a 8 bit, il che significa che andrebbe in overflow ogni 0.25 * 256 = 64 ms. Valore del tutto insufficiente per te, dobbiamo introdurre un prescaler. Supponiamo di utilizzare un prescaler 1:4: TMR0 si incrementa ogni 4*0.25 = 1ms.


Purtroppo quelli sono microsecondi!!! L'ho avevo testato prima e anche mettendo un prescaler massimo non ottengo niente di utile...( Tprescaler=256*0,25uS=64uS Toverflow=64uS*256=16,384mS un po' pochi per i miei 50 impulsi al secondo...).

Che si può fare? Senza ovviamente cambiare quarzo? Avevo pensato ad una cosa, ma mi sembra uno spreco di memoria!

Ciao,
Galaxi93.

Visita il mio sito!! E' ancora in costruzione, ma anche tu puoi contribuire a farlo crescere e darmi dei consigli per migliorarlo! Dai prova, provare non costa nulla! Vieni!
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[23] Re: Doppio encoder Robot

Messaggioda Foto UtentePaolino » 19 gen 2010, 15:58

Vedi la fretta? Hai ragione! :oops:
Allora, la cosa non è complicata. Cambiamo il prescaler, da 1:4 a 1:16. L'incremento è di 4us ad ogni tick. Bene, dopo 250 tick abbiamo 1ms (stavolta è giusto :-D ) Carichiamo 5 nel TMR0 e dopo 250 tick è trascorso 1ms. Nella ISR è necessario contare 100 eventi, ad esempio:
Codice: Seleziona tutto
volatile unsigned char uchContaIntr
char flag_one_ms;

void interrupt (void)
{
   if (INTCON.TMR0IF)
   {
      TMR0 = 5;
      uchContaIntr++;
      if (uchContaIntr==99)
      {
         flag_one_ms = TRUE;
         uchContaIntr = 0;
      }
   }

}

void main (void)
{
// impostazioni varie;

   uchContaIntr = 0;
   flag_one_ms = FALSE;

   while (1)
   {
   //......
      if (flag_one_ms == TRUE)
      {
         //....
         flag_one_ms = FALSE;
      }
   }

}


Scusami ancora, ma ho la testa altrove e non riesco a stare sulla palla come vorrei. Spero di non aver sbagliato ancora... :oops:

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[24] Re: Doppio encoder Robot

Messaggioda Foto UtenteGalaxi93 » 19 gen 2010, 16:26

Ora i conti sono giusti! :wink:
Ma in questo modo come posso fare eseguire qualche operazione all'interno dell'interrupt senza far intervenire il main? perché io avevo in mente ad un controllo quasi automatico della velocità-traiettoria-distanza indicando mediante delle variabili globali la direzione e la distanza, in automatico. Capito cosa intendo? Questo mi sarebbe molto comodo per lo sviluppo del programma.

Adesso finisco un lavoro di fai-da-te spero non troppo lungo e provo a vedere se i tempi sono giusti.
Galaxi93.

Visita il mio sito!! E' ancora in costruzione, ma anche tu puoi contribuire a farlo crescere e darmi dei consigli per migliorarlo! Dai prova, provare non costa nulla! Vieni!
Avatar utente
Foto UtenteGalaxi93
3.118 3 7 13
Master
Master
 
Messaggi: 617
Iscritto il: 15 apr 2009, 16:27

0
voti

[25] Re: Doppio encoder Robot

Messaggioda Foto UtenteAndrea1957 » 27 feb 2010, 21:59

Ciao a tutti

mi inserico in questo post con un problemino analogo a quello che avete discusso in precedenza che spero si possa risolvere in mikrobasic :D :D :D

Io fra qualche tempo avrò la necessità di leggere i passi di un encoder incrementale (doppio) montato sull'albero di un motrino in cc, che da quello che ho letto prima o poi proverò a gestirne la velocita in PWM, per incrementare e decrementare un contatore visualizzato su di un LCD.
La domanda che vorrei porre è: mi semplifico la vita utilizzando un FF sul canale B che se ha uscita alta la rotazione è in un senso e l'inverso se la rotazioneè nel verso opposto, e poi immetto il segnale dell'encodere + il segnale dell'FF, oppure posso gestire in maniera 'semplice' la cosa facendo digerire direttamente il tutto al 16f877 che vorrei utilizzare ???

spero di essere riuscito a spiegarmi, altrimenti chiedetemi lumi, penso la cosa potrà interessare anche altri amici.

grazie

ciao

Andrea
Avatar utente
Foto UtenteAndrea1957
0 2
 
Messaggi: 34
Iscritto il: 9 feb 2010, 22:01

0
voti

[26] Re: Doppio encoder Robot

Messaggioda Foto UtenteAndrea1957 » 28 feb 2010, 18:11

Ciao a tutti

ieri sera erano solo le 21.01 ma il mio cervello dormiva già! da un pezzo .......................... :oops: :oops: :oops:

Comunque quello che volevo dire lo ha scritto tempo addietro il buon Aduri al seguente link

viewtopic.php?f=17&t=8027&p=122175#p122175

ciao

Andrea
Avatar utente
Foto UtenteAndrea1957
0 2
 
Messaggi: 34
Iscritto il: 9 feb 2010, 22:01

0
voti

[27] Re: Doppio encoder Robot

Messaggioda Foto Utentepierinter » 5 mar 2010, 0:19

ciao galaxy! ho visto il tuo robot.. molto bello... ci siamo gia parlati qualche volta, mi sembra su grix...posso sapere di dove sei ? volevo chiederti una cosa... contattami pure con mp:) per nn andare offtopic
Avatar utente
Foto Utentepierinter
620 2 7 10
Expert EY
Expert EY
 
Messaggi: 1395
Iscritto il: 23 mar 2009, 0:05

Precedente

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 16 ospiti