Zkušenosti z praktického nasazení mě přimělo realizovat monitor stavu napájecích LiPol akumulátorů. A o tom je tento článek.
Teorie
ESP8266 má pouze jeden AD převodník, na který přivedeme napětí z monitorovaného článku přes napěťový dělič. Parametry děliče vypočítáme pro maximální měřené napětí (5V) a maximální povolené napětí na AD převodníku (1V). Pak vybereme z odporů nejbližší hodnoty a pro jistotu přepočítáme, abychom se nedostali nad povolenou mez.
Více na Wikipedii
Mechanická konstrukce
Pro napájení používám WeMos Battery Shield, který:
- Pro napájená zařízení zajistí napětí 5V a 3.3V bez ohledu na to, jestli je připojen akumulátor a/nebo USB
- Pokud je na připojeném USB napětí 5-10V, zajistí správné nabíjení připojené lithiové baterie
Takže po mechanické stránce musíme propojit napěťový dělič s pinem A0, což ilustrují následují fotografie.
Potřebné součástky LiIon (ze starého notebooku), bužírky, lépe smršťovačky, rezistory o hodnotách 100k a 22k Rezistory jsou po dvou kusech, protože vyrábím pro dva kusy. |
Rezistory spojíme, společný vývod povede k A0,
horní vývod povede k GND (nula) a dolní vývod k Vcc [+]
|
Vývody zatáhneme do smršťovaček. |
Naohýbáme vývody tak, abychom je pak mohli pouze připájet. |
Připájíme vývody, spodní (rezistor 100k) k Vcc [+] (vpravo), horní (rezistor 22k) k GND [-] (vlevo, víc ke středu). |
Společný vývod připájíme ze spodní strany k vývodu A0 |
Hotovo! |
Program
Používám kombinaci NodeMCU a Lua, takže do firmware musíme přikompilovat modul ADC. Hodnoty měřím několikrát, minima a maxima odstraním a ze zbytku vypočítám průměr. K tomu mi slouží modul s funkcí getVoltage(...).
Jinak lze samozřejmě použít pouhé zavolání inicializace, následně čtení dat z převodníku a vynásobení koeficientem:
adc.force_init_mode(adc.INIT_ADC) -- inicializace AD prevodniku voltage = 0.0183 * adc.read(0) -- ctení a vypocet napeti
Použití:
-- merime napeti power = require("power") voltage = power.getVoltage(10,2) --
Tady je funkce getVoltage(...)
-- Funkce pro mereni napeti z AD prevodniku -- Potrebuje mit ve FW modul ADC -- Koeficient je vypocten pro rezistory delice napeti o hodnotach -- 100k (k V+) a 22k (ke GND) -- Vraci napeti z AD prevodniku. -- 'measuringCount' je celkovy pocet mereni -- 'measuringCut' je pocet 'odstranenych' minim a maxim local moduleName = ... local M = {} function M.getVoltage(measuringCount, measuringCut) -- inicializace AD prevodniku adc.force_init_mode(adc.INIT_ADC) local voltageTable = {} for i=1, measuringCount, 1 do -- prodleva je nutna pro spravne nabiti kondenzatoru v prevodniku tmr.delay(100000) voltageTable[i] = adc.read(0) end table.sort(voltageTable) local voltageSum = 0 for i=measuringCut + 1, measuringCount - 2*measuringCut + 2, 1 do voltageSum = voltageSum + voltageTable[i] end --0.0183 (vypocitany koeficient) voltage = 0.0183*(voltageSum / (measuringCount - 2*measuringCut)) return voltage end print(M.getVoltage(10,2)) -- je pro testy return M
Tomu říkám čistá práce. V podstatě nechápu jak je to možné, protože se výrobou teprve učím, ale mít takovouhle schopnost tak si dělám li-pol baterie úplně sám :)
OdpovědětVymazatDík :-D
OdpovědětVymazat