Supported chemistries
| Chemistry | Charge V/cell | Cutoff V/cell | Charging | Gauge method |
|---|---|---|---|---|
| Li-ion / LiPo | 4.20 | 3.0 | CC/CV with JEITA derating | ModelGauge (voltage and coulomb) |
| LiHV | 4.35 | 3.0 | CC/CV with JEITA derating | ModelGauge |
| LiFePO4 | 3.60 | 2.5 | CC/CV with JEITA derating | Coulomb counting dominant |
| LiSOCl2 (primary) | never | 2.0 | Disabled in hardware and firmware | Coulomb counting from set capacity |
The charger covers 1S to 4S on every chemistry. On the Snowbird Pack the cell count is set by a resistor and the per-cell figures above apply to each cell, with passive balancing at 50 mA.
The chemistry jumper
A four-position solder jumper on the underside sets a hardware ceiling on the charge voltage. Software can select any chemistry at or below the ceiling and nothing above it.
| Position | Ceiling | Software may select |
|---|---|---|
| LFP | 3.60 V/cell | LiFePO4 |
| LI (shipped) | 4.20 V/cell | LiFePO4, Li-ion, LiPo |
| HV | 4.35 V/cell | LiFePO4, Li-ion, LiPo, LiHV |
| PRIMARY | charging disabled | LiSOCl2 |
Boards ship in the LI position. A LiHV cell needs the jumper moved to HV before setChemistry(Chem::LiHV) will be accepted. A LiFePO4 cell charges correctly in the LI position once the software chemistry is set, but moving the jumper to LFP means a wrong register write can never put 4.2 V on the cell.
The ceiling is enforced in hardware by a resistor divider on the charger's feedback that the supervisor cannot change. A firmware bug has to misconfigure two separate chips, the charger and the BMS, to overcharge a cell, and the jumper caps the first of them.
Setting the chemistry in software
pmic.setChemistry(Chem::LiFePO4);
pmic.setCapacity_mAh(3000);
The call writes the charge voltage and current profile to the charger and the overvoltage, undervoltage and overcurrent thresholds to the BMS in one transaction. The BMS keeps its safest defaults in non-volatile memory, which are the LiFePO4 thresholds and a conservative current, and the supervisor writes the real configuration into working memory at every boot. If the supervisor is absent or crashed the BMS is in its safe defaults.
The setting survives a power cycle and a host reflash. It does not survive a factoryReset().
Unlock and confirm
Changing the chemistry while a cell is connected is allowed, but a wrong value could overcharge the cell on the next USB plug-in. So the call takes effect only after a confirm:
pmic.unlock();
pmic.setChemistry(Chem::LiHV); // pending
pmic.confirm(); // within 5 s, or it reverts
The same sequence guards setOutputVoltage() and shipMode(), because each of them can take the host down. The sequence exists so that a stray write from a half-flashed sketch cannot change anything that matters.
Primary cells: LiSOCl2
Lithium thionyl chloride cells store a decade of energy and cannot be charged. Snowbird supports them as a primary cell mode, so a long-life sensor can still be serviced from USB.
Three independent blocks stop charge current from reaching the cell:
- The PRIMARY jumper position holds the charger's charge-enable pin inactive in hardware.
- Firmware refuses
setChargeCurrent_mA()in this mode and returnsErr::PrimaryCell. - The BMS overvoltage threshold is set 50 mV above the cell's open-circuit voltage, so any current into the cell trips the protector.
USB and solar still power the load through the power path. The cell is simply left alone while an input is present, and the gauge keeps counting.
Passivation
A stored LiSOCl2 cell forms a passivation layer and shows a voltage dip on first load. The firmware applies a 20 mA depassivation load for up to 30 s on first use and ignores the dip, so the gauge does not read a fresh cell as empty. If the voltage recovers above 3.3 V within that window the cell is accepted; otherwise Fault::UnderVoltage is set and the depassivation is retried on the next boot.
Pulse loads
A bobbin cell such as the ER14505 (2.4 Ah) tolerates roughly 100 mA continuous. An LTE or Wi-Fi burst is ten times that. Every 1S board has a footprint on VBAT for a hybrid layer capacitor or a 5 F supercapacitor, fitted on request at order time or by you. Without it the 5 V boost can brown the cell out under a radio burst. The LiSOCl2 ten-year sensor reference build shows the fitted part and the measured burst.
Capacity must be set
The gauge can only count charge out. State of charge is as accurate as the capacity you set and the cell's self-discharge, which is about 1 % per year. Set setCapacity_mAh() to the datasheet figure derated for the temperature your node lives at.
Multi-cell packs
The Snowbird Pack balances passively at 50 mA, which keeps matched cells matched and slowly corrects a mild mismatch. It will not rescue a pack of mixed cells. Use cells of the same make, capacity and age, and let the first full charge run to completion so the balancer can finish. imbalance_mV() reports the spread; above 50 mV at rest, the pack needs attention.
Raw cells on screw terminals are fine as long as the balance leads are connected. The board refuses to close the battery switch if the balance connector reports a different cell count from the cell-count resistor.
Mixing it up
A board set for one chemistry and plugged into another is the most common support question. The gauge notices: a LiFePO4 cell on a Li-ion setting reads as permanently 30 %, and a Li-ion cell on a LiFePO4 setting refuses to charge above 3.6 V and reads as full. Neither damages the cell, because the ceiling is at or above both. Set the chemistry, and set the capacity.