SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
sy6970_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 5
35#endif
36
37#ifndef PMIC_SCL
38#define PMIC_SCL 6
39#endif
40
41#ifndef PMIC_IRQ
42#define PMIC_IRQ 21
43#endif
44
45volatile bool isFaultTrigger = false;
46uint32_t interval = 0;
47
49
50#define CHECK_FOR_ERRORS(condition) if (condition) {Serial.println("SY6970 error"); while(1)delay(1000);}
51
53{
54 Serial.println("");
55 Serial.println("╔══════════════════════════════════════════╗");
56 Serial.println("║ SY6970 Charger Test ║");
57 Serial.println("╚══════════════════════════════════════════╝");
58 Serial.println("");
59}
60
61void setup()
62{
63 bool rlst;
64
65 Serial.begin(115200);
66 while (!Serial) {
67 delay(10);
68 }
69
71
72 rlst = bmu.begin(Wire, SY6970_SLAVE_ADDRESS, PMIC_SDA, PMIC_SCL);
73 if (!rlst) {
74 Serial.println("SY6970 begin() failed. Check wiring");
75 while (1) {
76 delay(1000);
77 }
78 }
79
80 Serial.println("SY6970 initialized successfully");
81
82 // bmu.led().setMode(PmicLedBase::Mode::AUTO); // STAT pin indicates charging status
83 bmu.led().setMode(PmicLedBase::Mode::DISABLE); // DISABLE LED to save power (if STAT pin is not used for indication)
84
85 // Charge current: 64-1024mA, 64mA steps (fuzzy: auto-adjusts to nearest valid value)
86 rlst = bmu.charger().setPreChargeCurrent(256);
87 CHECK_FOR_ERRORS(!rlst);
88 // Fast charge current: 0-3008mA, 64mA steps (fuzzy: auto-adjusts to nearest valid value)
89 rlst = bmu.charger().setFastChargeCurrent(1024);
90 CHECK_FOR_ERRORS(!rlst);
91 // Termination current: 64-1024mA, 64mA steps (fuzzy: auto-adjusts to nearest valid value)
93 CHECK_FOR_ERRORS(!rlst);
94 // Charge voltage: 3840-4608mV, 16mV steps (fuzzy: auto-adjusts to nearest valid value)
95 rlst = bmu.charger().setChargeVoltage(4288);
96 CHECK_FOR_ERRORS(!rlst);
97
98 Serial.print("Pre Charge Current: ");
99 Serial.println(bmu.charger().getPreChargeCurrent());
100 Serial.print("Fast Charge Current: ");
101 Serial.println(bmu.charger().getFastChargeCurrent());
102 Serial.print("Termination Current: ");
103 Serial.println(bmu.charger().getTerminationCurrent());
104 Serial.print("Charge Voltage: ");
105 Serial.println(bmu.charger().getChargeVoltage());
106
107 // Input current limit: 100-3008mA, 100mA steps (fuzzy: auto-adjusts to nearest valid value)
109 // Input voltage limit: 3900-14000mV, 100mV steps (fuzzy: auto-adjusts to nearest valid value)
111 // System minimum voltage: 3000-3700mV, 100mV steps (fuzzy: auto-adjusts to nearest valid value)
113
114 Serial.print("Input Current Limit: ");
115 Serial.println(bmu.power().getInputCurrentLimit());
116 Serial.print("Input Voltage Limit: ");
117 Serial.println(bmu.power().getInputVoltageLimit());
118 Serial.print("Minimum System Voltage: ");
119 Serial.println(bmu.power().getMinimumSystemVoltage());
120
121 // Enable ADC channels (VBUS voltage, Battery voltage, VSYS voltage, Charging current, NTC temperature)
123
124 // Disabling ADC can reduce quiescent current.
125 // If call `read` directly after disabling `adc`, it will trigger a single read operation.
126 // bmu.adc().disableChannels(0); // No specific channels to disable, but call for compatibility
127
128 Serial.println("Setup complete!");
129
130#if PMIC_IRQ != -1
131 pinMode(PMIC_IRQ, INPUT_PULLUP);
132 attachInterrupt(PMIC_IRQ, +[]() {
133 isFaultTrigger = true;
134 }, FALLING);
135#endif
136}
137
138
139void loop()
140{
141#if PMIC_IRQ != -1
142 if (isFaultTrigger) {
143 isFaultTrigger = false;
145 if (status.fault) {
146 Serial.print("Fault Code: ");
147 Serial.println(status.faultCode);
148
149 using namespace SY6970Faults;
150 if (isWatchdogTimeout(status.faultCode)) {
151 Serial.println("\t Watchdog Fault");
152 }
153 if (isBoostFault(status.faultCode)) {
154 Serial.println("\t Boost Mode Fault");
155 }
156 if (isChargeFault(status.faultCode)) {
157 Serial.println("\t Charge Mode Fault");
158 if (isChargeInputFault(status.faultCode)) {
159 Serial.println("\t - Input Fault (BUS OVP or VBAT<BUS<3.8V)");
160 }
161 if (isChargeThermalFault(status.faultCode)) {
162 Serial.println("\t - Thermal Shutdown");
163 }
164 if (isChargeTimerFault(status.faultCode)) {
165 Serial.println("\t - Safety Timer Expiration");
166 }
167 }
168 if (isBatteryFault(status.faultCode)) {
169 Serial.println("\t Battery Fault (BATOVP)");
170 }
171 uint8_t ntcFault = getNtcFault(status.faultCode);
172 if (ntcFault) {
173 Serial.println("\t NTC Fault");
174 }
175 }
176 }
177#endif
178
179
180 if (millis() > interval) {
181 interval = millis() + 3000;
182
183 Serial.println("\n========== SY6970 Status ==========");
184
185 float val;
186 bool ret;
187
189 Serial.print("VBUS Voltage: ");
190 Serial.print(ret ? val : -1);
191 Serial.println(" mV");
192
194 Serial.print("Battery Voltage: ");
195 Serial.print(ret ? val : -1);
196 Serial.println(" mV");
197
199 Serial.print("VSYS Voltage: ");
200 Serial.print(ret ? val : -1);
201 Serial.println(" mV");
202
204 Serial.print("Battery Current: ");
205 Serial.print(ret ? val : -1);
206 Serial.println(" mA");
207
209 Serial.print("NTC Temperature: ");
210 Serial.print(ret ? val : -1);
211 Serial.println(" %");
212
213 Serial.print("Charging: ");
214 Serial.println(bmu.charger().isCharging() ? "Yes" : "No");
215
217 Serial.print("Online: ");
218 Serial.println(status.online ? "Yes" : "No");
219 Serial.print("VBUS Present: ");
220 Serial.println(status.vbusPresent ? "Yes" : "No");
221 Serial.print("Charge Done: ");
222 Serial.println(status.chargeDone ? "Yes" : "No");
223 Serial.print("Fault: ");
224 Serial.println(status.fault ? "Yes" : "No");
225
226 Serial.print("Boost Enabled: ");
227 Serial.println(bmu.power().isBoostEnabled() ? "Yes" : "No");
228
229 Serial.print("Boost Voltage: ");
230 Serial.println(bmu.power().getBoostVoltage());
231
232 Serial.println("===================================\n");
233 }
234}
@license MIT License
@ BAT_VOLTAGE
Battery voltage.
@ BAT_TEMPERATURE
Battery temperature.
@ BAT_CURRENT
Battery current.
@ VBUS_VOLTAGE
VBUS voltage.
@ VSYS_VOLTAGE
VSYS voltage.
@ DISABLE
LED is disabled (if supported).
bool begin(SensorCommCustom::CustomCallback callback, SensorCommCustomHal::CustomHalCallback hal_cb, uint8_t addr)
Initialize using custom I2C callback.
SY6970Power & power()
SY6970Adc & adc()
SY6970Charger & charger()
Get charger interface.
SY6970Led & led()
static constexpr uint8_t ADC_CONV_START
ADC control flags.
Definition SY6970Adc.hpp:78
bool enableChannels(uint32_t mask) override
Enable one or more ADC channels.
Definition SY6970Adc.cpp:40
bool read(Channel ch, float &out) override
Read ADC value for specified channel.
Definition SY6970Adc.cpp:52
bool setPreChargeCurrent(uint16_t mA) override
Set pre-charge current.
uint16_t getTerminationCurrent() override
Get termination current.
uint16_t getFastChargeCurrent() override
Get fast charge (constant-current) current.
bool setChargeVoltage(uint16_t mV) override
Set charge voltage (CV).
bool setFastChargeCurrent(uint16_t mA) override
Set fast charge (constant-current) current.
uint16_t getChargeVoltage() override
Get charge voltage (CV).
bool isCharging() override
Check whether charger is currently charging (best-effort).
Status getStatus() override
Get charger status.
uint16_t getPreChargeCurrent() override
Get pre-charge current.
bool setTerminationCurrent(uint16_t mA) override
Set termination current.
bool setMode(Mode mode) override
Set LED operating mode.
Definition SY6970Led.cpp:46
bool setInputCurrentLimit(uint32_t mA) override
Set input current limit.
bool isBoostEnabled() const override
Check if boost mode is enabled.
uint32_t getInputVoltageLimit() const override
Get input voltage limit.
uint32_t getInputCurrentLimit() const override
Get input current limit.
bool setInputVoltageLimit(uint32_t mv) override
Set input voltage limit (VINDPM)
bool setMinimumSystemVoltage(uint32_t mv) override
Set minimum system voltage.
uint16_t getBoostVoltage() const override
Get boost output voltage.
uint32_t getMinimumSystemVoltage() const override
Get minimum system voltage.
Charger status structure.
bool vbusPresent
VBUS detected / good (USB power present)
bool chargeDone
Charge termination/done (battery full)
uint32_t faultCode
Optional raw fault code for diagnostics.
bool fault
Any fault latched/active.
bool online
PMIC reachable / initialized.
#define PMIC_SDA
volatile bool isFaultTrigger
#define PMIC_SCL
void setup()
#define PMIC_IRQ
#define CHECK_FOR_ERRORS(condition)
uint32_t interval
PmicSY6970 bmu
void printBanner()
void loop()