Chiarimenti DAC e map con Arduino due

Ciao, sto cercando di fare funzionare lo skatch allegato, il quale dovrà fungere da pluviometro e restituire una misura in tensione. Vorrei mappare un uscita DAC per avere un segnale 0-3.3V in relazione al valore ora 0-40.

Alla partenza dello skatch in uscita mi trovo già 0,54V nonostante setta a zero il DAC0.

al valore ora di 40 il valore in uscita non è 3,3V ma bensi torna a 0,5.

Di seguito copia dello skatch

float ora = 0.0; // conteggio millimetri di pioggia

// ---------------------------------------------------
// setup
//----------------------------------------------------

void setup()
{
 pinMode(DAC0, OUTPUT);

analogWrite(DAC0, 0);
  
  


  Serial.begin(19200);

}
void loop()
{

attachInterrupt(2, Basculata, CHANGE); // modo da LOW ad 

delay(1000);
}

//--------------------------------------------------
// funzione interrupt
//--------------------------------------------------

void Basculata()
{
 // detachInterrupt(2);

  ora = ora + 2; // sommatoria millimetri pioggia


analogWriteResolution(12);
  float h2O_ora=map(ora, 0, 40, 0, 4096);
  analogWrite(DAC0, h2O_ora);
  Serial.println(ora);


}

Avete suggerimenti

Grazie

Ciao

Basta leggere il data sheet del SAM3x per scoprire che il DAC lavora con un range compreso tra (1/6) x VADVREF e (5/6) x VADVREF, ovvero tra 0.55V e 2.75V sulla DUE.

Banalità, ma qui:

analogWrite(DAC0, 0);

 


  Serial.begin(19200);

a che caspita servono ben 4 righe vuote (senza commenti) ??

davrigo:
Ciao, sto cercando di fare funzionare lo skatch allegato, il quale dovrà fungere da pluviometro e restituire una misura in tensione. Vorrei mappare un uscita DAC per avere un segnale 0-3.3V in relazione al valore ora 0-40.

Alla partenza dello skatch in uscita mi trovo già 0,54V nonostante setta a zero il DAC0.

al valore ora di 40 il valore in uscita non è 3,3V ma bensi torna a 0,5.

Di seguito copia dello skatch

float ora = 0.0; // conteggio millimetri di pioggia

// ---------------------------------------------------
// setup
//----------------------------------------------------

void setup()
{
pinMode(DAC0, OUTPUT);

analogWrite(DAC0, 0);

Serial.begin(19200);

}
void loop()
{

attachInterrupt(2, Basculata, CHANGE); // modo da LOW ad

delay(1000);
}

//--------------------------------------------------
// funzione interrupt
//--------------------------------------------------

void Basculata()
{
// detachInterrupt(2);

ora = ora + 2; // sommatoria millimetri pioggia

analogWriteResolution(12);
 float h2O_ora=map(ora, 0, 40, 0, 4096);
 analogWrite(DAC0, h2O_ora);
 Serial.println(ora);

}




Avete suggerimenti

Grazie

Ciao

See my post "How to modify analog output range of Arduino Due"
http://ardupiclab.blogspot.it/
void Basculata()
{
 // detachInterrupt(2);

  ora = ora + 2; // sommatoria millimetri pioggia


  analogWriteResolution(12);
  float h2O_ora=map(ora, 0, 40, 0, 4096); // <- OVERFLOW 
  analogWrite(DAC0, h2O_ora);
  Serial.println(ora);


}

sostituisci 4096 con 4095 …

La funzione map funziona solo con interi e restituisce un intero.

Non è bene utilizzarla con un float poiché non avrai mai, ad esempio, il valore 4.5.

Per lo stesso motivo non è bene utilizzare il float con analogWrite che richiede, invece, un intero tra 0 e 255.