From 28d73ad8660e27f9c7b20b6e978d3d0c412dec00 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 7 Nov 2022 12:01:29 +1100 Subject: Split driver-y things into a separate component --- src/drivers/battery.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/drivers/battery.cpp (limited to 'src/drivers/battery.cpp') diff --git a/src/drivers/battery.cpp b/src/drivers/battery.cpp new file mode 100644 index 00000000..66c96daf --- /dev/null +++ b/src/drivers/battery.cpp @@ -0,0 +1,31 @@ +#include "battery.hpp" + +#include "driver/adc.h" +#include "esp_adc_cal.h" +#include "hal/adc_types.h" + +namespace gay_ipod { + +static esp_adc_cal_characteristics_t calibration; + +esp_err_t init_adc(void) { + // Calibration should already be fused into the chip from the factory, so + // we should only need to read it back out again. + esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 0, + &calibration); + + // Max battery voltage should be a little over 2V due to our divider, so + // we need the max attenuation to properly handle the full range. + adc1_config_width(ADC_WIDTH_BIT_12); + adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11); + + return ESP_OK; +} + +uint32_t read_battery_voltage(void) { + // GPIO 34 + int raw = adc1_get_raw(ADC1_CHANNEL_6); + return esp_adc_cal_raw_to_voltage(raw, &calibration); +} + +} // namespace gay_ipod -- cgit v1.2.3