Go Down

Topic: analogRead mi da sempre 0 (Read 261 times) previous topic - next topic

VittoM

Salve a tutti,
Ho un  problema con analogRead, in pratica devo misurare la caduta di tensione su una resisteza con analogRead, ma qualsiasi pin analogico usi, o qualsiasi resistenza il risultato mi da sempre 0, quale può essere il problema?

gpb01

Facci vedere il collegamento che fai (anche uno schemino desegnato su un pezzo di carta e fotografato) ...
... e metti il codice di prova che stai usando (...mi raccomando, in conformità al regolamento, punto 7, il codice va racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo
Search is Your friend ... or I am Your enemy !

VittoM

Il circuito è semplicissimo poiché lo sto provando, utilizzo un arduino nano con uno shield, collego un cavo ai 5V e alla resistenza, poi l'altro capo della resistenza ad A0.
Code: [Select]

void setup() {
  Serial.begin(9600);

}

void loop() {
  Serial.println(analogRead(A0));
  delay(2000);
 
}

Quando stampo e non ho il cavo collegato ad A0 mi da dei valori casuali, quando collego il cavo ad A0 mi da sempre 0

gpb01

#3
Dec 11, 2018, 05:29 pm Last Edit: Dec 11, 2018, 05:38 pm by gpb01
Mi sa che ti devi andare a ristudiare la "legge di Ohm" perché ... in quel modo NON hai alcuna caduta di tensione (misurabile) ... ::)

Se vuoi misurare qualche cosa DEVI fare un partitore di tensione, ovvero DUE resistenze in serie e misurare la caduta di tensione al centro tra le due.

Guglielmo

P.S.: Quando non colleghi nulla è normale che hai dei valori casuali ... i pin in ingresso ad Arduino sono ad altissima impedenza e, se lasciati non collegati, captano qualsiasi disturbo ... 
Search is Your friend ... or I am Your enemy !

VittoM

Ho provato anche in questo modo, con questo codice:
Code: [Select]

int Vd0;
float V0;
float R0;
const int R=330000;
const int V=5;

void setup() {
Serial.begin(9600);

}

void loop() {
 
  Vd0=analogRead(A0);


  V0=Vd0*V/1023;


  R0=Vd0*R/(V-V0);

  Serial.println(Vd0);
  Serial.println(V0);
  Serial.println(R0);
  delay(1000);
}

Collego il verde ai 5V e il rosso a GND e il marrone in alto ad A0, ma in uscita mi da comunque sempre 0

gpb01

Allora:

1. comincia con due resistenze di uguale valore (così la caduta è 2.5V) e la cui somma NON superi i 10/15 KΩ

2. Fai un banalissimo prgramma senza alcun calcolo che legge il pin analogico e stampa il valore direttamente

Guglielmo

Search is Your friend ... or I am Your enemy !

VittoM

Ho provato ma comunque mi stampa sempre 0, potrei aver bruciato i componenti durante la saldatura?

gpb01

Bruciare le resistenze ? ? ? :o :o :o ... quasi impossibile ;)

Verifica di aver effettuato esattamente il collegamento come ti ho disegnato;  se hai messo le due resistenze uguali, senza collegarle all'alimentazione, misura con un multimentro (o con un tester) la resistenza agli estermi (dovresti leggere un valore pari alla somma delle due resistenze).  Collega gli estremi all'alimentazione e con il mmultimetro (o con il tester) misura la tesnione tra GND ed il punto di collegamento delle due resistenze (dovresti leggere, con due resistenze uguali, circa 2.5V).

Fatte tutte queste verifiche, puoi pasare al collegamento con Arduino ...

Guglielmo
Search is Your friend ... or I am Your enemy !

VittoM

Ho rifatto il collegamento e adesso funziona, ho solo un altro problema adesso riguardo il calcolo della resistenza, i valori di tensione in uscita sono giusti ma il calcolo della resistenza è sbagliato, ho usato questo codice:
Code: [Select]

  int Vd;
  float V;
  float R;
void setup() {
  Serial.begin(9600);

}

void loop() {
  Vd=analogRead(A0);
  V=Vd*5/1023;
  R=Vd*1500/(5-V);
  Serial.println(Vd);
  Serial.println(V);
  Serial.println(R);
  delay(2000);

}

gpb01

#9
Dec 12, 2018, 11:07 am Last Edit: Dec 12, 2018, 11:08 am by gpb01
... potresti scrivermi la "formula" (basata sulla legge di Ohm) con cui pensi di calcolare il valore di Rx ? Che valori di resistenze stai usando nel partitore?

Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

#10
Dec 12, 2018, 01:43 pm Last Edit: Dec 12, 2018, 01:44 pm by docdoc
In sostanza, hai impostato il partitore resistivo con una resistenza R1 fissa verso Vcc, e quella da misurare verso GND, esatto?

Tu con "V=Vd*5/1023;" praticamente vuoi mappare i valori da 0 a 1023 per trasformarli in Volt.

Intanto essendo la variabile Vd una "int" tutto il calcolo ti diventa intero (il fatto che vada a finire in una float è irrilievante), devi fare ad esempio questo per "far capire" che vuoi un calcolo float:

V=Vd*5.0/1023;

Poi però la seconda parte è sbagliata, ossia nel calcolo della resistenza non devi più usare Vd ma V (il valore 1500 suppongo sia della seconda resistenza R2).

Poiché tensione misurata è:

V = Vcc*R2/(R1+R2)

avrai:

R2 = R1*V/(Vcc-V)

Quindi se ho R1=1500 (sicuro?) e Vcc=5, se correggi la seconda espressione mettendo V al posto di Vd dovresti avere i valori corretti.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Standardoil

Ho rifatto il collegamento e adesso funziona, ho solo un altro problema adesso riguardo il calcolo della resistenza, i valori di tensione in uscita sono giusti ma il calcolo della resistenza è sbagliato, ho usato questo codice
ma scusa, non hai studiato telecomunicazioni e non sei molto ferrato in elettronica, sopratutto la parte hardware?
Oppure ho letto male la tua presentazione?
Prima legge di Nelson (che sono io): Fai le stesse cose sempre alla stessa maniera: quegli errori li hai già corretti

VittoM

Ho risolto limitandomi al calcolo della tensione sulla resistenza, calcolando su un foglio quale dovrebbe essere e eliminando dal codice la parte di calcolo della resistenza. Per docdoc, hai ragione, la resistenza che usato non era da 1500 ma da 1000, ho sbagliato a scrivere, sostituendo come mi hai detto tu comunque i risultati sono giusti.
Grazie a tutti per i consigli :)

Go Up