Litiumbatterikapacitetsmätare på en mikrokontroller. Batteriladdare-testare för Atmega8

Webbplatsen är i testläge. Vi ber om ursäkt för eventuella avbrott eller felaktigheter.
Vi ber dig att skriva till oss om felaktigheter och problem med hjälp av feedbackformuläret.

Batterikapacitetsmätare på en mikrokontroller.

Enheten som utvecklats av författaren är designad för att automatiskt mäta kapaciteten hos de flesta typer av batterier - från små batterier till bilbatterier. Mätprincipen bygger på att ladda ur batteriet med en stabil ström med automatisk beräkning av urladdningstiden och ytterligare multiplikation av dessa värden, resultatet erhålls i den vanliga dimensionen - amperetimmar.< ftp:// ftp . radio . ru / pub /2009/03/ izm . zip >.

Grunden för enheten är Atmega8 mikrokontroller (MK), som körs på programmet vars koder anges i artikeln. Förutom MK innehåller mätaren tre mikrokretsar (K155ID3, KR142EN5V, LM358N) och en IRL2505 transistor. För att visa resultaten används två digitala LED-indikatorer: tresiffrig TOT3361 (den visar värdet på urladdningsströmmen i X.XX-format) och niosiffrig E90361-L-F (visar kapacitetsvärdet i amperetimmar i XX. XXX-format och spänningen till vilken batteriet kan laddas ur, från 1 till 25,5 V). Den aktuella batterispänningen övervakas. MK-programkoder och en kretskortsritning ges. MK-programmet kommer även att läggas ut på vår FTP-server kl För att mäta kapaciteten hos ett batteri gör de vanligtvis så här: anslut ett motstånd med ett visst värde till detta batteri, som laddar ur detta batteri, och registrera storleken på strömmen som flyter genom motståndet och spänningen över det, vänta fullständig urladdning

Om du laddar ur batteriet inte genom ett motstånd, utan genom en källa med stabil ström, kommer detta att tillåta dig att bestämma batterikapaciteten med mycket hög noggrannhet. Men det finns ett problem - spänningen på batteriet (1.2..3.7 V) är inte tillräckligt för att driva en stabil strömkälla. Men detta problem kan kringgås genom att lägga till mätningar till kretsen ytterligare källa spänning.

Ris. 1. Krets för mätning av batterikapacitet
V1 - batteri under studie; V2 - hjälpspänningskälla; PV1 - voltmeter;
LM7805 och R1 - stabil strömkälla; VD1 - skyddsdiod.

Figur 1 visar kretsschema installationer för mätning av batterikapacitet. Här kan du se att det uppmätta batteriet V1 är anslutet i serie med strömkällan (det bildas av den LM7805 integrerade stabilisatorn och motståndet R1) och hjälpströmkällan V2. Eftersom V1 och V2 är seriekopplade är summan av deras spänningar tillräcklig för att driva strömkällan. Eftersom den lägsta spänningen som krävs för driften av strömkällan är 7 V (varav 5 V är spänningen vid utgången av mikrokretsen LM7805, dvs. i detta fall är det spänningsfallet över motståndet R1, och 2 V är det minsta tillåtet spänningsfall mellan ingång och utgång på LM7805), då är summan av spänningarna V1 och V2 tillräcklig med viss marginal för att driva strömkällan.

Istället för stabilisatorn LM7805 kan du använda en annan integrerad regulator, till exempel LM317 med en utspänning på 1,25 V och ett minsta spänningsfall på 3 V. Eftersom den lägsta driftspänningen för strömkällan kommer att vara 4,25 V, är spänningen på den andra spänningskällan V2 kan reduceras till 5 B. Om stabilisatorn LM317 används kommer värdet på stabiliseringsströmmen att bestämmas av formeln I = 1,25/R1

För en urladdningsström på 100 mA bör värdet på motståndet R1 vara ungefär 12,5 ohm.

Hur man mäter batterikapacitet

Först, genom att välja motstånd R1, måste du ställa in urladdningsströmmen - vanligtvis väljs värdet på urladdningsströmmen lika med batteriets driftsurladdningsström. Man bör också komma ihåg att vissa modeller av 7805 integrerade spänningsstabilisatorer kan förbruka en liten styrström i storleksordningen 2...8 mA, så det rekommenderas att kontrollera strömvärdet i kretsen med en amperemeter. Därefter installeras ett fulladdat batteri V1 i kretsen, och genom att stänga switch SA1 börjar de räkna ner tiden tills spänningen på batteriet sjunker till ett minimivärde - för olika typer För laddningsbara batterier är detta värde annorlunda, till exempel för nickel-kadmium (NiCd) - 1,0 V, för nickel-metallhydrid (NiMH) - 1,1 V, för litium-jon (Li-ion) - 2,5 ... 3 V, för varje specifik batterimodell måste dessa data ses i lämplig dokumentation.

Efter att ha uppnått minimispänningen på batteriet öppnas omkopplaren SA1. Man bör komma ihåg att urladdning av batteriet under minimispänningen kan skada det. Genom att multiplicera urladdningsströmmen (i ampere) med urladdningstiden (i timmar) får vi batterikapaciteten (A*h):

C=I*t

Låt oss överväga praktisk tillämpning denna metod för att mäta batterikapacitet med ett specifikt exempel.

Mätning av kapaciteten för NB-11L-batteriet

NB-11L-batteriet (Fig. 2) köptes från DealeXtreme onlinebutik för 3,7 USD (SKU: 169532). På batterihöljet anges dess kapacitet - 750 mAh. På webbplatsen anges dess kapacitet mer blygsamt - 650 mAh. Vad är den verkliga kapaciteten för detta batteri?

Ris. 2. Li-ion batteri NB-11L med en kapacitet på förmodligen 750 mAh
Passar CAN.NB-11L 3,7V 750mAh
Använd endast specificerad laddare

För att ansluta ledarna till batterikontakterna behöver du två gem, som ska böjas som visas i figur 3 och kopplas till batteriets "+" och "-" poler (Figur 4.). Det är nödvändigt att undvika kortslutning av kontakter, det är bättre att isolera dem.

För att mäta kapaciteten hos NB-11L-batteriet togs dess urladdningsström till 100 mA. För detta ändamål valdes värdet på motståndet R1 till något mer än 50 ohm. Effekten som förbrukas av motståndet R1 bestäms av formeln P = V2/Rl där V är spänningen över motståndet R1. I detta fall är P=5 2 /50=0,5 W. Stabilisatorn LM7805 bör installeras på en kylare, men om det inte finns någon lämplig kylare till hands kan chipet delvis sänkas ned i ett glas med kallt vatten, men så att terminalerna förblir torra (i fallet TO-220).

Efter att ha installerat ett fulladdat NB-11L-batteri i kretsen och stängt SA1-omkopplaren började nedräkningen med periodisk spänningsövervakning med PV1-voltmetern. Uppgifterna matades in i en tabell enligt vilken en graf över urladdningen av NB-11L-batteriet konstruerades (fig. 5).

Ris. 5. Spänningsdiagram på NB-11L-batteriet under dess urladdning med en ström på 100 mA

Det kan ses av detta att efter 5 timmars urladdning med en ström på 0,1 A sjönk spänningen på batteriet till 3 volt och började snabbt sjunka ytterligare.

C = I * t = 0,1 * 5 = 0,5 A = 500 mAh.

Så den faktiska kapaciteten för NB-11L-batteriet visade sig vara 1,5 gånger lägre än vad som anges på det.

I nyligen Jag började märka att min smartphone började laddas ur snabbare. Sökandet efter en mjukvaru-"energiätare" gav ingen frukt, så jag började undra om det var dags att byta ut batteriet. Men det fanns ingen absolut säkerhet om att batteriet var orsaken. Därför, innan jag beställde ett nytt batteri, bestämde jag mig för att försöka mäta den verkliga kapaciteten hos det gamla. För att göra detta bestämde man sig för att montera en enkel batterikapacitetsmätare, speciellt eftersom denna idé hade inkuberats under lång tid - det finns så många batterier och ackumulatorer runt omkring oss i världen. vardagsliv, och det skulle vara trevligt att kunna testa dem då och då.

Själva idén bakom driften av enheten är extremt enkel: det finns ett laddat batteri och en belastning i form av ett motstånd du behöver bara mäta ström, spänning och tid under batteriurladdningen, och använda de erhållna uppgifterna beräkna dess kapacitet. I princip klarar du dig med en voltmeter och en amperemeter, men att sitta vid instrument i flera timmar är ett tveksamt nöje, så du kan göra detta mycket enklare och mer exakt med hjälp av en datalogger. Jag använde Arduino Uno-plattformen som en sådan inspelare.

1. Schema

Det är inga problem med att mäta spänning och tid i Arduino - det finns en ADC, men för att mäta ström behöver du en shunt. Jag hade idén att använda själva belastningsmotståndet som en shunt. Det vill säga att känna till spänningen på den och ha tidigare mätt motståndet kan vi alltid beräkna strömmen. Det är därför enklaste alternativet Kretsen kommer endast att bestå av en last och ett batteri, anslutna till den analoga ingången på Arduino. Men det skulle vara trevligt att sörja för att stänga av belastningen när tröskelspänningen på batteriet nås (för Li-Ion är detta vanligtvis 2,5-3V). Därför inkluderade jag ett relä i kretsen, styrt av digitalt stift 7 genom en transistor. Den slutliga versionen av kretsen visas i figuren nedan.

Jag placerade alla element i kretsen på en bit bakbord, som installeras direkt på Uno. Som last använde jag en spiral gjord av nikrom tråd 0,5 mm tjock, med ett motstånd på cirka 3 ohm. Detta ger en beräknad urladdningsström på 0,9-1,2A.

2. Strömmätning

Som nämnts ovan beräknas strömmen baserat på spänningen på spiralen och dess motstånd. Men det är värt att överväga att spiralen värms upp, och motståndet hos nikrom beror ganska starkt på temperaturen. För att kompensera för felet tog jag helt enkelt ström-spänningskarakteristiken för spiralen laboratorieblock strömförsörjning och låt den värmas upp före varje mätning. Därefter genererade jag trendlinjeekvationen i Excel (graf nedan), vilket ger ett ganska exakt beroende i(u) med hänsyn till uppvärmning. Det kan ses att linjen inte är rak.

3. Spänningsmätning

Eftersom noggrannheten hos denna testare direkt beror på noggrannheten i spänningsmätningen, bestämde jag mig för att fokusera på detta särskild uppmärksamhet. Andra artiklar har redan upprepade gånger nämnt en metod som låter dig mäta spänningen mest exakt med Atmega-kontroller. Jag upprepar bara kortfattat - kärnan är att bestämma den interna referensspänningen med hjälp av själva styrenheten. Jag använde materialen i den här artikeln.

4. Program

Koden är inget komplicerat:

Programtext

#define A_PIN 1 #define NUM_READS 100 #define pinRelay 7 const float typVbg = 1,095; // 1,0 -- 1,2 float Voff = 2,5; // avstängning spänning float I; flytlock = 0; flottör V; flyta Vcc; floatWh = 0; unsigned long prevMillis; osignerad lång testStart; void setup() ( Serial.begin(9600); pinMode(pinRelay, OUTPUT); Serial.println("Tryck på valfri tangent för att starta testet..."); while (Serial.available() == 0) ( ) Serial.println("Test är lanserat..." Serial.print("mAh"); Vcc"); digitalWrite(pinRelay, HIGH); testStart = millis(); prevMillis = millis(); void loop() ( Vcc = readVcc(); //läs referensspänning V = (readAnalog(A_PIN) ) * Vcc) / 1023.000; //avläsning av batterispänningen om (V > 0,01) I = -13,1 * V * V + 344,3 * V + 23,2 //beräknar strömmen enligt I-V-karakteristiken annars I=0; millis() - prevMillis) / 3600000 //beräkning av batterikapacitet i mAh Wh += I * V * (millis() - prevMillis) //beräkning av batterikapacitet i Wh prevMillis = millis(); ); // skicka data till serieporten om (V< Voff) { //выключение нагрузки при достижении порогового напряжения digitalWrite(pinRelay, LOW); Serial.println("Test is done"); while (2 >1) ( ) ) ) void sendData() ( Serial.print((millis() - testStart) / 1000); Serial.print(" "); Serial.print(V, 3); Serial.print(" ") ; Serial.print(I, 1); Serial.print(" "); värden och sortera dem för att ta läget int sortedValues ​​för (int i = 0; i< NUM_READS; i++) { delay(25); int value = analogRead(pin); int j; if (value < sortedValues || i == 0) { j = 0; //insert at first position } else { for (j = 1; j < i; j++) { if (sortedValues <= value && sortedValues[j] >= värde) (// j är infoga positionsbrytning; ) ) ) för (int k = i; k >< (NUM_READS / 2 + 5); i++) { returnval += sortedValues[i]; } return returnval / 10; } float readVcc() { // read multiple values and sort them to take the mode float sortedValues; for (int i = 0; i < NUM_READS; i++) { float tmp = 0.0; ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); ADCSRA |= _BV(ADSC); // Start conversion delay(25); while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both tmp = (high << 8) | low; float value = (typVbg * 1023.0) / tmp; int j; if (value < sortedValues || i == 0) { j = 0; //insert at first position } else { for (j = 1; j < i; j++) { if (sortedValues <= value && sortedValues[j] >= värde) (// j är infoga positionsbrytning; ) ) ) för (int k = i; k > j; k--) ( // flytta alla värden högre än nuvarande läsning upp en position sorteradeVärden[k ] = sortedValues; ) sortedValues[j] = värde; //infoga strömavläsning ) //retur skalat läge med 10 värden float returnval = 0;< (NUM_READS / 2 + 5); i++) { returnval += sortedValues[i]; } return returnval / 10; }

för (int i = NUM_READS / 2 - 5; i
Var 5:e sekund överförs data om tid, batterispänning, urladdningsström, strömkapacitet i mAh och Wh samt matningsspänning till den seriella porten. Strömmen beräknas med funktionen som erhölls i steg 2. När tröskelspänningen Voff uppnås stoppas testet.

Enligt min mening är den enda intressanta punkten i koden användningen av ett digitalt filter. Faktum är att när man läser spänning "dansar" värdena oundvikligen upp och ner. Först försökte jag minska denna effekt genom att helt enkelt ta 100 mätningar på 5 sekunder och ta medelvärdet. Men resultatet tillfredsställde mig fortfarande inte. Under mina sökningar stötte jag på ett sådant mjukvarufilter. Det fungerar på ett liknande sätt, men istället för att beräkna medelvärden, sorterar den alla 100 mätvärden i stigande ordning, väljer de centrala 10 och beräknar medelvärdet av dem. Resultatet imponerade på mig - mätfluktuationer slutade helt. Jag bestämde mig för att använda den för att mäta den interna referensspänningen (readVcc-funktionen i koden).

5. Resultat

Data från serieportmonitorn importeras till Excel med några få klick och ser ut så här:
När det gäller min Nexus 5 är den deklarerade kapaciteten för BL-T9-batteriet 2300 mAh. Den jag mätte är 2040 mAh med en urladdning på upp till 2,5 V. I verkligheten är det osannolikt att regulatorn låter batteriet tömmas till en så låg spänning, med största sannolikhet är tröskelvärdet 3V. Kapaciteten i detta fall är 1960 mAh. Ett och ett halvt års telefontjänst ledde till en kapacitetsförlust med cirka 15 %. Det beslutades att vänta med att köpa ett nytt batteri.
Med den här testaren har flera andra Li-Ion-batterier redan laddats ur. Resultaten ser väldigt realistiska ut. Den uppmätta kapaciteten för nya batterier sammanfaller med den deklarerade kapaciteten med en avvikelse på mindre än 2 %.


Denna testare är även lämplig för metallhydrid AA-batterier. Urladdningsströmmen kommer i detta fall att vara cirka 400 mA.

Att mäta ett batteris kapacitet bygger på att ladda ur det med en jämn ström, mäta urladdningstiden och multiplicera dessa värden. Vid mätning av internt motstånd mäter enheten batterispänningen utan belastning, sedan under belastning med en ström på 1 A och beräknar, baserat på dessa data, batteriets interna resistans.

Enhetsdiagrammet visas i fig. 1. Dess grund är ATmedav mikrokontroller (DD1). Tangentbordet med entrådsgränssnitt består av sex knappar SB1-SB6. Information om de uppmätta batteriparametrarna visas på den niosiffriga LED-indikatorn HG1. För att ladda ur det anslutna batteriet används en spänningsstyrd strömkälla (VTUN) på op-amp DA2, transistor VT1, motstånden R9, R10, R19-R21, R23 och kondensatorerna C7, C9.

Om spänningen på det anslutna batteriet är under 1 V är enhetens tangentbord låst och BF1-kapseln avger tre intermittenta ljudpulser med en frekvens på 600 Hz. Om batterispänningen är över 1 V avger BF1-kapseln två intermittenta ljudpulser med en frekvens på 3000 Hz när batteriet är anslutet, och även när det har laddats ur till inställd spänning

Efter att ha anslutit batteriet, ställ in spänningen till vilken det måste laddas ur genom att trycka på knapparna SB3 och SB4. Inställningssteget vid kort tryckning är 0,1 V. När du håller knappen intryckt är de tio första stegvärdena 0,1 V, sedan 1 V. Sedan, genom att trycka på knapparna SB1 och SB2, ställs urladdningsströmmen in. Om dessa knappar hålls nere i mindre än fem sekunder ändras inte det aktuella värdet och dess aktuella värde visas, som visas på bilden i Fig. 2 (symbol і i det nedre läget). Om knapparna SB1 och SB2 hålls intryckta i mer än fem sekunder kommer det aktuella värdet att ändras i variabla steg: först 50 mA, sedan 150 mA. I det här fallet kommer symbolen і att visas i den övre positionen, som visas på bilden i fig. 3.

Det maximala värdet för urladdningsströmmen är 2,55 A Så snart urladdningsströmmen når ett värde som är större än noll (när batterispänningen är högre än det inställda tröskelvärdet eller lika med det), försvinner ljudsignalen och HL1-lysdioden börjar börja att blinka med en frekvens på 0,25 Hz. När du trycker på SB5-knappen mäts och lagras spänningen utan belastning, sedan under belastning beräknas det interna motståndet i ohm, vilket visas i indikatorns låga ordningssiffror med symbolen g, som visas på bilden i fig. 4.

När du trycker på SB6-knappen visar de högsta siffrorna i HG1-indikatorn den aktuella batterispänningen. När ingen knapp trycks in visar de höga siffrorna i HG1-indikatorn den spänning till vilken batteriet behöver laddas ur, och de låga siffrorna visar kapaciteten i formatet XX,XX amperetimmar. Obetydliga nollor på tiotals volt och amperetimmar avbryts av programvara.

Mest delar monterade på kretskort tillverkad av ensidig folieglasfiber, vars ritning visas i fig. 5 Tunna rektanglar visar ytmonterade komponenter R7, R8 och C5 installerade på sidan av de tryckta kretsledarna.

För att säkerställa linjäriteten hos ITUN-strömmen genom hela intervallet är det nödvändigt att använda op-amp DA2 med lägsta möjliga nolloffsetspänning och transistor VT1 med låg tröskelspänning. I författarens kopia är nollförspänningen för op-amp DA2 cirka 4 mV och transistor VT1 med en tröskelspänning på 1,85 V vid en dräneringsström på 1 A, olinjäriteten hos ITUN-strömmen översteg inte 10%. Minimivärdet för ITUN-strömmen är inte mer än 2 mA. Transistor VT1 installeras utan kylfläns. En fläkt från en datorprocessor används för att kyla den. Fläkten och enheten får ström från en ostabiliserad nätverksadapter med en utspänning på 9.. 12 V och en lastström på minst 0,5 A.

Uppställningen består av att välja motstånd R6 och R9. Genom att välja motstånd R6 bestäms avläsningarna av de mest signifikanta siffrorna i HG1-indikatorn med hjälp av en standardvoltmeter. Därefter, genom att trycka på knapparna SB1 och SB2, visas det erforderliga värdet på urladdningsströmmen på HG1-indikatorn, mät ITUN-strömmen med en standardamperemeter och välj motståndet R9 och ställ in den uppmätta strömmen lika med avläsningarna av HG1-indikatorn .

P.S. Om det inte finns någon självexcitering av mikrokontrollerns klockgenerator, bör dess stift 9 och 10 anslutas till den gemensamma ledningen genom kondensatorer med samma kapacitet 12...22 pF.

Mikrokontrollerprogram kan laddas ner.


Publiceringsdatum: 07.06.2012


Läsarnas åsikter
  • [e-postskyddad] / 18.07.2019 - 21:40
    Bästa Ozolin M.A. Jag byggde en layout av din krets Radio nr 7, 2015 på ATtiny26 Som jag förstår det är det ett fel med kvarts i kretsen. Diagrammet visar en 32768Hz klockresonator. Och säkringarna (H-17, L-EE) började fungera med 4 MHz kvarts. Kanske är säkringarna felaktigt indikerade? Snälla berätta.. Var är stavfelet? Så att lysdioden blinkar med en frekvens på 0,5Hz som i beskrivningen. Kanske behöver du mindre kvarts? Typ 3,2MHz/3,579575/3,68640/ Piezkeramisk resonator ZTA 3,58 MHz? Diagrammet är enkelt och coolt. Det finns inget överflödigt. Det fungerar på 4MHz för tillfället. Tack vare dig. Om du berättar om kvarts så blir det helt fantastiskt. Med vänlig hälsning, Roman.
  • Ozolin M. A / 05/11/2015 - 10:26
    Resistans R8 ska vara 1, inte 10 kOhm! ETT MISSTAG AV RADIOMAGASINETS REDAKTÖRER OCH DEN SOM UTAN ATT TITTA PLADE ARTIKELN HÄR. Jag påpekade detta fel för dem direkt efter att artikeln publicerats och korrigeringen publicerades i avsnittet "vår konsultation". Länk till arbetsdiagram http://maxoz.ru/newAk/newAk.gif
  • Ozolin M. A / 05/11/2015 - 10:13
    Mina herrar Boris och Alexander K.G, kontrollera delarnas servicebarhet eller leta efter fel i installationen! Firmware fungerar och har testats många gånger!
  • Alexander G.K.
    / 23/04/2015 - 10:02
  • Jag håller med Boris - upplägget fungerar INTE! Efter att ha "dansat med en tamburin" började det aldrig. Det enda som kan detekteras är spänningen över eller under 1 V. (tre eller två "pip") Mr. M. Ozolin, svara inte (!) - *.HEX I won’t ask. Dålig affär....
    Sergey / 2013-09-18 - 07:36
  • Hur ställer man in säkringar för styrenhetens firmware?
    Boris / 28/05/2013 - 06:59
  • Kretsen fungerar inte när den trycks ned, alla knappar visar samma siffror med de två minst signifikanta siffrorna. Mr. M. Ozolin, kommer du att svara?
    Vitaly / 11/16/2012 - 03:55
  • B (ITUN) - för att få bra linjäritet är det bättre att ersätta LM357N op-amp med en MCP601.
    Alexander / 22.10.2012 - 17:10

Kan Li-ion- och Li-pol-batterier kontrolleras med denna mätare?

Hälsningar, medborgare i Datagoria! Låt mig presentera dig för min nästa skapelse - en batterikapacitetstestare. Enheten är naturligtvis inte för varje dag, men ibland kan du inte klara dig utan den! Jag behövde mäta syrabatteriets återstående kapacitet, på vintern räknas trots allt varje ampere, det kanske är dags att byta ut batteriet? Enkla tester

Jag var inte nöjd med lastgaffeln och densitetsmätningen de gav mig inte information om huruvida jag skulle ha tillräckligt med energi för att värma upp bilen i 40 minuter på PZD (cirka 8 A/h) och sedan starta bilen med starter.

Testkrets för batterikapacitet

Fragment exkluderat. Vår tidning finns på donationer från läsare. Full version denna artikel är endast tillgänglig



Kontrollerad urladdningsregulator



Säkringsplacering vid programmering av ATmega8A MK


5. Alla delar anges på programvaran.

--
Tack för din uppmärksamhet!
Igor Kotov, chefredaktör för tidningen Datagor


Tryckt kretskort i LayOut: ▼ 🕗 10/24/14 ⚖️ 144,03 Kb ⇣ 124 Hej läsare! Jag heter Igor, jag är 45, jag är sibirisk och en ivrig amatörelektronikingenjör. Jag kom på, skapade och har underhållit denna underbara sida sedan 2006.
I mer än 10 år har vår tidning endast funnits på min bekostnad.

Bra! Freebie är över. Om du vill ha filer och användbara artiklar, hjälp mig!



Dela