Amperometro con Sensore ACS758

Sto cercando inutilmente di rilevare il giusto valore di corrente con il sensore allegro ACS758.
Mi manda al diplay valori caso che fluttuano.
Ho letto che tale sensore funziona in modo bidirezionale,in condizioni di riposo con il multimetro leggo 2,27V se faccio scorrere la corrente per accendere una lampada leggo 2,32V,quindi ne deduco che il sensore funziona correttamente.
Il problema è indubbiamente sul lato software. =(
Chi mi da una mano ???

Il sensore ACS758 esiste in diverse versioni con range di misura diverse (+50 a +200A e da +/-50 a +/-200A)

Presumo che hai un modello per alternata e misuri una corrente alternata.
Il valore che leggi dipende dal momento di lettura durante la sinusoidale. Devi fare una media e sottrarre l' offset.

Se le mie supposizioni sono sbaglaite descrivi meglio che sensore hai e che corrente misuri.

la differenza tra 2,27V e 2,32V sono 50mV percui malappena 10 ADC (con un riferimento di 5V). C'é una certo errore di misura che fa variare leggermente il valore letto.

Ciao Uwe

Ecco il sensore che utilizzo:

Vorrei impiegarlo per misurare corrente continua proveniente da batterie ad alto amperaggio.
Grazie.

Dal datasheet nella pagina di RS (http://docs-europe.electrocomponents.com/webdocs/0d88/0900766b80d885f6.pdf) il sensore a 0 Ampere rende Vcc/2, quindi circa 2,5V,.
Se è superiore la corrente va in un verso se inferiore va nell'altro, a te serve la differenza con valore a 0 Ampere.
Nella prima pagina del datasheet c'è anche lo schema di collegamento e i valori di Rf e Cf sono indicati nella tabella a pagina 5.

Il circuito adesso è OK.
Adesso avrei bisogno di qualche riga di codice. ]:slight_smile:
Come faccio a settare il valore zero a 2,5V nell'ingresso analogico?

Rumberopie:
Il circuito adesso è OK.
Adesso avrei bisogno di qualche riga di codice. ]:slight_smile:
Come faccio a settare il valore zero a 2,5V nell'ingresso analogico?

Con analogread tu leggi un valore compreso tra 0 e 1023. Se lo moltiplichi per 5 e dividi per 1024 ottieni il valore di tensione. A questo sottrai 2,5 e ottieni la tensione riferita allo zero.
Moltiplichi questo valore per mille per ottenere i milliVolt e lo divisi per 20 per ottenere gli Ampere. (dal datasheet la sensibilità del sensore è 20mV/A)
Sono col tabelt è non ho a disposizione l'IDE per scrivere e convalidare il codice. Comunque in giro qualche cosa dovresti trovarla. (cerca esempi sulle misure di temperatura, il procedimento è simile)

PaoloP:
Dal datasheet nella pagina di RS (http://docs-europe.electrocomponents.com/webdocs/0d88/0900766b80d885f6.pdf) il sensore a 0 Ampere rende Vcc/2, quindi circa 2,5V,.
Se è superiore la corrente va in un verso se inferiore va nell'altro, a te serve la differenza con valore a 0 Ampere.
Nella prima pagina del datasheet c'è anche lo schema di collegamento e i valori di Rf e Cf sono indicati nella tabella a pagina 5.

La versione unipolare cha ha Rumberopie é il ACS758ECB-200U-PFF-T; 200 A unipolare. Per quello vale:
VIOUT(QUNI) Unidirectional variant, IP = 0 A, TA = 25°C, VIOUT(QUNI) is ratiometric to VCC: Typ. 0.6 V

Percui a 0A dovrebbe dare 0,6V in uscita.

Ciao Uwe

Seguendo l'esempio riportato qui (http://arduino.cc/forum/index.php/topic,103399.0.html) applicabile cambiando poche cose, il codice dovrebbe essere qualcosa del genere:

  // let's get measurin'
sensor = analogRead(analogpin);
millivoltage = (sensor*5*1000)/1024; // convert raw sensor value to millivolts
millivoltage = millivoltage-600;        // remove voltage offset (0,6V)
ampere = millivoltage/20;         // convert millivolts to Ampere

oppure tutto su una riga

float ampere = ((float)((analogRead(analogpin)*5000)/1024.0)-600)/20

riducendo

float ampere = (float)(analogRead(analogpin)/0.24414)-30

Grazie PaoloP,domani mi fiondo a provarlo. Vi faccio sapere!

Mi cospargo il capo di cenere!Ho sbagliato a postare il link.
Il sensore che sto usando può misurare 200A bidirezionali.
il link corretto:

Rumberopie:
Mi cospargo il capo di cenere!Ho sbagliato a postare il link.
Il sensore che sto usando può misurare 200A bidirezionali.
il link corretto:
http://it.rs-online.com/web/p/sensori-effetto-hall/6807551/?searchTerm=680-7551&relevancy-data=636F3D3126696E3D4931384E525353746F636B4E756D6265724D504E266C753D656E266D6D3D6D61746368616C6C26706D3D5E5C647B337D5B5C732D2F255C2E5D5C647B332C347D2426706F3D313426736E3D592673743D52535F53544F434B5F4E554D424552267573743D3638302D373535312677633D4E4F4E4526

Bidirezionale con sensibilità di 10mV/A e zero a Vcc/2.

 // let's get measurin'
sensor = analogRead(analogpin);
millivoltage = (sensor*5*1000)/1024; // convert raw sensor value to millivolts
millivoltage = millivoltage-2500;        // remove voltage offset (2,5V)
ampere = millivoltage/10;         // convert millivolts to Ampere

oppure

float ampere = (float)(analogRead(analogpin)/0.48828)-250

Adesso fuonziona !!! :slight_smile:
Ho confrontato i valori che mi restituisce con quelli misurati con un amperometro digitale.
L'unico problemico consiste in una fluttuazione anche di qualche ampere nella misura.
Cosa posso fare per avere una misura più stabile?

Campioni più volte e fai la media.

Ho trasferito tutto dalla board ad un pcb e adesso le letture sono più stabili.
Ho integrato anche la lettura di tensione e con una semplice operazione adesso riesco a sapere il valore di potenza in watt.
Chiedo aiuto per implementare la funzione di memorizzazione del massimo valore di corrente raggiunto durante una scarica.
Ho provato inutilmente con il comando "max()",ma come mi confermerete è un comando di confronto fra due valori ,quindi non utile al mio scopo.
Please help me! :roll_eyes:

Non ho idea di come fare...
Please help me!

int maxLett = 0;

(...)
if (lettura>maxLett) { maxLett = lettura; }
(...)

la variabile verrà sempre aggiornata col massimo valore letto, fin dall'inizio (perché qualunque lettura sarà sempre maggiore di 0)

la variabile verrà sempre aggiornata col massimo valore letto, fin dall'inizio (perché qualunque lettura sarà sempre maggiore di 0)

Ed è interessante notare che questo è anche il meglio che un algoritmo possa fare: O(n)

ciao,
se qualcuno fosse interessato, ne parlo in questo post, abbiamo "quasi" risolto, ci sono dei problemi con il settaggio della sensitività
http://arduino.cc/forum/index.php/topic,133144.0.html

Ciao,
Mi piace molto questo sensore!
vorrei chiederti non dovrebbe esistere una differenza di lettura nel intercettare il neutro o la fase?

Grazie

llluca:
Ciao,
Mi piace molto questo sensore!
vorrei chiederti non dovrebbe esistere una differenza di lettura nel intercettare il neutro o la fase?

Grazie

No altrimenti non avrebbe senso l'utilizzo dell' interruttore differenziale, la corrente che entra dalla fase deve essere uguale a quella che esce dal neutro (una differenza anche minima corrisponde a dispersione). Questo vale se parliamo di sistema monofase, per il trifase il discorso cambia, il neutro può avere sezione 1/3 inferiore della fase quindi si deduce che che la corrente sul neutro non è la somma delle correnti sulle 3 fasi e nemmeno quella di una singola fase.

ciao