Risoluzione a 10 bit la cui risoluzione puo essere utilizzata anche a 8 bit attraverso
ADCON1 REGISTER bit 7: ADFM: A/D Result format select
VREF+ VREF- impostano tensioni di riferimento nel renge di lavoro dell’adc
Esempio: Vref+ = 3 volt , Vref- =1 volt = 2Volt
Vref+ = 3 volt , Gnd /Vss = 3 volt
L’acquisizione/conversione avviene all'interno delle tensioni di riferimento
in base alla configurazione tavola 2.jpg del seguente registro
ADCON1 REGISTER bit 3-0: PCFG3:PCFG0: A/D Port Configuration Control bits
La lettura conversione avviene per singola porta impostando
ADCON0 REGISTER bit 5-3: CHS2:CHS0: Analog Channel Select bits
clock di conversione definita attraverso
ADCON0 REGISTER bit 7-6: ADCS1:ADCS0: A/D Conversion Clock Select bits
Attivare/accende per rendere la periferica disponibile come adc attraverso
ADCON0 REGISTER bit 0: ADON: A/D On bit
Start alla conversione abilitare il flag
ADCON0 REGISTER bit 2: GO/DONE: A/D Conversion Status bit
la figura qui sotto riporta le configurazioni che si possono adottare per quanto sopra citato
conclusa la conversione il bit GO/DONE viene posto a 0 dall’hardware due sono le strade da seguire per determinare l’evento
1° testare il flag GO/DONE se = 0
2° attivare l’interrupt e scrivere le routine di gestione (piu complicato )
il risutato della convesione si trova nei registri
1Eh ADRESH A/D Result Register High Byte
9Eh ADRESL A/D Result Register Low Byte
Per una scala/risoluzione a 8 bit sarà sufficente leggere ADRESH avento configurato ADFM=0
per una rappresentazione a 10 bit (con piu risoluzione) configurare ADFM=1
in piu bisogna eseguire uno shift a sinistra di 8 posizioni
esempio: var_temp =(ADRESL+(ADRESH<<8));
Il pic lo fa per noi non so spiegare …:-) se qualcuno vuol dire la sua fa cosa gradita
Conclusa questa panoramica generale riassumendo in pratica cosa fare
1. configurare il modulo Adc : ADCON1
- porte A/D da usare PCFG3:PCFG0
- riferimenti di tensione
- formatazione del risultato ADFM
2. selezionare la porta ADCON0
- per la conversione ANx CHS2:CHS0
- scegliere il clock (velocità) ADCS1:ADCS0
3. configurare l’interrupt (facoltativo se non serve disabilitarlo )
- create le routine per gestire l’evento:
- Clear ADIF bit PIR1
- Set ADIE bit PIE
- Set GIE bit INTCON
4. Attendere un’adeguato tempo in us per l’acquisizione della tensione da parte della porta
5. Iniziare la conversione ponendo GO/DONE=1
6. testare il bit GO/DONE =0 per determinare la fine della conversione
- se l’interrupt è abilitato non serve testare GO/DONE
ci sarà la routine dell’interrupt che gestisce l’evento
7. leggere i registri ADRESL ADRESH secondo formatazzione ADFM
8. ripartire dal punto
1 per nuove configurazioni
2 per cambiare porta ANx e clock
3 per la stessa porta e stessa configurazione
Tutto questo è necessario per capire come usare l’adc, tanto per citarlo l'adc
viene richiamato dal modulo CCP in determinate configurazioni.
Personalmente non l'ho mai approfondita, non ne ho avuto motivo.
Il programma che segue l'ho scritto con HI-TECH Microchip PIC v8.02 PL1 in linguaggio C
ha lo scopo di passare dalla teoria alla pratica, :-) intendiamoci non è una lezione di C :-)
(tutto ciò che si trova a destra di // sono commenti)
//******************************
// L' ADC nei pic 16f876 - 877
// AN0 e AN1 convertono la stessa tensione ma la rappresentano
// AN0 in 10 bit AN1 in 8 bit , variando il flag ADFM , il tutto visualizzato in scala decimale su display lcd 2x16
// ****************************
// #define ADC_* raggruppa le impostazioni per l'uso della porta
// da usare, ANx porta, clock,il formato del risultato, in questo modo
// è piu facile scrivere e leggere il prg
unsigned var_temp=0; // variabile intera senza segno (16 bit 2 byte)
unsigned char i=0; // variabile intera 8 bit 1 byte
//*****************************
// inizializzo le routine
int init_portLcd(); // + presentazione
int ReadAdc();
int stampa();
//******************************
main() // all’interno del MAIN la gestione del prg
{
init_portLcd();
GIE=0; // disabilita interrupt generale
PEIE=0; // tutto disable
PIE1=0;
PIR1=0;
//*********************************************************
while(1)
{
// ADCON1= 0b10000000; // formatazione risultato 10 bit bit7=1
// ADCON0= 0b00000001; // scelta porta e clock conversione
// questa due righe in alto sono state sostituite da ADC_0;
ADC_0; // AN0
ReadAdc(); // routine di lettura
var_temp =(ADRESL+(ADRESH<<8)); // sposto il contenuto delle due variabili
// ADRESL e ADRESH in una a 16 bit intera
// ADCON1= 0b00000000; // formatazione risultato 8 bit bit7=0
// ADCON0= 0b00001001;
ADC_1; // AN1
ReadAdc();
stampa(); // ruotine per lcd
} // end while
} // fine main
//************
ReadAdc()
{
DelayUs(250); // ritardo per acquisire la tensione
ADGO=1; // start della conversione A/D
while(ADGO); // ADGO=0 fine conversione
}
//***********
stampa()
{
LCD_GOTO(1,1);
LCD_PUTS(" ");
LCD_GOTO(1,1);
LCD_PUTUN(var_temp);
LCD_GOTO(2,1);
LCD_PUTS(" ");
LCD_GOTO(2,1);
LCD_PUTUN(ADRESH);
DelayMs(200);
}
//******************
init_portLcd()
{
PORTB=0;
TRISB0=1;
TRISB1=0; //DATA 4 dell'LCD
TRISB2=0; //DATA 5
TRISB3=0; //DATA 6
TRISB4=0; //DATA 7
TRISB5=0; //RS
TRISB6=0; //E
TRISB7=1;
// inizializza LCD
LCD_INIT(); // INDISPENSABILE serve ad inizializzare l'LCD
DelayMs(50); // ritardo per completare l'inizializzazione (facoltativo)
LCD_CLEAR(); // cancella il display
DelayUs(750); // pausa (facoltativo)
// presentazione
LCD_CMD(LCD_line1); // numero riga
LCD_PUTS(" by Agric ");
LCD_CMD(LCD_line2);
LCD_PUTS(" ADC 16F876-877 "); // scrivo una stringa di caratteri
DelayMs(255); // pausa 255 millisecondi
DelayMs(255); // si puo usare un ciclo FOR
DelayMs(255);
DelayMs(255); // Se la quantità di memoria dati e
DelayMs(255); // programma non e' un problema
DelayMs(255); // va bene anche cosi
DelayMs(255);
DelayMs(255);
LCD_CMD(LCD_line1);
LCD_PUTS(" ADC 16F876-877 ");
LCD_CMD(LCD_line2);
LCD_PUTS(" su WWW.GRIX.IT ");
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
LCD_CLEAR(); // Cancella il display
DelayMs(50); // pausa (facoltativo)
LCD_GOTO(1,8);
LCD_PUTS("10 BIT"); // scrivo una stringa di caratteri
LCD_GOTO(2,9);
LCD_PUTS("8 BIT"); // scrivo una stringa di caratteri
}
qui in allegato un video che mostra il funzionamento del programma adc_8_10_bit.wmv
grazie di tutto Agric
il parere della community
esprimi il tuo voto
approvi questa pagina?
promo
non sei autenticato, per questo non puoi visualizzare i commenti sulla pagina. Se sei registrato accedi oppure registrati.
difficoltà
costo
informazioni
Questa pagina è stata creata da agric il 22/09/2008 ore 16:30 ultima modifica del 26/09/2008 ore 09:22la pagina è stata visitata 9934 volte
Lo staff di www.grix.it non si assume responsabilità sul contenuto di questa pagina.
Se tu sei l'autore originale degli schemi o progetti proposti in questo articolo, e ritieni che siano stati violati i tuoi diritti, contatta lo staff di www.grix.it per segnalarlo.