- Messaggi: 130
- Ringraziamenti ricevuti 11
LTlib 4.0.1 e Conversione A/D
8 Anni 6 Mesi fa #1
da Claudio_F
LTlib 4.0.1 e Conversione A/D è stato creato da Claudio_F
Sto provando vari sensori con il PIC18F4550. Dopo il MFRC522, su cui avevo aperto un'altro Topic, ero riuscito a leggere almeno l'ID. Poi sono passato al modulo ricevitore per telecomandi a 433Mhz sospeso perché con il sistema del CCP non riesco a leggerlo. I prossimi saranno il sensore di temperatura e umidita DHT11 e il Modulo 3 Assi GY-521 MPU-6050. Ora sto provando il sensore di corrente ACS712, ma con la libreria LTlib 4.0.1 non ho trovato come gestire il modulo ADC del PIC. Un suggerimento? Grazie!
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Claudio_F
- Autore della discussione
- Premium Member
Riduci
Di più
8 Anni 6 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic LTlib 4.0.1 e Conversione A/D
Attualmente la libreria LTlib non supporta il modulo ADC.
Nelle prossime versioni integrerò anche questo modulo.
Per ora puoi far riferimento al testo XC8 Step by Step.
Sebbene faccia uso delle librerie Microchip, il numero di bit da impostare sono piuttosto esigui e non dovresti avere problemi.
Saluti,
Mauro
Nelle prossime versioni integrerò anche questo modulo.
Per ora puoi far riferimento al testo XC8 Step by Step.
Sebbene faccia uso delle librerie Microchip, il numero di bit da impostare sono piuttosto esigui e non dovresti avere problemi.
Saluti,
Mauro
Ringraziano per il messaggio: Claudio_F
Si prega Accedi o Crea un account a partecipare alla conversazione.
8 Anni 6 Mesi fa #3
da Claudio_F
Risposta da Claudio_F al topic LTlib 4.0.1 e Conversione A/D
ho usato queste impostazioni:
// Inizializzo Porte
IO_set_all_ports_as_inputs();
// Inizializzo il display LCD con quarzo a 20MHz
LCD_initialize (20);
// Imposto i tempi di conversione e giustificazione a destra
// TAD : FOSC/16
// TACQ: 4 TAD
// Giustificazione destra
ADCON2 = 0b10010101;
// Seleziono AN0 come ingresso analogico
// VREF sono impostate a massa e VCC
ADCON1 = 0b00001110;
// Seleziono canale AN0
// Abilito l'ADC
ADCON0 = 0b00000001;
nel loop faccio 10 letture e calcolo la media salvandola in una variabile unsigned long.
La conversione è a 10 bits, gli step sono quindi 1024, con un riferimento = Vcc, la risoluzione è di circa 0,00488Volt. Per esempio leggo 720 che sono circa 3,5V. Non utilizzando variabili float come visualizzare la tensione sul Display? Ho provato a moltiplicare 720 * 488 =351360. L'intenzione è convertire questo unsigned long in stringa e poi manipolando la stringa separare i decimali. Purtroppo la funzione ultoa non mi da il risultato sperato. Altre soluzioni?
// Inizializzo Porte
IO_set_all_ports_as_inputs();
// Inizializzo il display LCD con quarzo a 20MHz
LCD_initialize (20);
// Imposto i tempi di conversione e giustificazione a destra
// TAD : FOSC/16
// TACQ: 4 TAD
// Giustificazione destra
ADCON2 = 0b10010101;
// Seleziono AN0 come ingresso analogico
// VREF sono impostate a massa e VCC
ADCON1 = 0b00001110;
// Seleziono canale AN0
// Abilito l'ADC
ADCON0 = 0b00000001;
nel loop faccio 10 letture e calcolo la media salvandola in una variabile unsigned long.
La conversione è a 10 bits, gli step sono quindi 1024, con un riferimento = Vcc, la risoluzione è di circa 0,00488Volt. Per esempio leggo 720 che sono circa 3,5V. Non utilizzando variabili float come visualizzare la tensione sul Display? Ho provato a moltiplicare 720 * 488 =351360. L'intenzione è convertire questo unsigned long in stringa e poi manipolando la stringa separare i decimali. Purtroppo la funzione ultoa non mi da il risultato sperato. Altre soluzioni?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Claudio_F
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 130
- Ringraziamenti ricevuti 11
8 Anni 6 Mesi fa #4
da permax1958
Risposta da permax1958 al topic LTlib 4.0.1 e Conversione A/D
la prima soluzione che mi viene in mente senza usare variabili float è la seguente:
-- dichiaro una variabile di tipi int e gli assegno il valore letto dal convertitore;
-- poi moltiplico il valore letto x 0,00488 e lo assegno ad un'altra variabile di tipo int, in questo modo solo la parte intera verrà assegnata, nel tuo caso se leggi 720 e lo moltiplichi per 0,00488 ottieni 3,51 ed alla variabile verrà assegnato il valore 3
-- converti il valore della variabile in un carattere ascii aggiungendo 48 nel tuo caso avrai 48 + 3 = 51 che è il carattere ascii '3'
-- mandi il carattere da visualizzare al display seguito dal carattere '.'
-- ora ci occupiamo della parte decimale
-- moltiplichi il valore letto x 0,00488 e gli sottrai il valore intero ricavato prima e il tutto lo moltiplichi x 10 e lo assegni ad una variabile di tipo int, in questo modo il primo valore decimale viene moltiplicato x 10 trasformandolo in intero e assegnato alla variabile, nel tuo caso 720 x 0,00488 = 3,51 - 3 = 0,51 x 10 = 5,1 e solo il cinque viene assegnato alla variabile di tipo int
-- converti il valore nel carattere ascii aggiungendo 48 e lo mandi al display
quimdi riassumendo:
unsigned int valore_letto, valore_intero, valore_decimale;
valore_letto = (((int) ADRESH) << | ADRESL;
valore_intero = (int) (valore_letto * 0,00488);
write_char_LCD(valore_intero + 48);
write_char_LCD('.');
valore_decimale = (int) ((((valore_letto * 0,00488) - valore_intero) * 10);
write_char_LCD(valore_decimale + 48);
write_char_LCD('V');
penso che funzioni è da testare
-- dichiaro una variabile di tipi int e gli assegno il valore letto dal convertitore;
-- poi moltiplico il valore letto x 0,00488 e lo assegno ad un'altra variabile di tipo int, in questo modo solo la parte intera verrà assegnata, nel tuo caso se leggi 720 e lo moltiplichi per 0,00488 ottieni 3,51 ed alla variabile verrà assegnato il valore 3
-- converti il valore della variabile in un carattere ascii aggiungendo 48 nel tuo caso avrai 48 + 3 = 51 che è il carattere ascii '3'
-- mandi il carattere da visualizzare al display seguito dal carattere '.'
-- ora ci occupiamo della parte decimale
-- moltiplichi il valore letto x 0,00488 e gli sottrai il valore intero ricavato prima e il tutto lo moltiplichi x 10 e lo assegni ad una variabile di tipo int, in questo modo il primo valore decimale viene moltiplicato x 10 trasformandolo in intero e assegnato alla variabile, nel tuo caso 720 x 0,00488 = 3,51 - 3 = 0,51 x 10 = 5,1 e solo il cinque viene assegnato alla variabile di tipo int
-- converti il valore nel carattere ascii aggiungendo 48 e lo mandi al display
quimdi riassumendo:
unsigned int valore_letto, valore_intero, valore_decimale;
valore_letto = (((int) ADRESH) << | ADRESL;
valore_intero = (int) (valore_letto * 0,00488);
write_char_LCD(valore_intero + 48);
write_char_LCD('.');
valore_decimale = (int) ((((valore_letto * 0,00488) - valore_intero) * 10);
write_char_LCD(valore_decimale + 48);
write_char_LCD('V');
penso che funzioni è da testare
Si prega Accedi o Crea un account a partecipare alla conversazione.
- permax1958
- Premium Member
Riduci
Di più
- Messaggi: 91
- Ringraziamenti ricevuti 16
8 Anni 6 Mesi fa #5
da Claudio_F
Risposta da Claudio_F al topic LTlib 4.0.1 e Conversione A/D
le linee
valore_intero = (int) (valore_letto * 0,00488);
valore_decimale = (int) ((((valore_letto * 0,00488) - valore_intero) * 10);
mi danno questo errore: error: (223) digit out of range
ho provato a sostituire il 0,00488 con 0,488/100 e la compilazione passa. ma nel debug la variabile valore_intero assume il valore 0.
Ho provato anche con valore_intero= (unsigned int)(5/1024*720); ma il risultato è sempre 0.
Andrò a rileggermi qualcosa su XC8.
valore_intero = (int) (valore_letto * 0,00488);
valore_decimale = (int) ((((valore_letto * 0,00488) - valore_intero) * 10);
mi danno questo errore: error: (223) digit out of range
ho provato a sostituire il 0,00488 con 0,488/100 e la compilazione passa. ma nel debug la variabile valore_intero assume il valore 0.
Ho provato anche con valore_intero= (unsigned int)(5/1024*720); ma il risultato è sempre 0.
Andrò a rileggermi qualcosa su XC8.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Claudio_F
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 130
- Ringraziamenti ricevuti 11
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.