lettura tensione su analogico

Ciao a tutti, vi scrivo per chiedervi alcuni consigli sperando di aver scritto nella sezione giusta.

Sto realizzando a scopo di sperimentazione con Arduino, una scheda di controllo (lettura) di alcuni valori di un'amplificatore lineare. Mi interessa leggere, tensioni e tramutarle in dati "visual" su display.
Il range di lettura va da 0 a 12V DC. Li sto adattando, con un circuito RC o LC per "filtrare" il segnale in ingresso e regolati con trimpot da 10K per limitare il tutto a 5V.

Arrivo al dunque: ho necessità di convertire 1Volt in lettura su un pin analogico in dato visual 30Ampere; sto utilizzando la funzione map come segue:

amp_50 = map (analogRead(leggi_50i),0,800,0,1100);

ma noto nei dati i seguenti valori:
dato raw: 204
dato volt: 1.00V (ricavato da voltage_50i = (leggi_50i * (5.0 / 1023)); )
dato Amp: 29.0 (ricavato dalla funzione map sopra indicata).

A parte questa anomalia nella lettura ed elaborazione dei dati, c'è un altro metodo più semplice per la visualizzazione del dato?
Inoltre, il dato raw non dovrebbe essere che, a 200 corrisponde 1 volt ??

Spero di essermi spiegato. Allego sketch..

#include <Wire.h>
#include <math.h>
#include <PCF8574_HD44780_I2C.h>
PCF8574_HD44780_I2C lcd(0x3f,20,4);

#define ingresso_50i   A2

long leggi_50i = 0;
float voltage_50i = 0;
unsigned long leggi_50i_p = 0;
int amp_50 = 0;

void setup() {

  Serial.begin(9600);            // debug seriale
  Serial.println("Ho fatto il setup");


/* INIZIALIZZO E ACCENDO IL DISPLAY */

  lcd.init ();
  lcd.backlight ();

  inizializzaDisplay();

}

void inizializzaDisplay() {
  
  lcd.setCursor(0,0);
  lcd.print( "Grezzo:");
  lcd.setCursor(0,1);
  lcd.print("Volt:");
  lcd.setCursor(0,2);
  lcd.print("Amp:");
}

void loop() {
  
/////// INGRESSO AMPERE PIN A2 ///////

leggi_50i = analogRead(ingresso_50i);      //lettura dato raw
voltage_50i = (leggi_50i * (5.0 / 1023));  //converti dato raw in voltaggio

Serial.println("FWD Grezzo:");
Serial.println(leggi_50i);
Serial.println("FWD VOLT:");
Serial.println(voltage_50i);
Serial.println("--------------------------");


   lcd.setCursor (8, 0);
   lcd.print (leggi_50i);
   lcd.print ("      ");
   lcd.setCursor (7, 1);
   lcd.print ((voltage_50i));
   lcd.print ("       ");
   lcd.setCursor (6, 2);

amp_50 = map (analogRead(leggi_50i),0,800,0,1100);  

       
            lcd.print((amp_50/10), DEC);
            lcd.print(".");
            lcd.print((amp_50)%10, DEC); 
            lcd.print ("         ");
 

delay (250);
   
}           /////////////////// FINE LOOP /////////////////////

204

facendo la proporzione

204: 1024 = x :5V x=0,99609 quindi direi si, 1 volt

205: 1024 = x :5 x= 1,00097 appena più preciso

sempre che la tensione di riferimento sia ESATTAMENTE 5V

Patrick_M:
sempre che la tensione di riferimento sia ESATTAMENTE 5V

... cosa che, ovviamente, NON è mai :wink:

Guglielmo

Grazie per le risposte!

Ho fatto anche io questo calcolo. Ma non mi riesco a spiegare se è una cosa normale. La tensione dei 5V è quella stessa di arduino e passa per un trimmer resistivo da 10K.
Facendo prove, ho dovuto portare nel calcolo il valore 1023 a 1010 in maniera che 1V corrispondesse a 200...
E' normale questa cosa?

Inoltre, come posso diminuire le continue variazioni di valore che visualizzo nonostante la tensione è stabile ??
Mi spiego: prelevo 1volt che in teoria corrisponde al dato raw 200; viene letto e visualizzato sul display; tramite calcolo con la funzione "map" devo visualizzare il valore di interesse, come detto prima 1V = 30A.
I valori "raw" e "volt" sono stabili, mentre il valore "ampere" varia di continuo...

Grazie.

scusa ma da dove arriva il 30A

con questa map

amp_50 = map (analogRead(leggi_50i),0,800,0,1100)

1V su 5V totali corrisponde ad 1/5 di 800 cioè 160

questa è la corrispondenza dei valori...

400 = 550
200 = 275
....
160 = 220 <--------- valore per 1V
....
100 = 137,5
50 = 68,75
25 = 34,375

occhio che map lavora SOLO con numeri interi
e tu usi dei long degli unsigned long e dei float

angelozzo:
... La tensione dei 5V è quella stessa di arduino ...

Ci si riferiva alla tensione di "riferimento" dell'ADC interno ... cioe' quella che applichi all'ingresso AREF per dire al micro qual'e' il riferimento con cui deve confrontare la tensione letta ... se NON usi un'AREF esterno, il micro internamente prende la tensione di alimentazione come riferimento, ma questa non e' mai un riferimento realmente stabile, perche' l'alimentazione puo fluttuare anche di parecchi millivolt, e questo puo bastare perche' il micro dia letture sbagliate ...

In genere, quando e' necessaria una certa precisione, e' sempre meglio usare un riferimento esterno (basta un comune TL431A ben filtrato), magari scegliendo una tensione piu bassa di quella di alimentazione, tipo 3 o 4 V, e calcolarsi i partitori dell'ingresso in modo che diano il risultato voluto ... :wink: