Lettura tensione e corrente con pic 16F873

  • Pinna
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
13 Anni 1 Mese fa - 13 Anni 1 Mese fa #1 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:
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
  • Moderatore
Di più
13 Anni 1 Mese fa #2 da Pinna
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,8);
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.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
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

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Pinna
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
13 Anni 1 Mese fa #4 da Pinna
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.

Chi vola vale, chi vale vola, chi non vola è un vile

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
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

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi