Att mäta kvarvarande energiinnehåll i ett batteri är en omöjlig uppgift. Det kan låta konstigt för den oinvigde, men det är faktiskt sant. Varför är det då omöjligt? Därför att batteriets spänning sjunker både med ökande momentan ström och med minskande kvarvarande energiinnehåll. Enkelt uttryckt - du kan få ut fler kilowattimmar ur ett batteri om du laddar ur det långsamt än om du laddar ur det snabbt. För att komplicera saken ytterligare är kemin inuti batteriet rätt komplex och temperaturberoende. Med detta sagt ämnar jag göra det bästa jag kan för att göra en lättbegriplig och någorlunda korrekt mätare för kvarvarande energiinnehåll i ett batteri. För att förenkla har jag valt att fokusera helt på blybatterier då de är den mest använda batteritypen och för att urladdningskurvan för Li-batterier är mycket platt, vilket gör det svårare att mäta.
Tyvärr hade jag lite hybris när jag efteranmälde mig till tävlingen. Som småbarnsförälder (och novis vad gäller elektronik) har jag inte riktigt hunnit ägna projektet tillräckligt med tid för att nå helt i mål, men jag har kommit en bra bit på vägen och redovisar här så långt jag nått och min bild av det som kvarstår. Jag redovisar logikschema (klart), kretskortslayout (klar, men oarbetad), BOM, källkod (skriven i C för CC8E-kompilatorn). Länkar finns i slutet av detta dokument.
Jag har dock avrundat koden till en fungerande helhet som mäter temperatur med god noggrannhet och presenterar resultatet på en 7-seg display. Temperaturmätningen var tänkt att komplettera spänningsmätningen för att kunna ge ett rimligt state-of-charge för i första hand ett blybatteri i vila. Logikschema finns dock färdigställt som bör klara av hela uppgiften (inklusive noggrann mätning av batterispänningen i dess intressanta intervall), men det har inte hunnit testats.
Trots att jag inte nått helt i mål är i alla fall jag nöjd med vad jag åstadkommit, men framför allt med vad jag lärt mig under resans gång. Jag har jobbat med en PIC som inte är 16F690, lärt mig mäta temperatur noggrant med termistorer, lärt mig 7-segments LED och lärt mig (men inte praktiserat) hur man med hjälp av OP-förstärkare och referensspänning kan 'zooma' in ett spänningsintervall man vill mäta och därigenom kunna tillgodogöra sig upplösningen för den AD-omvandlare man har tillhanda (i detta fall 10 bitar för PIC:ens interna omvandlare).
Logikschema
Logikschemat är klart, men inte testat i sin helhet. Jag har inte hunnit testa op-förstärkningen och inte testat strömförsörjningskretsen. Däremot är både temperaturmätningskretsen och 7-seg LED-kretsarna testade. Eftersom råa filer ej stöds av Google Docs så har jag bara lagt upp pdf. PM:a om ni vill ha Eagle-filer.
Kretskortslayout
Komponenterna är bara fritt utplacerade. Eftersom jag inte hunnit testa all logik har jag inte prioriterat att tillverka ett mönsterkort, därför har jag inte heller arbetat med layouten. Eftersom råa filer ej stöds av Google Docs så har jag bara lagt upp pdf. PM:a om ni vill ha Eagle-filer. Jag har helt enkelt bara kört på labbplatta, se bild nedan:
![Bild](http://forumbilder.se/thumbs/ae7201091345P39cc.jpg)
BILD Labbplatta. Termistorn sitter i kopplingsplinten i ovankant.
BOM
Enkel redovisning av ingående komponenter, med ELFA-artikelnummer och pris.
Källkod
De delar av koden som är klara är:
- mätning av temperatur
- presentation av resultat på 4x7-seg LED Display
Därför har jag gjort koden så att den nu presenterar aktuellt temperatur på displayen.
Temperaturmätning
Temperaturmätning skulle kunna göras med en enkel krets för temperaturmätning, men jag har valt att göra en egen temperaturmätare från grunden med NTC-motstånd. Anledningen till det är att jag helt enkelt ville lära mig bygga en sådan krets och att detta var ett bra tillfälle. Tricket med denna krets är att inte begränsa temperaturmätarens upplösning till den AD-omvandlare man har. Man kan helt enkelt få mycket högre upplösning genom att istället använda tidsrymden för mätningen. I detta specifika fall nås en upplösning på cirka 17 bitar att jämfört med AD-omvandlarens 10 bitar. Lösningen är starkt inspirerad av Microchips AN512 "Implementing Ohmmeter/Temperature Sensor". Här använder jag NTC-termistor 60-279-57 som är på 50 kOhm nominellt och faktorn B är 3950+-1%. R=R0*e^(B*(1/T-1/T0)) //T= temp i Kelvin T0=298,15 K
Temp / deg C Res / Ohm
40 26 491
15 79 223
-10 291 780
--> T=1/(1/B*ln(R/R0)+1/T0)
Repeterbarheten är mycket bra, men för att få ett bra absolutvärde måste kretsen kalibreras.
Inzoomning av spänningsområde
För att fastställa state-of-charge krävs noggrann mätning av spänningen i ett ganska litet spänningsintervall. Enligt data hos batteryuniversity (se länk nedan) är ett blybatteri fulladdat vid 12,65 V och helt urladdat vid 11,89 V. Om vi bara delar ner spänningen så att 12,65 blir 5 V kommer vi mäta 4,70 V när batteriet är fulladdat, vilket gör att vi bara använder en fraktion av mätområdet för den interna AD-omvandlaren och vi kan inte läsa ut ett rimligt state-of-charge. Lösningen är att zooma in det spänningsområdet med hjälp av en OP-förstärkare. Information om hur man praktiskt gör finns att finna på Wikipedia under 'Differential amplifier'. Ett trick är att använda PIC:ens egen interna spänningsreferens, Vref, som den nedre spänningsnivån och sedan förstärka signalen kraftigt. Jag valde en komponent med dubbla förstärkarkretsar för att jag tror att det är viktigt att spänningsreferensen i sig förstärks innan den signalen skickas in i inzoomningen. Hur jag löst det framgår av schemat, men som sagt är denna del ännu inte testad eller inlagd i koden.
Arbete som kvarstår
Kvar att arbeta med är att ta in analoga signalen på AN2 och tillsammans med aktuellt temperaturvärde översätta till ett state-of-charge (SOC) för blybatteriet. Viktig input till den algoritmen finns att finna på bland annat följande webbplatser:
http://www.mpoweruk.com/soc.htm
http://www.wirefreedirect.com/Charge_Co ... mation.asp
http://www.empowerthyself.com/book/export/html/2
http://www.batteryuniversity.com/partone-13.htm
/slut på rapport
Länkar till rapportbilagor:
Denna fil:
http://docs.google.com/Doc?docid=0ATR3D ... Zkeg&hl=sv
BOM:
http://spreadsheets.google.com/ccc?key= ... 1Ymc&hl=sv
Schema:
http://docs.google.com/fileview?id=0BzR ... ODU1&hl=sv
Board (ointressant):
http://docs.google.com/fileview?id=0BzR ... MjM1&hl=sv
Kod:
http://docs.google.com/Doc?docid=0ATR3D ... eGZz&hl=sv