Avtor: Brian Millier
Podjetje Analog Devices (ADI) je leta 2022 predstavilo LTC2959 merilnik napolnjenosti akumulatorja. Leta 2017 je ADI prevzelo podjetje Linear Technology, in glede na oznako izdelka je verjetno, da je šlo prvotno za izdelek podjetja Linear Technology.
Namenjen je bil spremljanju akumulatorskih sklopov in zagotavljanju natančnega načina za ugotavljanje, koliko odstotkov napolnjenosti je v akumulatorju ostalo v daljšem časovnem obdobju.
Ko sem si ogledal tehnične podatke o LTC2959, me je navdušila njegova zasnova in pomislil sem, da bi ta čip lahko bil osrednji del merilnika porabe enosmerne napetosti. V preteklosti sem uporabljal čip INA209 podjetja T.I., ki meri napetost, tok in moč, vendar v nekaterih pogledih ni tako vsestranski kot LTC2959:
Deluje do 26V v primerjavi z LTC2959, ki deluje do 60V.
Vsebuje 12-bit ADC medtem ko ima LTC2959 16-bit ADC.
Merilnik meri trenutno moč v vatih, medtem ko LTC2959 beleži skupno porabo toka v mAh
LTC2959 spremlja stanje napolnjenosti (v mAh) s pomočjo merilnika naboja, ki je ves čas aktiven. Kadar LTC2959 ne izvaja meritev napetosti ali toka, za lastno napajanje porabi le nekaj mikroamperov toka.
LTC2959 vsebuje senzor temperature.
Ta vsebina je samo za naročnike
Čeprav so me tehnične lastnosti LTC2959 navdušile, je ta čip na voljo v izjemno majhnem ohišju velikosti 2 x 3 mm z 10 priključki. To je zame preprosto premajhno za ročno obdelavo in spajkanje, zato ga v praksi nisem mogel uporabiti. V zadnjih nekaj letih sem delal s ploščami Blues IoT, ki podpirajo povezave prek Wi-Fi, mobilnega omrežja, LoRa in satelitov. Kot dodatno opremo k tem ploščam podjetje Blues prodaja ploščo za spremljanje stanja baterije z imenom Mojo, v kateri je vgrajen čip LTC2959. Slika 1 prikazuje ploščo Mojo. Vsebuje standardna JST-konektorja, ki se običajno uporabljajo za LiPo-baterije, ter prehodne QUICC konektorje za I2C vmesnik in napajalne priključke. Vse povezave pa je mogoče vzpostaviti tudi prek metaliziranih lukenj na tiskanem vezju.


Pri zadnjem naročilu pri podjetju Blues sem vključil ploščico Mojo in jo vgradil v projekt merilnika moči, ki je tema tega članka. Ta ploščica stane okoli 15 evrov, kar je precej ugodno, saj je sam LTC2959 precej drag (za tako majhen čip!).
Merilnik napolnjenosti baterije z LTC2959
Preprostost tega projekta je v veliki meri zasluga merilnika stanja baterije LTC2959 podjetja ADI. LTC2959 se imenuje merilnik stanja baterije, ker je bil prvotno namenjen spremljanju baterij (ponavadi polnilnih) za merjenje njihovega stanja napolnjenosti in napovedovanje, kdaj se bodo izpraznile. Litij-ionske in LiPo celice so občutljive na poškodbe, če jih pustite preveč izprazniti. Napetost na priključkih teh celic ni zanesljiv pokazatelj odstotka preostale energije v celici. Razlog za to je, da napetost na običajnih LiPo celicah nekoliko hitro pade od polnega stanja napolnjenosti (4,1 V) do nazivne napetosti (3,6–3,7 V). Od tam napetost nato zelo počasi pada do približno 3,3 V, pri čemer ostane le še 10–20 % zmogljivosti. Vsaka nadaljnja praznitev povzroči hitro padanje napetosti, dokler ta ne doseže približno 2,0 V. Zato poskusi spremljanja stanja napolnjenosti LiPo celice z merjenjem napetosti niso ravno praktični.
Namesto tega je veliko bolj smiselno spremljati skupni porabljeni tok v daljšem časovnem obdobju in ga primerjati z nazivno vrednostjo mAh LiPo celice. Da bi to delovalo, morate začeti s popolnoma napolnjeno celico, vendar imajo običajna integrirana vezja za polnjenje LiPo baterij izhodni pin, ki vas obvesti, ko je cikel polnjenja končan. Poleg tega lahko pride do situacije, ko napajate porabnika iz LiPo celice in jo hkrati polnite, kar prinaša dodaten zaplet, saj je lahko tok v LiPo celici negativen – tj. če je polnilni tok večji od toka porabnika.
Vse te vrednosti LTC2959 brez težav spremlja. Ker boste morda spremljali naprave, ki delujejo na baterije, je pomembno, da sam LTC2959 porabi zelo malo toka. Poraba toka LTC2959 med spremljanjem akumulacije naboja znaša približno 1–2 µA. Ko LTC2959 uporablja svoj analogno-digitalni pretvornik (ADC) za merjenje trenutne napetosti ali toka, porabi 400–800 µA, vendar to ni potrebno uporabiti preveč pogosto.
Poglejmo si sliko 2, da vidimo, kaj se nahaja v LTC2959. Multiplekser izbira med štirimi viri:
Napetost, ki jo zagotavlja vir napajanja, na sliki prikazan kot baterija.
Napetost na zunanjem šent uporu, ki odraža porabo toka
Napetost iz notranjega senzorja temperature
Napetost, priključena na GPIO-pin, kar je neobvezna meritev


Izhod multiplekserja je povezan s 16-bitnim sigma-delta ADC-jem, ki lahko meri bipolarne napetosti. To je potrebno za spremljanje tokov, ki lahko tečejo v kateri koli od dveh smeri, odvisno od tega, ali se baterija polni ali prazni. Pri merjenju napetosti baterije ima ADC polni merilni razpon 62,6 voltov. S tako visoko polno merilno vrednostjo lahko LTC2959 brez težav meri napetost baterije, sestavljene iz več zaporedno vezanih celic. LTC2959 ne more meriti zgolj tako visokih napetosti, ampak lahko za napajanje VDD obravnava tudi napetosti med 1,8 in 60 V.
Pri merjenju toka znaša polni obseg ADC-ja ±97,5 mV. V tehničnih podatkih za LTC2959 je navedeno, da je potreben 50 miliOhm šent upor. Vrednosti toka in naboja, shranjene v njegovih notranjih registrih, temeljijo na tem 50 miliOhm šent uporu. Plošča Mojo, ki jo uporabljam, vsebuje 250 miliOhm šent upor. Ta višja vrednost je bila izbrana zaradi izboljšanja občutljivosti pri nizkih tokovih, vendar pa zaradi nje polni tok upade za petkrat. Pri uporabi tega šent upora je največji tok, ki ga lahko merimo:
0,0975V/0,25Ω ali 390 mA
Najmanjši tok, ki ga je mogoče izmeriti, znaša 11,9 uA (= 1 LSB ADC-ja). Faktor 5 (za popravek zaradi 250 miliOhm šent upora namesto predpisanega 50 miliOhm šent-a) je upoštevan v knjižnici Arduina. Ta knjižnica je bila napisana posebej za ploščo Mojo.
Edinstvena značilnost vezja LTC2959 je njegov Coulombov števec. To vezje meri naboj in ga prikazuje v enotah mAh. Napetost na šent uporu (ki je sorazmerna s porabljenim tokom) se integrira v času. Tehnični list ne navaja podrobnosti, vendar domnevam, da se to izvaja v analognem delu vezja. Vendar se ta integrirana analogna napetost (ki je lahko pozitivna ali negativna, odvisno od tega, ali se celica polni ali prazni) redno digitalizira in prišteje k digitalnemu števcu oziroma odšteje od njega. Ta števec je register akumuliranega naboja (angl. Accumulated Charge Register ACR).
Števec naboja deluje ne glede na to, ali je preostalo vezje LTC2959 pod napetostjo ali ne. Zato števec naboja v ozadju nemoteno deluje, ne glede na to, kako pogosto od LTC2959 zahtevate odčitke napetosti in toka. Zato morate meritve napetosti/toka opravljati le tako pogosto, kot se vam zdi potrebno, odvisno od tega, kako močno se spreminja tokovna obremenitev.


Ker je LTC2959 namenjen spremljanju stanja baterije, bi lahko bil eden od pomembnih parametrov temperatura baterije. Zato ima LTC2959 vgrajen temperaturni senzor, ki posreduje podatke v analogno-digitalni pretvornik (ADC). Vrednost temperature, shranjena v temperaturnem registru, je izražena v Kelvinih, pri čemer je polna skala 825 °K. Knjižnica LTC2959 to vrednost pretvori v stopinje Celzija. Notranji senzor temperature vezja LTC2959 morda ni fizično blizu baterije, ki se nadzoruje. V tem primeru je mogoče zunanji GPIO priključek vezja LTC2959 priključiti na drug senzor temperature, ki je nameščen bližje bateriji. Najvišja napetost, ki jo je mogoče izmeriti prek tega priključka, ima dve območji +1,56 V in ± 97,5 mV.
LilyGo T-HMI-S3 MCU/ modul za prikazovanje.
Za prihodnje projekte imam vedno na zalogi različne plošče z mikrokontrolerji in zasloni. Za ta projekt je bila plošča LilyGo-S3 idealna in cenovno ugodna (19 evrov). Vključuje 2,8 palčni TFT zaslon z uporovnim dotikom. Uporovni zasloni na dotik sicer niso niti približno tako dobri kot kapacitivni, a za ta projekt je bilo to vse, kar sem potreboval.
T-HMI-S3 vsebuje Espressif ESP32S3 s 16 MB Flash pomnilnika in 8 MB pomnilnika PSRAM. Ker je bil na voljo PSRAM pomnilnik, sem ga uporabil za shranjevanje nizov, ki vsebujejo odčitke napetosti, toka in mAh. Celo pri najvišji frekvenci vzorčenja, ki sem jo omogočil (10 vzorcev na sekundo), bi za zapolnitev celotnega PSRAM pomnilnika potrebovali 185 ur. Umetno sem nastavil programsko omejitev na 20.000 vzorcev, zaradi česar je ostala večina PSRAM pomnilnika neizkoriščena.
Plošča T-HMI ima vgrajeno vtičnico za uSD kartico, kar mi omogoča shranjevanje zbranih podatkov na uSD kartico. MCU ploščice, kot je T-HMI, ki vsebujejo tako TFT zaslon kot tudi krmilnik zaslona na dotik, imajo pogosto na voljo le malo prostih GPIO priključkov za priključitev drugih naprav. Plošča T-HMI ima 3 proste Grove linije, od katerih vsaka ponuja napetost 3,3 V, GND in 2 GPIO pina. Za povezavo s ploščo Mojo (napajanje in I2C liniji) sem uporabil enega od teh Grove priključkov, drugega pa za priključitev na tipko Start/Stop.
T-HMI-S3 se lahko napaja prek priključka USB-C ali z uporabo 3,7-voltne LiPo-baterije. Če za napajanje uporabljate LiPo baterijo, je na plošči vgrajen polnilni čip. Na voljo je tudi drugi JST priključek, ki omogoča napajanje plošče z 5 voltnim virom napajanja. Če pa ploščo napajate na ta način, morate biti pozorni na njeno nenavadno delovanje pri vklopu in izklopu. Za vklop plošče pri uporabi tega 5 voltnega priključka morate majhen magnet približati stikalu z jezičkom (glej sliko 3) in ga tam zadržati približno sekundo. Poleg tipk za ponastavitev in zagon se nahaja majhna tipka z oznako On/Off.
S tem se bo plošča vklopila, dokler boste tipko držali pritisnjeno, kar pa ni praktično. Vendar bo ista tipka ploščo izklopila – če je bila vklopljena z magnetom. Obstaja tudi niz priključkov z oznako Dellp_off, ki ploščo izklopijo. Celoten postopek se mi je zdel okoren. Oba priključka reed releja sta prispajkana na tiskano vezje, vendar sta prekrita z nekim premazom, zaradi česar je težko odstraniti ta reed rele in ga zamenjati z običajnim preklopnim stikalom. Zato za napajanje uporabljam le kabel USB-C in 5 voltni napajalnik.
Na plošči T-HMI sta na voljo tipki za ponastavitev in zagon. Ti bosta verjetno skriti, ko bo plošča vgrajena v ohišje, vendar ima T-HMI tudi odprtine za dva 2-pin konektorja, ki ju je mogoče priključiti na zunanji tipki.
Glede na vse okoliščine menim, da je LilyGo T-HMI-S3 lepo zasnovana razvojna plošča.
Shema projekta je prikazana na sliki 4. Je precej preprosta, saj plošča T-HMI-S3 vsebuje večino potrebnih funkcionalnosti.
Podpora plošče v Arduino okolju
Ena od nevarnosti pri nakupu poceni plošč z mikrokontrolerji in zasloni iz Kitajske je povezana s programsko podporo. Tukaj je nekaj stvari, na katere morate biti pozorni:
Ali obstaja Arduino knjižnica za TFT zaslon, vgrajen na plošči? Če da, ali jo je mogoče nastaviti za določene GPIO pine, ki se uporabljajo za priključitev na mikrokontroler?
Ali je na voljo shema, s katero bi lahko ugotovili, kateri GPIO pini se uporabljajo za zaslon? Ali pa je morda na voljo knjižnica za TFT zaslon, v kateri so ustrezni pini že opredeljeni?
Ali je čip krmilnika zaslona na dotik naveden in, če je, ali zanj obstaja knjižnica za Arduino?
Kateri pini SPI vmesnika so uporabljeni za vgrajeno vtičnico za uSD kartice? Kartica pogosto uporablja druga SPI vrata kot TFT zaslon. Ali bodo obstoječe knjižnice za TFT zaslon in uSD kartice delovale skupaj?
Pred naročanjem plošče sem se seznanil z zgoraj navedenimi vprašanji. Izkaže se, da je plošča precej dobro podprta, vsaj kar zadeva Arduino IDE. Uporabljam Arduino IDE različico 2.3.8 in Espressifov paket za podporo ploščam ESP32 različice 3.3.8.
Najprej je treba prenesti knjižnico T-HMI-Master s spletne strani GitHub:
https://github.com/Xinyuan-LilyGO/T-HMI
To mapo je treba premakniti v mapo Arduino Libraries. Vendar ta glavna knjižnica ni nastavljena tako, da bi jo Arduino IDE prepoznal kot lastno knjižnico. Če torej v meniju »Primeri za to prilagojeno knjižnico« iščete »T-HMI-Master«, ga ne boste našli.
Namesto tega odprite mapo »lib« v tej mapi »T-HMI-Master« in poiščite mapo »TFT_eSPI«. Nato to mapo »TFT_eSPI« premaknite iz te mape v mapo »Arduino/Libraries«. Knjižnica »TFT_eSPI« je delo avtorja Bodnerja in se pogosto uporablja pri številnih TFT zaslonih. Če torej že imate mapo TFT_eSPI, jo boste morali odstraniti in arhivirati drugje. To je potrebno zato, ker je knjižnica TFT_eSPI, ki jo priloži LilyGo, prilagojena konkretnemu zaslonu, uporabljenemu na plošči, vključno z načinom njegovega priključitve na GPIO-vode.
Prav tako bo tam mapa z imenom arduino_xpt2046_library. Jaz sem to knjižnico že imel, če pa je pri vas ni, jo morate premakniti iz mape T-HMI_Master v mapo Arduino/Libraries.
V tej glavni mapi se nahaja tudi mapa z imenom »Examples«. Čeprav se nobeden od teh primerov ne prikaže v meniju »Arduino Examples«, lahko odprete to mapo in kliknete na enega od primerov. Tako se bo ta primer odprl v Arduino IDE.
Vsi ti primeri vsebujejo datoteko z imenom pins.h. Ta datoteka opredeljuje vse GPIO pine, ki jih uporablja plošča T-HMI-ESP32S3, TFT zaslon, krmilnik zaslona na dotik, uSD kartico itd. To datoteko morate vključiti v vsako skico, ki jo napišete za to ploščo. Tako bodo primeri s TFT zaslonom, zaslonom na dotik in uSD kartico delovali pravilno. Datoteko pins.h sem vključil v mapo skic za ta projekt.
Za to ploščo morate opraviti še nekaj drugih nastavitev. Opazil sem, da je LilyGo T-Display-S3 naveden med ploščami, ki se prikažejo, ko izberete kategorijo ESP32. Te možnosti ne izberite! Če jo izberete, PSRAM ne bo deloval. Namesto tega izberite ESP32S3 Dev Module. Nato za to ploščo izberite naslednje možnosti:
USB CDC on Boot enabled (pomembno da bo Serial.print deloval)
Velikost Flash pomnilnika 16 MB
PSRAM- OPI PSRAM (QSPI opcija ne bo delovala)
Za ta projekt sem potreboval tudi knjižnico za LTC2959. Našel sem eno, ki je bila napisana posebej za ploščo Blues Mojo. Ta knjižnica je že vnaprej nastavljena za 250 miliOhm šent upor, ki se uporablja na plošči Mojo. To knjižnico prilagam k izhodiščnemu programu projekta, ki je na voljo na spletni strani Svet Elektronike.
Podrobnosti Arduino skice
TFT zaslon, krmilnik zaslona na dotik in LTC2959 se upravljajo s pomočjo knjižnic razredov, ti razredi pa se instancirajo ob zagonu skice. Vse definicije GPIO pinov so vsebovane v datoteki pins.h, ki je bila omenjena že prej.
V tem primeru je bila uporaba PSRAM-a nekoliko zapletena. Želel sem shraniti vzorce toka, napetosti in naboja kot števila s plavajočo vejico. Ker so se ti vzorci zbirali v getLTC2959()rutini je moral biti ta niz globalen. Standardni način dodeljevanja PSRAM-a ni primeren za globalne spremenljivke. Končno sem ugotovil, kako to storiti, in sicer s pomočjo naslednjih korakov:
Na začetku skice, kjer opredeljujete globalne spremenljivke in razrede, dodajte:
float* globalFloatArray = nullptr;
define MAX_ARRAY 60000 // 20000 readings of voltage,current and charge
V Setup(), dodajte:
if (psramInit()) {
Serial.println(»PSRAM detected!«);
tft.drawString(»PSRAM found«,0,0,2);
Serial.printf(»Total PSRAM: %u bytes\n«, ESP.getPsramSize());
Serial.printf(»Free PSRAM: %u bytes\n«,
ESP.getFreePsram());
globalFloatArray = (float*)ps_malloc(MAX_ARRAY * sizeof(float));
}
V drugi točki so prve štiri vrstice namenjene le obvestilu, da je bil PSRAM odkrit, ter navedbi njegove velikosti. Med zbiranjem vzorcev se vrednosti napetosti, toka in naboja zaporedno shranjujejo v globalFloatArray kot števila s plavajočo vejico.
Naša Setup() rutina preveri tudi, ali je v režo vstavljena SD kartica. Knjižnica za SD kartice podpira le kartice velikosti do 32 GB. Če SD kartice ni, bo to prikazano tako na TFT zaslonu kot v serijskem terminalu računalnika; če pa je kartica vstavljena, bo prek serijskega vmesnika poslan seznam map, ki se nahaja na uSD kartici. Program bo deloval tudi brez SD kartice, vendar seveda ne boste mogli shraniti podatkov na kartico, ki ne obstaja.
Slika 5 prikazuje prvo okno, ki se odpre za nastavitev parametrov:
Napetost polnega obsega. S tem se določi le napetost polnega obsega, ki se prikaže na grafu. LTC2959 ima le en napetostni razpon: od 0 do 60 voltov, vrednosti napetosti, shranjene v PSRAM pomnilniku, pa lahko ležijo kjerkoli znotraj tega razpona od 0 do 60 V.
Najvišji tok. Tudi v tem primeru ima LTC2959 na voljo le eno območje toka. Pri uporabi 250 miliOhm šenta znaša najvišji tok meritve pri LTC2959 390 mA. Vendar pa lahko na grafu izberete najvišji tok v območju od 100 µA do 500 mA.
Sekunde/vzorec. Frekvenco vzorčenja je mogoče nastaviti v korakih po 1/10 sekunde do 1 sekunde, od 1 sekunde naprej pa v večjih korakih.
Po izbiri teh parametrov in zaprtju se prikaže prazen graf. Polna skala toka na grafu je prikazana na levi strani v beli barvi, krivulja toka pa je prav tako bela. Polna skala napetosti je prikazana v rumeni barvi, krivulja napetosti pa je prav tako rumena. Nič se ne zgodi, dokler ne pritisnete tipke Start/Stop. Slika 6 prikazuje risanje grafa. Priključil sem zgolj LiPo celico kot napetostni vir in upor 330 Ω kot breme. Trenutna napetost, tok, naboj in pretečen čas so prikazani na dnu zaslona. Na zaslonu je hkrati vidnih le zadnjih 270 vzorcev – zaslon se ponovno nariše, ko graf doseže desni rob zaslona. S pritiskom na tipko Start/Stop se zbiranje podatkov ustavi in prikaže se okno, ki ponuja možnost shranitve celotnega niza podatkov na uSD kartico. Ustvarjena datoteka ima ime »power.txt«. Podatki so oblikovani v naslednjem formatu:
napetost, tok, naboj, pri čemer je za vsak vzorec namenjena ena vrstica.
Na voljo je uporabna spletna stran, ki poenostavi izračun življenjske dobe LiPo baterije na podlagi podatkov o tokovih med delovanjem in v mirovanju ter časovnih intervalih. Ta stran je:
IOT Battery Life Calculator [1]
Zaključki
Sčasoma sem vse bolj hvaležen, da obstajajo podjetja, ki proizvajajo majhne razvojne plošče z najnovejšimi čipi, ki se nenehno pojavljajo na trgu. Komajda se spomnim kakšnega projekta, ki sem ga izdelal v zadnjih nekaj letih in ki bi bil mogoč brez teh razvojnih plošč.
Čeprav to za ploščo Mojo ne velja v celoti, sem pogosto ugotovil, da so razvojne plošče kitajskega porekla cenejše od zneska, ki bi ga moral plačati za nakup samega čipa, vgrajenega na plošči. Presenečen sem tudi, da nekatere poceni plošče, kot je LilyGo T-HMI-S3, odlično podpirajo programsko opremo, ki deluje v Arduino IDE.
Viri:
1: https://www.of-things.de/battery-life-calculator.php
