SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
axp2101_basic.ino
Go to the documentation of this file.
1
30#include <PmicXPowers.hpp>
31
32#ifndef PMIC_SDA
33#define PMIC_SDA 3
34#endif
35
36#ifndef PMIC_SCL
37#define PMIC_SCL 2
38#endif
39
40#ifndef PMIC_IRQ
41#define PMIC_IRQ 21
42#endif
43
45
46void setup()
47{
48 Serial.begin(115200);
49 delay(500);
50
51 Serial.println("\n=== AXP2101 Basic Example ===\n");
52
53 if (!pmic.begin(Wire, AXP2101_SLAVE_ADDRESS, PMIC_SDA, PMIC_SCL)) {
54 Serial.println("Failed to init AXP2101!");
55 while (1) delay(1000);
56 }
57 Serial.println("AXP2101 initialized");
58
59 Serial.print("Chip ID: 0x");
60 Serial.println(pmic.getChipID(), HEX);
61
62 // Enable core modules
63 pmic.enableModule(PmicAXP2101::Module::GENERAL_ADC, true);
64 pmic.enableModule(PmicAXP2101::Module::CELL_CHARGE, true);
65 pmic.enableModule(PmicAXP2101::Module::BAT_DETECT, true);
66
67 Serial.println("\n--- Channel Test (DCDC1 & ALDO1) ---");
68
69 // Unified channel API: enable DCDC1 at 3.3V
72 Serial.print("DCDC1: ");
74 Serial.println(" mV");
75
76 // Enable ALDO1 at 1.8V
79 Serial.print("ALDO1: ");
81 Serial.println(" mV");
82
83 Serial.print("Total channels: ");
84 Serial.println(pmic.getChannel()->count());
85
86 // List all channels
87 for (uint8_t i = 0; i < pmic.getChannel()->count(); i++) {
88 auto info = pmic.getChannel()->getInfo(i);
89 Serial.print(" Ch");
90 Serial.print(i);
91 Serial.print(": ");
92 Serial.print(info.name);
93 Serial.print(" ");
94 Serial.print(info.minMillivolt);
95 Serial.print("-");
96 Serial.print(info.maxMillivolt);
97 Serial.print(" mV");
98 Serial.print(" Step: ");
99 Serial.print(info.stepMillivolt);
100 Serial.println(" mV");
101 }
102
103 Serial.println("\n--- Charger Test ---");
104
105 auto *charger = pmic.getCharger();
106 if (charger) {
107 // The Charge input parameter is fuzzed and set to the value closest to the input.
108 charger->setChargeVoltage(4200);
109 charger->setFastChargeCurrent(500);
110 charger->enableCharging(true);
111 Serial.print("CV: ");
112 Serial.print(charger->getChargeVoltage());
113 Serial.println(" mV");
114 Serial.print("ICC: ");
115 Serial.print(charger->getFastChargeCurrent());
116 Serial.println(" mA");
117 }
118
119 Serial.println("\n--- Power Button Test ---");
120 auto &button = pmic.pwron();
121 uint16_t onLevel[] = {512, 1000, 2000};
122 for (int i = 0; i < 3; i++) {
123 if (button.setOnDurationMs(onLevel[i])) {
124 delay(100);
125 uint16_t readLevel = 0;
126 button.getOnDurationMs(readLevel);
127 Serial.print("On Level ");
128 Serial.print(i);
129 Serial.print(": ");
130 Serial.println(readLevel);
131 if (readLevel == onLevel[i]) {
132 Serial.println("On Level set successfully");
133 } else {
134 Serial.print("On Level set failed");
135 Serial.print("Expected: ");
136 Serial.print(onLevel[i]);
137 Serial.print(", Got: ");
138 Serial.println(readLevel);
139 }
140 }
141 }
142
143 uint16_t offLevel[] = {6000, 8000, 10000};
144 for (int i = 0; i < 3; i++) {
145 if (button.setOffDurationMs(offLevel[i])) {
146 delay(100);
147 uint16_t readLevel = 0;
148 button.getOffDurationMs(readLevel);
149 Serial.print("Get Off Level ");
150 Serial.print(i);
151 Serial.print(": ");
152 Serial.println(readLevel);
153 if (readLevel == offLevel[i]) {
154 Serial.println("Off Level set successfully");
155 } else {
156 Serial.print("Off Level set failed");
157 Serial.print("Expected: ");
158 Serial.print(offLevel[i]);
159 Serial.print(", Got: ");
160 Serial.println(readLevel);
161 }
162 }
163 }
164
165 Serial.println("\n--- ADC Test ---");
166
167 // Enable ADC channels
168 auto &adc = pmic.adc();
169 adc.enableChannels(
174 );
175
176 Serial.println("\n=== Setup Complete ===\n");
177}
178
179void loop()
180{
181 static uint32_t lastPrint = 0;
182
183 if (millis() - lastPrint > 2000) {
184 lastPrint = millis();
185
186 Serial.println("\n--- Status ---");
187
188 Serial.print("VBUS good: ");
189 Serial.println(pmic.isVbusGood() ? "Yes" : "No");
190 Serial.print("Battery: ");
191 Serial.println(pmic.isBatteryConnect() ? "Present" : "Absent");
192
193 auto *charger = pmic.getCharger();
194 if (charger) {
195 auto status = charger->getStatus();
196 Serial.print("Charging: ");
197 Serial.println(status.charging ? "Yes" : "No");
198 Serial.print("Vbus: ");
199 Serial.println(status.vbusPresent ? "Present" : "Absent");
200 Serial.print("CHG Status: ");
201 switch (status.chargingStatus) {
203 Serial.println("Fast Charging");
204 break;
206 Serial.println("Pre Charging");
207 break;
209 Serial.println("No Charging");
210 break;
212 Serial.println("Termination Charging");
213 break;
214 default:
215 Serial.println("Unknown Charging Status");
216 break;
217 }
218 }
219
220 auto &adc = pmic.adc();
221 float val = 0;
222 if (adc.read(PmicAdcBase::Channel::BAT_PERCENTAGE, val)) {
223 Serial.print("BAT%: ");
224 Serial.print(val);
225 Serial.println("%");
226 }
227 if (adc.read(PmicAdcBase::Channel::VBUS_VOLTAGE, val)) {
228 Serial.print("VBUS: ");
229 Serial.print(val);
230 Serial.println(" mV");
231 }
232 if (adc.read(PmicAdcBase::Channel::BAT_VOLTAGE, val)) {
233 Serial.print("VBAT: ");
234 Serial.print(val);
235 Serial.println(" mV");
236 }
237 if (adc.read(PmicAdcBase::Channel::DIE_TEMPERATURE, val)) {
238 Serial.print("TEMP: ");
239 Serial.print(val);
240 Serial.println(" C");
241 }
242 if (adc.read(PmicAdcBase::Channel::VSYS_VOLTAGE, val)) {
243 Serial.print("VSYS: ");
244 Serial.print(val);
245 Serial.println(" mV");
246 }
247 }
248
249 delay(100);
250}
@license MIT License
#define PMIC_SDA
#define PMIC_SCL
void setup()
PmicAXP2101 pmic
void loop()
bool enableChannels(uint32_t mask) override
Enable one or more ADC channels.
static constexpr uint8_t CH_ALDO1
static constexpr uint8_t CH_DCDC1
Top-level unified interface for the AXP2101 PMIC.
PmicChannelBase * getChannel() override
Get the power output channel interface.
AXP2101Pwron & pwron()
Get the chip-specific power button interface.
bool isBatteryConnect()
Check if a battery is connected.
bool begin(SensorCommCustom::CustomCallback callback, SensorCommCustomHal::CustomHalCallback hal_cb, uint8_t addr)
Initialise the AXP2101 with custom communication callbacks.
AXP2101Adc & adc()
Get the chip-specific ADC interface.
PmicChargerBase * getCharger() override
Get the charger interface (pointer for optional support).
bool enableModule(Module module, bool enable)
Enable or disable an internal functional module.
bool isVbusGood()
Check if a valid VBUS power source is present.
uint8_t getChipID()
Read the AXP2101 chip ID / version register.
@ BAT_PERCENTAGE
Battery percentage.
@ DIE_TEMPERATURE
Die temperature.
@ BAT_VOLTAGE
Battery voltage.
@ BAT_TEMPERATURE
Battery temperature.
@ VBUS_VOLTAGE
VBUS voltage.
@ VSYS_VOLTAGE
VSYS voltage.
virtual uint16_t getVoltage(uint8_t channel)=0
Get the current output voltage of a channel.
virtual bool setVoltage(uint8_t channel, uint16_t mV)=0
Set the output voltage of a channel.
virtual uint8_t count() const =0
Get the number of power output channels available on this PMIC.
virtual bool enable(uint8_t channel, bool enable)=0
Enable or disable a power output channel.
virtual Info getInfo(uint8_t channel) const =0
Get static metadata for a specific channel.
virtual bool setChargeVoltage(uint16_t mV)=0
Set charge voltage (CV mode voltage)
virtual Status getStatus()=0
Get current charger status.
@ NO_CHARGING
Not charging, battery idle or disconnected.
@ PRE_CHARGE
Pre-charge phase (low current for weak battery)
@ TERMINATION
Charging terminated (battery full)
@ FAST_CHARGE
Fast charge phase (constant current)
uint8_t i