Questo sito utilizza cookie, anche di terze parti, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie vai alla sezioneCookie Policy

Il comparatore dei Picmicro

Ultimo aggiornamento: 31/07/2015

Il modulo comparatore di un microcontrollore è un  modulo spesso utilizzato per paragonare fra di loro due tensioni esterne oppure per confrontare una tensione esterna ad una tensione di riferimento interna. E' usato spesso, sopratutto nei casi in cui, ad esempio, si debba controllare il raggiungimento di una certa 'soglia' da parte di un sensore.

Per semplicita' si fara' riferimento ad un microcontrollore molto utilizzato, il pic 12F683, dotato al suo interno di un modulo comparatore, ma il principio è identico per quasi tutti i microcontrollori dotati di moduli comparatori.

12f683


Un rapido sguardo al datasheet (dal quale sono state estrapolate alcune immagini) consentira' immediatamente di capire che questo modulo puo' essere configurato in 8 diverse modalita' (7 in realta', piu' lo stato di OFF). Per il momento vediamo un paio di queste configurazioni, forse le piu' comuni dove:

picmicro vref A) due tensioni esterne vengono confrontate ed il risultato (cout) è dato dallo stato logico di un pin del microcontrollore (GP2);
comparatore vref B) una tensione interna viene confrontata con una tensione di riferimento interna ed il risultato si ottiene analizzando lo stato logico di un bit del registro (CMCON.COUT).
picmicro comparatore

PRIMO CASO:

Si devono confrontare due tensioni esterne.

Assumendo una VDD di 5V, noi posizioneremo un piccolo partizionatore, con due resistenze di valore uguale, su GP1(Cin-) per avere una prima tensione fissa di 2.5V ed un trimmer su GP0(Cin+) in modo di avere una tensione variabile fra 0-5V. Un led su GP2 completera' lo schema di esempio.

 
Il modulo comparatore prevede il settaggio di un registro: CMCON0

 

registro comparatore


dove:

 

COUT: bit di uscita logica del comparatore (non utilizzato per ora). 
CINV:  inverte il risultato 
CM2-CM1-CM0 da settare (in base al nostro esempio) come;

001 - configura i pin di input (GP0-GP1 come analogici) ed assume il pin del risultato COUT (Gp2 come output)
100 - GP1 (Cin-) viene configurato come input analogico, Vref interna, Gp0-GP2 utilizzabili per I/O

 

Quindi, facendo riferimento allo schema elettrico dell'esempio, usando il linguaggio C, si dovra' settare:

void main() { 
OSCCON = 0b01110000;      // 8mhz oscillatore interno
CMCON0 = 0b00000001;     //CIN+ e CIN- analogici, COUT pin configrato come pin di risultato
TRISIO = 0b00000011;         // gp0 gp1 = input  gp2 = output
do {
} while(1); 
}

E' tutto. Girando il trimmer il pin GP2 assumera' valore High o Low in base al livello di tensione su CIN+

 

SECONDO CASO: 

 

desideriamo comparare una tensione esterna rnei confronti di una tensione fissa interna Vref. Il risultato verrà analizzato via software.

In questo caso CIN- (GP1) sara' il pin sul quale si dovra' fornire la tensione esterna da confrontare. Tutti gli altri pin saranno disponibili per I/O.

La differenza principale rispetto all'esempio precedente riguarda il settaggio del valore di tensione interno di riferimento che dovremo prestabilire. 

 

La tensione di riferimento Vref si setta utilizzando il registro  VRCON dove:


VCON

 

  • VREN: abilita la Vref
  • VRR: Seleziona la gamma di valori
  • VR3...VR0: bits usati per stabilire la tensione di riferimento (con peso: 8 4 2 1)

esempio:

  • Se  VRR=1 e VR3 ... VR0 = 1111 (8+4+2+1=15) e VDD a 5V la Vref sara' (15/24)*5 = 3,125V
  • Se  VRR=0 e VR3 ... VR0 = 1111 (8+4+2+1=15) e VDD a 5V la Vref sarà 5/4+(15/32)*5 = 3,593V

Il questo caso, pero', il risultato sarà disponibile sul bit COUT del registro CMCON.

 

Usando il C potremo quindi scrivere:

 

void main() 

OSCCON = 0b01110000;                  // 8mhz oscillatore interno
CMCON0 = 0b00000100;                 // CIN- analogico, VRef interna
TRISIO = 0b00000010;                     // gp1 = input  
VRCON  = 0b10101111;                   // setta VRef
do { 
     if (CMCON0.COUT == 1)            // se cmcon0.cout=1 lampeggia led, altrimenti spegnilo
       {     
        gpio.F2 =1;    
        delay_ms(500);    
        gpio.F2 = 0;    
        delay_ms(500);  
       }
     } while(1);
 }


Tutto qua. Talvolta le cose sono piu' difficili da spiegare che da realizzare. In seguito vedremo altri usi dei comparatori

Diritti riservati Cuteminds.com 2008-2015. Tutti i marchi riportati sono detenuti dai legittimi proprietari. Tutto il materiale e` liberamente utilizzabile ma non per scopi commerciali. Non si assume alcuna responsabilita` sul materiale pubblicato per eventuali danni diretti o indiretti che possano derivare dall`utilizzo di schemi, progetti o altro materiale presente nel sito. Inviare una mail a: remove-admin@cuteminds.com (contenuti) remove-webmaster@cuteminds.com (webserver) per domande e/o suggerimenti.