- Messaggi: 1010
- Ringraziamenti ricevuti 107
Lettura tensione e corrente con pic 16F873
- Pinna
-
Autore della discussione
- Moderatore
-
Less
Di più
13 Anni 1 Mese fa - 13 Anni 1 Mese fa #1
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Lettura tensione e corrente con pic 16F873 è stato creato da Pinna
Ciao a tutti. Apro questo post per un problema che ho riscontrato dopo avere costruito un piccolo alimentatore con LM7805 e LM317 (range di lavoro 1,25 - 15V 2A max). A bordo utilizzo un pic16F873, compatibile con un 16F876, per leggere contemporaneamente la tensione erogata dall'alimentatore e la corrente assorbita da un carico ad esso collegato. Tutto questo sfruttando i primi due ingressi analogici del pic, ovvero AN0 e AN1. I dati sono visualizzati con un display lcd. (Grazie ancora a Giovanni per le preziose lezioni del suo corso,, il merito è praticamente suo). Inoltre c'è un partitore che mi riduce di tre volte la tensione massima erogata, portandola a 5V. La regolazione della stessa avviene tramite potenziometro multigiri.
Premesso che:
1) i valori adc in assoluto in uscita dal convertitore sono lineari al 100% (linearità verificata mettendo in grafico i valori adc in correlazione ai volts letti con il tester ( R*R=1 )
2) questa verifica è stata effettuata molte volte allo scopo di verificarne la ripetibilità
Succede che la tensione letta dal pic segue perfettamente quella del tester fino a certi valori, poi da i "numeri" e poi torna normale. Mi spiego meglio: ogni volta che il pic deve leggere una tensione DECIMALE che parte da 0,66 al successivo 0,10 da i cosidetti numeri poi legge esattamente quello che legge anche il tester. Un esempio chiarirà meglio:
da 9,11V a 9,65 OK
da 9,66 a 10,10 SBAGLIA
da 10,11 a 10,65 OK
da 10,66 a 11,10 SBAGLIA .... e così via per tutto il range di lavoro
E' chiaro che non è il pic che da i numeri, non è il valore adc che mi fa i dispetti e neanche il display lcd che vuole farmi impazzire (se già non lo sono).
Usando un altro programma che legge solo la tensione, utilizzando interrupt e media di letture, questo range di "errore" si è ridotto parecchio (l'escursione va da 0,01 a 0,10) e mi ha fatto capire (almeno credo) l'errore che avviene. Questa è la routine di calcolo utilizzata, tensione e corrente sono variabili unsigned long:
Quei numeroni, ad esempio la tensione, sono scritti così per evitare di ricorrere a variabili tipo float e 1466 non è altro che il minimo valore adc rilevabile rapportato ai 15 volt (0.004888*3), moltiplicato per 100000 allo scopo di eliminare le virgole e lavorare più comodamente.
Con il secondo programma (quello che riduce notevolmente l'errore) ho notato che al decimale che inizia con zero, ad esempio 12,03 dove il decimale è 03, viene soppresso lo zero per cui viene visualizzato 12,3. Se imposto 12.07V sul display compare 12,7 e così via. Invece con il primo non riesco a delineare bene queste variazioni. In ogni caso l'errore è nel programma ed esattamente in quei calcoli.
Poichè ormai l'odore del mio cervello in fumo sarà arrivato anche a voi, prima che bruci del tutto, c'è qualcuno che ha gentilmente qualche suggerimento da darmi?
Grazie
edit: non so come sono apparse quelle emoticon
Premesso che:
1) i valori adc in assoluto in uscita dal convertitore sono lineari al 100% (linearità verificata mettendo in grafico i valori adc in correlazione ai volts letti con il tester ( R*R=1 )
2) questa verifica è stata effettuata molte volte allo scopo di verificarne la ripetibilità
Succede che la tensione letta dal pic segue perfettamente quella del tester fino a certi valori, poi da i "numeri" e poi torna normale. Mi spiego meglio: ogni volta che il pic deve leggere una tensione DECIMALE che parte da 0,66 al successivo 0,10 da i cosidetti numeri poi legge esattamente quello che legge anche il tester. Un esempio chiarirà meglio:
da 9,11V a 9,65 OK
da 9,66 a 10,10 SBAGLIA
da 10,11 a 10,65 OK
da 10,66 a 11,10 SBAGLIA .... e così via per tutto il range di lavoro
E' chiaro che non è il pic che da i numeri, non è il valore adc che mi fa i dispetti e neanche il display lcd che vuole farmi impazzire (se già non lo sono).
Usando un altro programma che legge solo la tensione, utilizzando interrupt e media di letture, questo range di "errore" si è ridotto parecchio (l'escursione va da 0,01 a 0,10) e mi ha fatto capire (almeno credo) l'errore che avviene. Questa è la routine di calcolo utilizzata, tensione e corrente sono variabili unsigned long:
Code:
LCD_GOTO(1,8);
LCD_PUTUN(tensione*1466/100000); // parte intera
LCD_PUTS(".");
LCD_PUTUN(tensione*1466%100000); // parte decimale
LCD_GOTO(1,13);
LCD_PUTS(" ");
LCD_GOTO(2,8);
LCD_PUTUN(corrente*489/47);
LCD_GOTO(2,13);
LCD_PUTS(" ");
Quei numeroni, ad esempio la tensione, sono scritti così per evitare di ricorrere a variabili tipo float e 1466 non è altro che il minimo valore adc rilevabile rapportato ai 15 volt (0.004888*3), moltiplicato per 100000 allo scopo di eliminare le virgole e lavorare più comodamente.
Con il secondo programma (quello che riduce notevolmente l'errore) ho notato che al decimale che inizia con zero, ad esempio 12,03 dove il decimale è 03, viene soppresso lo zero per cui viene visualizzato 12,3. Se imposto 12.07V sul display compare 12,7 e così via. Invece con il primo non riesco a delineare bene queste variazioni. In ogni caso l'errore è nel programma ed esattamente in quei calcoli.
Poichè ormai l'odore del mio cervello in fumo sarà arrivato anche a voi, prima che bruci del tutto, c'è qualcuno che ha gentilmente qualche suggerimento da darmi?
Grazie
edit: non so come sono apparse quelle emoticon
Chi vola vale, chi vale vola, chi non vola è un vile
Ultima Modifica 13 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Pinna
-
Autore della discussione
- Moderatore
-
Less
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
13 Anni 1 Mese fa #2
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: Lettura tensione e corrente con pic 16F873
AGGIORNAMENTO: dopo una notte di riposo e cervello freddo mi è venuto in mente di verificare il mio sospetto facendo la prova più stupida che si potesse fare e cioè modificare la lettura sul display in modo da ottenere un numero intero composto da quattro cifre:
LCD_GOTO(1,
;
LCD_PUTUN(tensione*1466/1000);
Le prime due rappresentano i volts, le altre due i suoi decimali.
Ebbene, avevo ragione: in questo modo la lettura è perfetta e, devo dire, spaventosamente precisa, dato che la differenza massima tra la tensione letta dal tester e quella letta dal pic è 0,02 volts. A questo punto credo mi convenga creare un array contenente ogni cifra e poi stamparlo sul display nelle rispettive posizioni, non fosse altro perchè voglio vedere il punto separatore....
LCD_GOTO(1,

LCD_PUTUN(tensione*1466/1000);
Le prime due rappresentano i volts, le altre due i suoi decimali.
Ebbene, avevo ragione: in questo modo la lettura è perfetta e, devo dire, spaventosamente precisa, dato che la differenza massima tra la tensione letta dal tester e quella letta dal pic è 0,02 volts. A questo punto credo mi convenga creare un array contenente ogni cifra e poi stamparlo sul display nelle rispettive posizioni, non fosse altro perchè voglio vedere il punto separatore....
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accesso o Crea un account a partecipare alla conversazione.
13 Anni 1 Mese fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Lettura tensione e corrente con pic 16F873
Ciao Pinna,
ottimo!
Grazie per aver condiviso la soluzione del problema.
Relativamente alle emotion icon appaiono perche' nel codice ci sono parentesi graffe e punti e virgole attaccati.
scrivendo il codice tra (code) e (/code) il codice viene formattato come codice programma.
le parentesi tonde devono essere pero' sostituite con parentesi quadre.
Saluti,
Mauro
ottimo!
Grazie per aver condiviso la soluzione del problema.
Relativamente alle emotion icon appaiono perche' nel codice ci sono parentesi graffe e punti e virgole attaccati.
scrivendo il codice tra (code) e (/code) il codice viene formattato come codice programma.
le parentesi tonde devono essere pero' sostituite con parentesi quadre.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Pinna
-
Autore della discussione
- Moderatore
-
Less
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
13 Anni 1 Mese fa #4
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: Lettura tensione e corrente con pic 16F873
Ciao Mauro,
lavoro finito appena adesso: per quanto riguarda i volt ho convertito l'intero in stringa e ora legge benissimo i valori. La differenzacon il tester, come già detto, è 0,02 volt. Per quanto riguarda gli amperes c'è una leggera discrepanza tra i mV ricavati dal convertitore del pic (29 mv) e quelli letti dal teste (37 mv)r. E' possibile che a bassissimi valorii adc in assoluto (intorno a 6) il convertitore non sia lineare. Comunque, tra il vedere e non vedere, mi sono messo nelle peggiori condizioni (ho preso quindi per buono i mV del tester) e ho modificato la formula. Le letture fatte sull'assorbimento di piccoli motori e ventole, ad amperaggio noto, sembrano confortare questa mia scelta. Ne approffitto anche per ringraziare ancora una volta Giovanni, perchè il suo articolo su come leggere tre ingressi Ad e inviare i dati su uart è stato, a dir poco, provvidenziale.
lavoro finito appena adesso: per quanto riguarda i volt ho convertito l'intero in stringa e ora legge benissimo i valori. La differenzacon il tester, come già detto, è 0,02 volt. Per quanto riguarda gli amperes c'è una leggera discrepanza tra i mV ricavati dal convertitore del pic (29 mv) e quelli letti dal teste (37 mv)r. E' possibile che a bassissimi valorii adc in assoluto (intorno a 6) il convertitore non sia lineare. Comunque, tra il vedere e non vedere, mi sono messo nelle peggiori condizioni (ho preso quindi per buono i mV del tester) e ho modificato la formula. Le letture fatte sull'assorbimento di piccoli motori e ventole, ad amperaggio noto, sembrano confortare questa mia scelta. Ne approffitto anche per ringraziare ancora una volta Giovanni, perchè il suo articolo su come leggere tre ingressi Ad e inviare i dati su uart è stato, a dir poco, provvidenziale.
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accesso o Crea un account a partecipare alla conversazione.
13 Anni 1 Mese fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Lettura tensione e corrente con pic 16F873
...bene!
Problema risolto!
C'e' quasi sempre un problema quando qualcosa non funziona!
saluti,
Mauro
Problema risolto!
C'e' quasi sempre un problema quando qualcosa non funziona!

saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
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.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti