- Messaggi: 583
- Ringraziamenti ricevuti 1
Lettura tensione batteria con modulo ADC
9 Anni 4 Mesi fa #1
da Guido
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Lettura tensione batteria con modulo ADC è stato creato da Guido
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
9 Anni 4 Mesi fa #2
da Guido
Risposta da Guido al topic Lettura tensione batteria con modulo ADC
Rettifico il trimmer serve, per provare che il progetto funzioni.
Lo includo.
Lo includo.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
9 Anni 4 Mesi fa - 9 Anni 4 Mesi fa #3
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Lettura tensione batteria con modulo ADC
Ciao Guido, prima di tutto devi considerare che l'adc del 18F4550 ha una risoluzione di 2 ^ 10 = 1023 bits. Questo significa che ogni bit corrisponderà a 5/1023 = 0.00488759 v = 4.88759 mv. Una volta che hai ottenuto la media della sommatoria sarà facile calcolare a quanti volt corrisponde... per esempio, se la tua sommatoria e uguale a 900 (valore assoluto della sommatoria) i volt corrispondenti saranno uguali a (900 x 5) /1023 = 4.4 V. Però (c'è un però) poichè l'esempio che hai preso in considerazione prevede l'accensione dei led della PORTD, Mauro ha volutamente troncato la parte della conversione totale prendendo solo quella di interesse. Per cui, innanzitutto, devi modificare il sorgente in modo da ottenere il risultato completo:
// Imposto i tempi di conversione e giustificazione a destra
// TAD : FOSC/16
// TACQ: 16 TAD
// Giustificazione destra
ADCON2 = 0b10110101;
// Attendo la fine della conversione
while(ADCON0bits.GO);
// Prelevo il valore della conversione
lettura = (((unsigned int) ADRESH) << | ADRESL;
// Sommatoria delle letture fatte
sommatoria = sommatoria + lettura;
}
// Calcolo del valore medio
sommatoria = sommatoria / NUMERO_CAMPIONI;
// Visualizzo la lettura
//LATD = (unsigned char) (sommatoria); riga commentata
A questo punto: (sommatoria x 5/1023) = volt (ricordati di dichiarare volt come variabile)
Se vuoi evitare questo calcolo puoi fare anche così: ti calcoli il valore della sommatoria corrisponde ai volt di interesse
5 volt = 1023
4 volt = 818 (4 x 1023)/5 = valore sommatoria corrispondente a 4 volt
3 volt = 614
inserisci dei cicli if come, per esempio, questo:
if ((sommatoria == 818) || (sommatoria < 818)) {
LATDbits.LATD0 = 1) // se i volt sono uguali o inferiori a 4V si accende il primo led a destra della freedom
}
Spero di non avere detto corbellerie, è un periodo in cui ho la mente abbastanza confusa...
Facci sapere
Marcello
edit: quando invio il trhead appare una emoticon... non considerarla!!!
// Imposto i tempi di conversione e giustificazione a destra
// TAD : FOSC/16
// TACQ: 16 TAD
// Giustificazione destra
ADCON2 = 0b10110101;
// Attendo la fine della conversione
while(ADCON0bits.GO);
// Prelevo il valore della conversione
lettura = (((unsigned int) ADRESH) << | ADRESL;
// Sommatoria delle letture fatte
sommatoria = sommatoria + lettura;
}
// Calcolo del valore medio
sommatoria = sommatoria / NUMERO_CAMPIONI;
// Visualizzo la lettura
//LATD = (unsigned char) (sommatoria); riga commentata
A questo punto: (sommatoria x 5/1023) = volt (ricordati di dichiarare volt come variabile)
Se vuoi evitare questo calcolo puoi fare anche così: ti calcoli il valore della sommatoria corrisponde ai volt di interesse
5 volt = 1023
4 volt = 818 (4 x 1023)/5 = valore sommatoria corrispondente a 4 volt
3 volt = 614
inserisci dei cicli if come, per esempio, questo:
if ((sommatoria == 818) || (sommatoria < 818)) {
LATDbits.LATD0 = 1) // se i volt sono uguali o inferiori a 4V si accende il primo led a destra della freedom
}
Spero di non avere detto corbellerie, è un periodo in cui ho la mente abbastanza confusa...
Facci sapere
Marcello
edit: quando invio il trhead appare una emoticon... non considerarla!!!
Chi vola vale, chi vale vola, chi non vola è un vile
Ultima Modifica 9 Anni 4 Mesi fa da Pinna.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
9 Anni 4 Mesi fa #4
da Guido
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da Guido al topic Lettura tensione batteria con modulo ADC
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
9 Anni 4 Mesi fa #5
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Lettura tensione batteria con modulo ADC
Ciao Guido,
ho dato una piccola occhiata al codice ma qualcosa non mi convince... i miei if erano degli esempi però mi sono accorto che così ti ho fuorviato (leggi idiozia da parte mia). Infatti:
if ((sommatoria == 1023) || (sommatoria < 1023)){
LATDbits.LATD0 = 1; // Se i volt sono uguali a 5V si accende il led RD0
Con questo tu avresti sempre il led RD0 acceso, anche con 3 o 4 volt. Questo perchè la condizione if dice uguale o INFERIORE a 5V. In realtà la condizione deve prevedere un valore compreso da 4 a 5V, da 3 a 4 V ed inferiore a 3V
Modifica il sorgente in questo modo:
if (sommatoria > 818) { // se i volt sono superiori a 4V (819 corrisponderebbe a 4.004V)
LATDbits.LATD0 = 1; // si accende il led RD0
}
else {
LATDbits.LATD0 = 0; // Spengo il led
}
if ((sommatoria > 614) && (sommatoria < 818)){
LATDbits.LATD1 = 1; // Se i volt sono compresi tra 3 e 4V si accende il led RD1
}
else {
LATDbits.LATD1 = 0; // Spengo il led
}
if (sommatoria < 614){
LATDbits.LATD2 = 1; // Se i volt sono uguali o inferiori a 3V si accende il led RD2
}
else {
LATDbits.LATD2 = 0; // Spengo il led
}
Così è più corretto e dovrebbe andare...
fammi sapere
Marcello
ho dato una piccola occhiata al codice ma qualcosa non mi convince... i miei if erano degli esempi però mi sono accorto che così ti ho fuorviato (leggi idiozia da parte mia). Infatti:
if ((sommatoria == 1023) || (sommatoria < 1023)){
LATDbits.LATD0 = 1; // Se i volt sono uguali a 5V si accende il led RD0
Con questo tu avresti sempre il led RD0 acceso, anche con 3 o 4 volt. Questo perchè la condizione if dice uguale o INFERIORE a 5V. In realtà la condizione deve prevedere un valore compreso da 4 a 5V, da 3 a 4 V ed inferiore a 3V
Modifica il sorgente in questo modo:
if (sommatoria > 818) { // se i volt sono superiori a 4V (819 corrisponderebbe a 4.004V)
LATDbits.LATD0 = 1; // si accende il led RD0
}
else {
LATDbits.LATD0 = 0; // Spengo il led
}
if ((sommatoria > 614) && (sommatoria < 818)){
LATDbits.LATD1 = 1; // Se i volt sono compresi tra 3 e 4V si accende il led RD1
}
else {
LATDbits.LATD1 = 0; // Spengo il led
}
if (sommatoria < 614){
LATDbits.LATD2 = 1; // Se i volt sono uguali o inferiori a 3V si accende il led RD2
}
else {
LATDbits.LATD2 = 0; // Spengo il led
}
Così è più corretto e dovrebbe andare...
fammi sapere
Marcello
Chi vola vale, chi vale vola, chi non vola è un vile
Ringraziano per il messaggio: Guido
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
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.
Login
© LaurTec 2006 - 2024