Ciao a tutti,
ho un grosso problema. Nella mia scheda che monta SAMD21G18A con codice basato su Arduino Zero ritrovo che quando il micro è alimentato da una tensione inferiore a 3.3V ad esempio 3V, anche usando il riferimento interno a 1.65V o a 2.23V, ho delle letture da ADC diverse rispetto al caso di alimentazione del micro a 3.3V.
Mi spiego meglio. C'è un offset consistente tra le due misure. Sono certo di aver settato correttamente con analogReference() il riferimento interno ma sembra proprio essere lui il problema.
Cioè il riferimento è dipendente dalla tensione di alimentazione (e così non dovrebbe essere). Ad esempio su attiny414 il micro viene alimentato con una tensione variabile da 4.2 a 2.8V ma il suo riferimento interno è stabile e indipendente da questa; proprio perchè se voglio misurare la tensione di una Lipo che si scarica nel tempo e la stessa mi alimenta il micro, devo usare un riferimento costante.
Ciao Guglielmo,
no non l'ho studiato perchè non immaginavo ci fossero commenti che mi facessero arrivare subito al dunque. Però mi permetto di dire che non ha senso avere dei riferimenti interni stabili solo alla tensione di alimentazione di 3.3V, perchè il micro ha un range di tensione piuttosto esteso e devo poterlo usare nel suo range mentenendo il riferimento stabile. Ho letto il datasheet ma non ho visto come vengono derivati i vari riferimenti; ho quindi pensato che il fattore di divisione non fosse legato per forza al valore di tensione di alimentazione nominale (3.3V).
Detto ciò, siccome nel mio caso ho una tensione di alimentazione, in un caso di 3V, nell'altro di 3.3V, posso usare il riferimento interno di 1V siccome sembra (dai commenti) che non sia legato alla tensione di alimentazione? Chiedo perchè ho trovato su vari forum info discordarti al riguardo.
Ma quel software NON è scritto per un micro alimentato come ti pare ... è scritto per Arduino Zero e quindi per una scheda che va a 3.3V e quindi il software è stato sviluppato per essa.
Dici bene ... dai commenti SEMBRA che non sia legato, infatti, contrariamente a tutti gli altri casi abbiamo:
case AR_INTERNAL1V0:
ADC->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_1X_Val; // Gain Factor Selection
ADC->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INT1V_Val; // 1.0V voltage reference
break;
Ok era l'unica possibilità che non avevo provato, lo provo oggi stesso. Però il fatto che Arduino abbia scritto codice per una piattaforma che usa un micro che non è "proprietario" mi frega il giusto io sono hardwarista, quindi sono di larghe vedute e per le cose fatte a modo, non castrate
Grazie del consiglio Guglielmo.
Comunque, a mio parere, la cosa migliore sarebbe un bel chip generatore di tensione di riferimento (tipo AD584 o ARD4520 o simili) collegato al pin AREF ... così sei più che sicuro
Ah si indubbiamente. Il fatto è che ho un progetto già fatto nel quale mi sono trovato a un cambio dell'ultimo minuto. Forse nella prossima revisione lo implementerò!