Go Down

Topic: Problema con analogRead (Read 2 times) previous topic - next topic

d407336

#5
Dec 13, 2012, 08:44 pm Last Edit: Dec 13, 2012, 08:51 pm by d407336 Reason: 1
Allora, ecco quello che ho scoperto:

Code: [Select]
#include "LiquidCrystal.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2);
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(analogRead(A0));
  lcd.setCursor(8, 0);
  lcd.print(analogRead(A2));
  lcd.setCursor(0, 1);
  lcd.print(analogRead(A1));
  lcd.setCursor(8, 1);
  lcd.print(analogRead(A3));
 
  delay(500);
}


Con questo codice stampo sull'lcd quello che leggo dai pin analogici 0, 1, 2 e 3.
Quello che c'è collegato ai pin A0 e A1 lo lascio fisso, mentre faccio variare quello collegato ai pin A2 e A3:

  • se alzo A3 cambia anche il valore di A0

  • se alzo A2 cambia anche il valore di A1


Quando alzo A2 o A3 vedo correttamente i valori di A2 e A3 (almeno sembra che salgano correttamente), mentre gli altri valori si alzano di un po' ma non in modo stabile, rimangono sempre più alti del normale ma un po' salgono e un po' scendono.


Se invece faccio:
Code: [Select]
#include "LiquidCrystal.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2);
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  analogRead(A0);
  lcd.print(analogRead(A0));
  lcd.setCursor(8, 0);
  lcd.print(analogRead(A2));
  lcd.setCursor(0, 1);
  analogRead(A1);
  lcd.print(analogRead(A1));
  lcd.setCursor(8, 1);
  lcd.print(analogRead(A3));
 
  delay(500);
}

funziona tutto correttamente.
Anche se non metto analogRead() a vuoto per i pin A2 e A3 funziona, forse perchè A0 e A1 rimangono sempre uguali?

Se invece degli analogRead() a vuoto metto un delay(10) i valori diventano instabili come all'inizio.

p.s. non ho collegato più nessun interruttore.

p.p.s.

La prima volta che si usa l'ADC è bene fare una lettura a vuoto per calibrare il circuito S&H interno. Questo vale anche nel caso di ADC spento per motivi di sleep o altro.

Intendi una lettura a vuoto all'inizio di tutto e poi basta o ogni volta prima di leggere da un pin analogico?
Perchè se metto una lettura a vuoto in setup() non funziona l'lcd.
edit: forse non si era resettato bene l'lcd ;) ho riprovato e funziona ma i valori sono instabili come all'inizio.

cyberhs

Non vedo nel setup l'assegnazione degli ingressi analogici.

Se non lo fai, è normale che tu debba effettuare una "lettura a vuoto", poiché con essa Arduino capisce che quell'ingresso è di input.

leo72


Non vedo nel setup l'assegnazione degli ingressi analogici.

Se non lo fai, è normale che tu debba effettuare una "lettura a vuoto", poiché con essa Arduino capisce che quell'ingresso è di input.

Se si usano i pin analogici come ingressi appunto analogici, non è necessario dichiarare i pin come input usando pinMode dato che questo controlla l'ingresso digitale del pin e non l'ADC, che viene agganciato al pin in oggetto dalla funzione analogRead.

leo72

@d407376:
esiste una modalità di lettura, descritta nel datasheet, detta "Free Running Mode", in cui si possono eseguire più letture una dietro l'altra. Se però in questa modalità si cambia canale (cioè pin letto), la prima lettura dopo il cambio di canale rispecchierà il canale precedente e solo quella successiva sarà riferita al nuovo canale.
Ora, analizzando l'analogRead dell'Arduino mi pare che sia impostata proprio questa modalità per cui il problema riscontrato potrebbe essere dato da questo. Quindi la lettura a vuoto per ricalibrare l'ADC è necessaria affinché esso cambi canale correttamente.

d407336

pinMode per i pin analogici sò che non va usato, come ha detto leo.


@d407376:
esiste una modalità di lettura, descritta nel datasheet, detta "Free Running Mode", in cui si possono eseguire più letture una dietro l'altra. Se però in questa modalità si cambia canale (cioè pin letto), la prima lettura dopo il cambio di canale rispecchierà il canale precedente e solo quella successiva sarà riferita al nuovo canale.
Ora, analizzando l'analogRead dell'Arduino mi pare che sia impostata proprio questa modalità per cui il problema riscontrato potrebbe essere dato da questo. Quindi la lettura a vuoto per ricalibrare l'ADC è necessaria affinché esso cambi canale correttamente.

Grazie, ho capito il perchè ;)
Mettendo un analogRead() a vuoto prima non è un grand problema, ma se si volesse mettere non in free running sarebbe possibile?
Questa modalità riguarda proprio l'altmega o come è scritta la funzione?

Go Up