2019-07-31

Atmega bandgap - maitinimo šaltinio įtampos matavimui

Mikrovaldiklį maitinant iš įvairių maitinimo šaltinių, o ypač iš baterijų, naudinga žinoti, kiek gyvas yra pats šaltinis-baterija. Ar dar pakaks energijos tolesniam darbui, ar galbūt jau laikas signalizuoti-pranešti apie baterijų keitimą? Šiam darbui galime pasitelkti analoginį-skaitmeninį keitiklį (ADC) ir įtampą pamatuoti tradiciniu būdu. ADC mokėmės naudoti jau ir seniau. Tam, žinoma, papildomai prireiks įtampos daliklio (angl. voltage divider). Tačiau Atmega ir kituose mikrovaldikliuose yra ir kiek geresnis būdas - panaudoti bandgap atraminį (angl. reference) šaltinį. Šis neprastas, bet kartu paprastas metodas vertas atskiro dėmesio ir straipsnio.





I. Problema

Kad ir kaip būtų keista, bet savo paties (t.y. mikrovaldiklio) maitinimo įtampos matavimo funkcija nėra tiesiogiai realizuota mikrovaldikliuose ir paprastai tiesiog negalime užklausti, kiek gi maitinanti baterija dar tiekia įtampos. Laimei turime integruotus analoginius keitiklius ir jais galime pamatuoti bet kokią įtampą, kuri yra tarp 0V ir mikrovaldiklio veikimo (VCC). Jeigu ADC matuojama įtampa didesnė nei VCC, tai galime pasidaryti įtampos daliklį (žr. paveikslą žemiau), sumažinti įtampą iki saugaus lygio ir tada ją išmatuoti.

Tipinis ADC panaudojimas įtampai matuoti su įtampos dalikliu
Šio metodo trūkumas - kad ir kokio dydžio varžas (kiloomų, megaomų ir pan.) paimtume  -prarandame energiją, srovė nuolat teka per varžas ir lašas po lašo... bateriją ištaško :) Kai kiekvienas mikroamperas svarbus, tai švaistyti nevalia. Kitas būdas sakytumėte - į sistemą įterpti tranzistorių, kuris veiktų, kaip jungiklis, prieš matavimą - įjungiame, palaukiame kol nusistovi, pamatuojame ir po matavimo išjungiame (žr. paveikslą žemiau).

Įtampos matavimas naudojant įtampos daliklį bei NPN tranzistorių
Su energijos švaistymu - jau geriau, bet atsiranda papildomas komponentas, papildomos išlaidos, vieta ant PCB, schema tampa ne tokia elegantiška. Kaip norėtųsi atsisakyti visų diskretinių komponentų ir rasti sprendimą. Galiu nudžiuginti, toks variantas yra - tai bandgap atraminio šaltinio naudojimas. Atmega mikrovaldikliai turi specifinių savybių, apie kurias ne visada žinome. Bandgap metodas, galima sakyti, tiesiog idealiai pritaikytas baterijos-maitinimo šaltinio įtampos (VCC) matavimui.

II. Bandgap

Bandgap naudojimą puikiai aprašė Jeelabs čia. Per Arduino IDE ši funkcija nėra pasiekiama, tad norint ja naudotis, teks tiesiogiai dirbti su registrais. Bet šiuo atveju tai nėra labai sunku. Bandgap yra atraminis 1.1V šaltinis netiesiogiai susietas su VCC. Esminė savybė, jog bandgap šaltinio įtampą galime matuoti atsižvelgiant į VCC įtampą, t.y. jų santykį. Jeigu VCC įtampa krenta, tai bandgap atraminė įtampa nekrenta, išlieka 1.1V, tačiau santykis 1.1V/VCC didėja. Atmega mikrovaldikliui galime pasakyti, jog norime išmatuoti bandgap šaltinio įtampą ribose tarp 0V ir VCC (kas atitiktų 0 ir 1023 skaitmeninį ADC diapazoną, tipiniame 10-bitų Atmega mikrovaldiklyje). Tai galime padaryti prijungus šį šaltinį prie ADC, t.y. keliais registrų reikšmių pakeitimais. Išmatavę bandgap įtampą Xv ir gavę jos skaitinę reikšmę Xd galime nuspręsti, kokia baterijos-šaltinio įtampa VCC. Pavyzdžiui turint pilną 5V bateriją, kai reikšmė Xv = 1.1V, tai VCC = 5V. Taigi Xv / VCC * 1023 = Xd. Mus domina VCC reikšmė, kuri nuolat mažėja baterijai išsikraunant ir laikui bėgant. Ji yra lygi: VCC = Xv * 1023 / Xd arba VCC = 1.1 *1023 / Xd, kadangi visada Xv=1.1V. Taigi, visiškai supaprastinus ir padauginus iš 1000 gausime (milivoltais): VCC = 1100 *1023 / Xd.


Rezultatai milivoltais Arduino IDE lange
Pavyzdinis kodas pateiktas aukščiau leidžia Atmega328 pasinaudoti bandgap šaltiniu. Kodas tinka bent ATmega48P/88P/168P/328P mikrovaldikliams (datasheet). Atmega specifikacijoje 21.9.1 skyrelyje skelbiama visa reikalinga informacija. Svarbiausias momentas yra ADMUX registro valdymas. Su REFS0=1 bitu nustatome, jog matavimui naudosime įtampą paduodamą į AVcc išvadą, kuri tradiciškai yra prijungta prie VCC. Su 14(10)=1110(2) nustatome, jog ADC matuos bandgap įtampą.




Reikia priminti, jog bandgap atraminis šaltinis nėra labai tikslus, bet to pakanka pasiekti pagrindinį tikslą - išmatuoti maitinimo įtampą. O jeigu dar priedo galime atsisakyti aibės komponentų - tai tiesiog puiku! Tikiuosi nuo šiol žinosite, išbandysite  ir taikysite šį metodą savo praktikoje. Sėkmės!

Komentarų nėra:

Rašyti komentarą