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