SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
bq25896_charger.ino
Go to the documentation of this file.
1
29#include <Arduino.h>
30#include <Wire.h>
31#include <PmicDrv.hpp>
32
33#ifndef PMIC_SDA
34#define PMIC_SDA 3
35#endif
36
37#ifndef PMIC_SCL
38#define PMIC_SCL 2
39#endif
40
41#ifndef PMIC_IRQ
42#define PMIC_IRQ -1
43#endif
44
45uint32_t interval = 0;
47
48#define CHECK_FOR_ERRORS(condition) if (condition) {Serial.println("BQ25896 error"); while(1)delay(1000);}
49
51{
52 Serial.println("");
53 Serial.println("╔══════════════════════════════════════════╗");
54 Serial.println("║ BQ25896 Charger Test ║");
55 Serial.println("╚══════════════════════════════════════════╝");
56 Serial.println("");
57}
58
59void setup()
60{
61 bool rlst;
62
63 Serial.begin(115200);
64 while (!Serial) {
65 delay(10);
66 }
67
69
70 rlst = bmu.begin(Wire, BQ25896_SLAVE_ADDRESS, PMIC_SDA, PMIC_SCL);
71 if (!rlst) {
72 Serial.println("BQ25896 begin() failed. Check wiring.");
73 while (1) {
74 delay(1000);
75 }
76 }
77
78 Serial.println("BQ25896 initialized successfully");
79
80 // bmu.led().setMode(PmicLedBase::Mode::AUTO); // STAT pin indicates charging status
81 bmu.led().setMode(PmicLedBase::Mode::DISABLE); // DISABLE LED to save power (if STAT pin is not used for indication)
82
83 // Charge current: 64-1024mA, 64mA steps (fuzzy: auto-adjusts to nearest valid value)
84 rlst = bmu.charger().setPreChargeCurrent(256);
85 CHECK_FOR_ERRORS(!rlst);
86 // Fast charge current: 0-3008mA, 64mA steps (fuzzy: auto-adjusts to nearest valid value)
87 rlst = bmu.charger().setFastChargeCurrent(1024);
88 CHECK_FOR_ERRORS(!rlst);
89 // Termination current: 64-1024mA, 64mA steps (fuzzy: auto-adjusts to nearest valid value)
91 CHECK_FOR_ERRORS(!rlst);
92 // Charge voltage: 3840-4608mV, 16mV steps (fuzzy: auto-adjusts to nearest valid value)
93 rlst = bmu.charger().setChargeVoltage(4350);
94 CHECK_FOR_ERRORS(!rlst);
95
96 Serial.print("Pre Charge Current: ");
97 Serial.println(bmu.charger().getPreChargeCurrent());
98 Serial.print("Fast Charge Current: ");
99 Serial.println(bmu.charger().getFastChargeCurrent());
100 Serial.print("Termination Current: ");
101 Serial.println(bmu.charger().getTerminationCurrent());
102 Serial.print("Charge Voltage: ");
103 Serial.println(bmu.charger().getChargeVoltage());
104
105 // Input current limit: 100-3008mA, 100mA steps (fuzzy: auto-adjusts to nearest valid value)
107 // Input voltage limit: 3900-14000mV, 100mV steps (fuzzy: auto-adjusts to nearest valid value)
109 // System minimum voltage: 3000-3700mV, 100mV steps (fuzzy: auto-adjusts to nearest valid value)
111
112 Serial.print("Input Current Limit: ");
113 Serial.println(bmu.power().getInputCurrentLimit());
114 Serial.print("Input Voltage Limit: ");
115 Serial.println(bmu.power().getInputVoltageLimit());
116 Serial.print("Minimum System Voltage: ");
117 Serial.println(bmu.power().getMinimumSystemVoltage());
118
119 // Enable ADC channels (VBUS voltage, Battery voltage, VSYS voltage, Charging current, NTC temperature)
121
122 // Disabling ADC can reduce quiescent current.
123 // If call `read` directly after disabling `adc`, it will trigger a single read operation.
124 // bmu.adc().disableChannels(0); // No specific channels to disable, but call for compatibility
125
126 Serial.println("Setup complete!");
127}
128
129
130void loop()
131{
132 if (millis() > interval) {
133 interval = millis() + 3000;
134
135 Serial.println("\n========== BQ25896 Status ==========");
136
137 float val;
138 bool ret;
139
141 Serial.print("VBUS Voltage: ");
142 Serial.print(ret ? val : -1);
143 Serial.println(" mV");
144
146 Serial.print("Battery Voltage: ");
147 Serial.print(ret ? val : -1);
148 Serial.println(" mV");
149
151 Serial.print("VSYS Voltage: ");
152 Serial.print(ret ? val : -1);
153 Serial.println(" mV");
154
156 Serial.print("Battery Current: ");
157 Serial.print(ret ? val : -1);
158 Serial.println(" mA");
159
161 Serial.print("NTC Temperature: ");
162 Serial.print(ret ? val : -1);
163 Serial.println(" %");
164
165 Serial.print("Charging: ");
166 Serial.println(bmu.charger().isCharging() ? "Yes" : "No");
167
169 Serial.print("Online: ");
170 Serial.println(status.online ? "Yes" : "No");
171 Serial.print("VBUS Present: ");
172 Serial.println(status.vbusPresent ? "Yes" : "No");
173 Serial.print("Charge Done: ");
174 Serial.println(status.chargeDone ? "Yes" : "No");
175 Serial.print("Fault: ");
176 Serial.println(status.fault ? "Yes" : "No");
177
178 Serial.print("Boost Enabled: ");
179 Serial.println(bmu.power().isBoostEnabled() ? "Yes" : "No");
180
181 Serial.print("Boost Voltage: ");
182 Serial.println(bmu.power().getBoostVoltage());
183
184 Serial.print("ICO Optimized: ");
185 Serial.println(bmu.core().isInputCurrentOptimizerOptimized() ? "Yes" : "No");
186
187 Serial.print("VINDPM Active: ");
188 Serial.println(bmu.core().isVindpmActive() ? "Yes" : "No");
189
190 Serial.print("IINDPM Active: ");
191 Serial.println(bmu.core().isIindpmActive() ? "Yes" : "No");
192
193 Serial.print("VSYS in Regulation: ");
194 Serial.println(bmu.core().isVsysInRegulation() ? "Yes" : "No");
195
196 Serial.println("===================================\n");
197 }
198}
@license MIT License
#define PMIC_SDA
#define PMIC_SCL
void setup()
PmicBQ25896 bmu
#define CHECK_FOR_ERRORS(condition)
uint32_t interval
void printBanner()
void loop()
bool enableChannels(uint32_t mask) override
Enable one or more ADC channels.
static constexpr uint8_t ADC_CONV_START
ADC control flags.
bool read(Channel ch, float &out) override
Read ADC value for specified channel.
bool setFastChargeCurrent(uint16_t mA) override
Set fast charge (constant-current) current.
uint16_t getPreChargeCurrent() override
Get pre-charge current.
uint16_t getFastChargeCurrent() override
Get fast charge current.
bool setTerminationCurrent(uint16_t mA) override
Set termination current.
bool setChargeVoltage(uint16_t mV) override
Set charge voltage (constant voltage phase)
uint16_t getChargeVoltage() override
Get charge voltage.
bool isCharging() override
Check if charging is in progress.
bool setPreChargeCurrent(uint16_t mA) override
Set pre-charge current.
uint16_t getTerminationCurrent() override
Get termination current.
Status getStatus() override
Get charger status.
bool isInputCurrentOptimizerOptimized()
Check if Input Current Optimizer has optimized.
bool isVsysInRegulation()
Check if VSYS is in regulation.
bool isVindpmActive()
Get fault status.
bool isIindpmActive()
Check if IINDPM is active (input current limiting)
bool setMode(Mode mode) override
Set LED operating mode.
bool isBoostEnabled() const override
Check if boost mode is enabled.
bool setMinimumSystemVoltage(uint32_t mv) override
Set minimum system voltage.
bool setInputVoltageLimit(uint32_t mv) override
Set input voltage limit (VINDPM)
bool setInputCurrentLimit(uint32_t mA) override
Set input current limit.
uint32_t getInputVoltageLimit() const override
Get input voltage limit.
uint16_t getBoostVoltage() const override
Get boost output voltage.
uint32_t getInputCurrentLimit() const override
Get input current limit.
uint32_t getMinimumSystemVoltage() const override
Get minimum system voltage.
@ BAT_VOLTAGE
Battery voltage.
@ BAT_TEMPERATURE
Battery temperature.
@ BAT_CURRENT
Battery current.
@ VBUS_VOLTAGE
VBUS voltage.
@ VSYS_VOLTAGE
VSYS voltage.
BQ25896Adc & adc()
BQ25896Core & core()
Get core interface (mutable)
BQ25896Led & led()
BQ25896Power & power()
bool begin(SensorCommCustom::CustomCallback callback, SensorCommCustomHal::CustomHalCallback hal_cb, uint8_t addr)
Initialize using custom I2C callback.
BQ25896Charger & charger()
Get charger interface.
@ DISABLE
LED is disabled (if supported).
Charger status structure.
bool vbusPresent
VBUS detected / good (USB power present)
bool chargeDone
Charge termination/done (battery full)
bool fault
Any fault latched/active.
bool online
PMIC reachable / initialized.