Spørgsmål:
Indikator for lavt batteriniveau
littlebirdceo
2009-11-01 04:59:42 UTC
view on stackexchange narkive permalink

Jeg ønsker at lave en indikator for batteriets levetid, som jeg kan bruge sammen med en mikrokontroller. Jeg håber, at jeg derefter kan læse den aktuelle resterende batterilevetid og i stigende grad sætte mikrokontrolleren i dvale for at bevare batteriets levetid.

Hvilken mikrokontroller?
Tre svar:
#1
+22
bpijls
2009-11-03 04:07:56 UTC
view on stackexchange narkive permalink

tinker.it offentliggjorde en "hemmelig" spændingsniveaumåler i Atmega168 / atmega328. Med et lille trick er en Arduino i stand til at sammenligne VCC mod en intern præcision 1.1v reference. Forklaringen og koden er her: https://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

fremragende, jeg kører en atmega på batterier og var ikke i stand til at have en pålidelig vref-værdi. tak for at sende dette, det løste mit problem som magi!
#2
+13
shutterdrone
2009-11-01 23:57:04 UTC
view on stackexchange narkive permalink

Til det primære spørgsmål om, hvordan man måler et batteris spænding, er den mest enkle metode at bruge en af ​​ADC-stifterne på arduino.

Hvis du leverer 5v fra batteri (usandsynligt), så kan du køre + direkte til en af ​​de analoge stifter og bruge analogRead () - hver stigning i værdi (fra 0-1023) repræsenterer 4,9mV. Så gang læseværdien med .0049 for at få voltene læst.

Hvis du kører højere end 5v (mere sandsynligt), kan du bruge et spændingsdelerkredsløb (se: http: / /da.wikipedia.org/wiki/Voltage_divider) for at bringe den spænding, du sender, til den analoge indgang til < = 5v. Hvis du kører 12V, vil du dele spændingen i ca. 1/3. Derefter multipliceres ADC-værdien med 3 for at få den faktiske spænding.

Således, hvis du bruger 12V, og en 1/3 spændingsdeler:

  #define BAT_PIN 14 float read_batt_volts (ugyldig) {int val = analogRead (BAT_PIN); float volt = (float) val * (float) 0.0049 * (float) 3; return (volt)}  

! c

Jeg har to vigtige ting at tilføje til dette. For det første dør de fleste 12V batterier ikke ved 0V, men i stedet for noget ret tæt, i det mindste inden for 5 V, af din fulde opladningsspænding. En almindelig teknik til at få højere opløsningsmålinger i driftsområdet er at træde ned spændingen med en zenerdiode. En modstand i serie med en zener, og du måler på tværs af modstanden. For det andet er de fleste mennesker ikke klar over, at du har brug for at trække strøm fra et batteri for at få en god idé om strømmen tilbage.
@Kortuk: Kunne du gøre to præciseringer for min læring: (1) For at komme inden for det pin-accepterede spændingsområde, antyder du, at zener-diode-tilgangen giver højere opløsning end spændingsdelermetoden? (2) Hvorfor nævnte du en særlig omtale her, at "du skal trække strøm ..." osv.?
#3
+10
blalor
2009-11-02 23:51:37 UTC
view on stackexchange narkive permalink

shutterdrones forslag er meget godt, men mangler en detalje, da det antyder, at den analoge spændingsreference er den samme som den spænding, der måles (bortset fra at antage, at der bruges en Arduino, hvilket ikke udtrykkeligt er angivet).

Du skal bruge en ADC, uanset om den er integreret i din uC eller en ekstern komponent. ADC har brug for en analog spændingsreference (ARef) for at sammenligne indgangen med. Du vil ikke have, at ARef skal være den samme som den spænding, du registrerer, for så vil ADC altid se indgangs- og referencespændingerne som ens, så den analoge værdi for den registrerede spænding vil altid være den maksimale. Hvad du har brug for er en meget nøjagtig analog spændingsreference, der ikke ændres, når strømforsyningsspændingen ændres. ADC sammenligner denne referencespænding med batterispændingen; du kan bruge en spændingsdeler til at reducere batterispændingen, der registreres inden for området ARef.

Arduino (Atmega8 / 168/328 / osv.) har en indbygget ADC og en indbygget 1.1V analog reference, så de eneste eksterne komponenter, du har brug for, er modstande til spændingsdeleren. Jeg tror, ​​du også vil bruge meget høje værdier til modstandene for at reducere strømmen på batteriet.

Fremragende point - og det er korrekt, at jeg (forkert) antog en Arduino i blandingen. =)! c


Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 2.0-licens, den distribueres under.
Loading...