Spørsmål:
Arduino ADC referansespenning hvis den er batteridrevet
ryeager
2014-06-02 02:34:04 UTC
view on stackexchange narkive permalink

Jeg ønsker å muligens overvåke batteristrøm til Arduino ved hjelp av ADC. Dette er ganske rett frem og enkelt (spesielt hvis du bruker Arduino API); Men hvis batteriet driver Arduino og er uregulert eksternt, vil ikke ADC-referansespenningen stadig falle med batteriet? Med andre ord, ville ikke ADC-verdien hele tiden lest den samme verdien (maksimumsverdien) selv om batteriet faktisk ville bli redusert i spenning?

Hvis dette er tilfelle, vil det begge være ineffektivt og meningsløst å måle batterispenningen.

To svar:
Ignacio Vazquez-Abrams
2014-06-02 03:43:02 UTC
view on stackexchange narkive permalink

... vil ikke ADC-referansespenningen stadig falle med batteriet?

Ja, det er derfor du enten bruker eller måler en intern båndbremsereferanse i stedet.

Bruk analogReference () -funksjonen til å velge en referanse som er passende for kortet som er i bruk. Merk at du må bruke en spenningsdeler for å redusere batterispenningen til en verdi under den valgte referansen hvis du vil måle den.

For å måle båndgapsspenningen i stedet (ved hjelp av AV CC som referanse og arbeider "bakover") må du sette MUX [3: 0] i ADMUX til 0b1110 og deretter utføre en ADC-avlesning direkte (sett ADSC i ADCSRA og vent til den tilbakestilles, og les deretter fra ADC [H:L ]).

Som alltid, se MCU-databladet for detaljer.

God informasjon, nå tror jeg at jeg kan fortsette alene. Jeg håpet det var en slags intern referanse som kunne brukes. Som du foreslo, må jeg spenningsdeler strømspenningen under AVccref, men jeg ønsker å maksimere batterilevetiden i alle mulige aspekter, så jeg skulle bruke en stor tilsvarende motstand for deleren for å sikre at jeg har mindre enn en uA av lekker strøm. Ser du noen problemer med dette?
ADC-impedansen er bare 100Mohm. Vurder å måle den interne referansen i stedet.
FYI Jeg fant denne fantastiske bloggen etter svaret @Ignacio posted: [lenke] (http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836)
Dave X
2015-11-19 05:38:48 UTC
view on stackexchange narkive permalink

@ ryeagers lenke til http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/#comment-71836 har denne koden for å lese Arduinos batterispenning:

  long readVcc () {// Les 1.1V referanse mot AVcc // sett referansen til Vcc og målingen til den interne 1.1V referansen #if definert (__ AVR_ATmega32U4__) || definert (__ AVR_ATmega1280__) || definert (__ AVR_ATmega2560__) ADMUX = _BV (REFS0) | _BV (MUX4) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1); #elif definert (__AVR_ATtiny24__) || definert (__ AVR_ATtiny44__) || definert (__ AVR_ATtiny84__) ADMUX = _BV (MUX5) | _BV (MUX0); #elif definert (__AVR_ATtiny25__) || definert (__ AVR_ATtiny45__) || definert (__ AVR_ATtiny85__) ADMUX = _BV (MUX3) | _BV (MUX2); #else ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1); #endif forsinkelse (2); // Vent til Vref avvikler ADCSRA | = _BV (ADSC); // Start konvertering mens (bit_is_set (ADCSRA, ADSC)); // måling av uint8_t lav = ADCL; // må lese ADCL først - den låser deretter ADCH uint8_t high = ADCH; // låser opp begge lange resultat = (high<<8) | lav; resultat = 1125300L / resultat; // Beregn Vcc (i mV); 1125300 = 1,1 * 1023 * 1000 returresultat; // Vcc i millivolt}  

Trikset her er at den måler sin interne referanse på 1.1V ved hjelp av batterispenningen, og deretter inverterer den for å beregne den ukjente referansespenningen.

ADMUX-magien i denne koden kan muliggjøre andre interessante ADC-avlesninger, for eksempel differensialmålinger og differensielle ADC-målinger med forsterkning, avhengig av komponent og datablad.



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...