SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
AXP202AdcTraits_impl.hpp
Go to the documentation of this file.
1
34#pragma once
35
36#include "AXP202AdcTraits.hpp"
37#include "AXP202Regs.hpp"
38
39namespace axp1xx
40{
41
43{
44 switch (ch) {
47 return (ch == PmicAdcBase::Channel::VBUS_VOLTAGE) ? 0x08 : 0x04;
50 return (ch == PmicAdcBase::Channel::ACIN_VOLTAGE) ? 0x20 : 0x10;
53 return (ch == PmicAdcBase::Channel::BAT_VOLTAGE) ? 0x80 : 0x40;
55 return 0x02; // APS_VOLTAGE
57 return 0x8000; // REG83H bit 7
59 return 0; // No enable mask needed for battery percentage
60 default:
61 return 0;
62 }
63}
64
65inline uint16_t AdcTraitsBase<AXP202Core>::readRegisterH8L4(AXP202Core &core, uint8_t regH, uint8_t regL)
66{
67 int h = core.readReg(regH);
68 int l = core.readReg(regL);
69 if (h < 0 || l < 0) {
70 return 0xFFFF;
71 }
72 return (static_cast<uint16_t>(h) << 4) | (static_cast<uint16_t>(l) & 0x0F);
73}
74
76{
77 // Check device state for VBUS and BAT channels
80 if (s0 < 0) return false;
81 if (!((s0 >> 5) & 0x01)) {
82 out = 0.0f;
83 return true;
84 }
85 }
88 if (s1 < 0) return false;
89 if (!((s1 >> 5) & 0x01)) {
90 out = 0.0f;
91 return true;
92 }
93 }
94
95 switch (ch) {
97 uint16_t raw = readRegisterH8L4(core, axp202_regs::adc::VBUS_VOL_H, axp202_regs::adc::VBUS_VOL_L);
98 if (raw == 0xFFFF) return false;
99 out = static_cast<float>(raw) * axp202_regs::factory::FACTORY_VBUS_VOLTAGE;
100 break;
101 }
102
104 uint16_t raw = readRegisterH8L4(core, axp202_regs::adc::VBUS_CUR_H, axp202_regs::adc::VBUS_CUR_L);
105 if (raw == 0xFFFF) return false;
106 out = static_cast<float>(raw) * axp202_regs::factory::FACTORY_VBUS_CURRENT;
107 break;
108 }
109
111 uint16_t raw = readRegisterH8L4(core, axp202_regs::adc::BAT_AVERVOL_H, axp202_regs::adc::BAT_AVERVOL_L);
112 if (raw == 0xFFFF) return false;
113 out = static_cast<float>(raw) * axp202_regs::factory::FACTORY_VBAT_VOLTAGE;
114 break;
115 }
116
119 if (s0 < 0) return false;
120 bool charging = (s0 >> 2) & 0x01;
122 uint16_t raw;
123 if (charging) {
124 raw = readRegisterH8L4(core, regH, axp202_regs::adc::BAT_AVERCHGCUR_L);
125 if (raw == 0xFFFF) return false;
126 } else {
127 int h = core.readReg(regH);
129 if (h < 0 || l < 0) return false;
130 raw = (static_cast<uint16_t>(h) << 5) | (static_cast<uint16_t>(l) & 0x1F);
131 }
132 out = static_cast<float>(raw) * axp202_regs::factory::FACTORY_BAT_CURRENT;
133 if (!charging) {
134 out = -out; // Negative for discharge
135 }
136 break;
137 }
138
140 uint16_t raw = readRegisterH8L4(core, axp202_regs::adc::APS_AVERVOL_H, axp202_regs::adc::APS_AVERVOL_L);
141 if (raw == 0xFFFF) return false;
142 out = static_cast<float>(raw) * axp202_regs::factory::FACTORY_APS_VOLTAGE;
143 break;
144 }
145
147 uint16_t raw = readRegisterH8L4(core, axp202_regs::adc::INTERNAL_TEMP_H, axp202_regs::adc::INTERNAL_TEMP_L);
148 if (raw == 0xFFFF) return false;
150 break;
151 }
152
154 return false;
155
158 if (val < 0) return false;
159 out = static_cast<float>(val & 0x7F);
160 break;
161 }
162
163 default:
164 return false;
165 }
166 return true;
167}
168
169} // namespace axp1xx
@license MIT License
@license MIT License
Channel
ADC channel bitmask.
@ BAT_PERCENTAGE
Battery percentage.
@ DIE_TEMPERATURE
Die temperature.
@ BAT_VOLTAGE
Battery voltage.
@ BAT_TEMPERATURE
Battery temperature.
@ ACIN_VOLTAGE
ACIN voltage.
@ BAT_CURRENT
Battery current.
@ VBUS_CURRENT
VBUS current.
@ VBUS_VOLTAGE
VBUS voltage.
@ ACIN_CURRENT
ACIN current.
@ VSYS_VOLTAGE
VSYS voltage.
int readReg(uint8_t reg) const
Base traits class for AXP1xxAdc template specialization.
static bool readChannel(CoreType &core, PmicAdcBase::Channel ch, float &out)
Main ADC channel reading implementation.
static uint32_t getChannelMask(PmicAdcBase::Channel ch)
Map a Channel enum to its hardware enable mask.
static constexpr uint8_t BATT_PERCENTAGE
static constexpr uint8_t INTERNAL_TEMP_H
static constexpr uint8_t BAT_AVERVOL_L
static constexpr uint8_t VBUS_CUR_L
static constexpr uint8_t APS_AVERVOL_L
static constexpr uint8_t VBUS_VOL_H
static constexpr uint8_t BAT_AVERDISCHGCUR_H
static constexpr uint8_t BAT_AVERDISCHGCUR_L
static constexpr uint8_t BAT_AVERCHGCUR_H
static constexpr uint8_t APS_AVERVOL_H
static constexpr uint8_t INTERNAL_TEMP_L
static constexpr uint8_t BAT_AVERVOL_H
static constexpr uint8_t VBUS_CUR_H
static constexpr uint8_t VBUS_VOL_L
static constexpr uint8_t BAT_AVERCHGCUR_L
static constexpr uint8_t STATUS
static constexpr uint8_t MODE_CHGSTATUS
static constexpr float FACTORY_VBAT_VOLTAGE
static constexpr float FACTORY_APS_VOLTAGE
static constexpr float FACTORY_INTERNAL_OFFSET
static constexpr float FACTORY_BAT_CURRENT
static constexpr float FACTORY_VBUS_VOLTAGE
static constexpr float FACTORY_VBUS_CURRENT
static constexpr float FACTORY_INTERNAL_TEMP