summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-01-21 14:10:25 +1100
committerjacqueline <me@jacqueline.id.au>2023-01-21 14:10:25 +1100
commitf013bab7276b8d5e606cee636e31f2157cd6e34d (patch)
treec7ccac33cb17fe2afc4b4d7dd3bcf923121c027d /src
parent393b268e159a40b23bc63464f4d04d5be09e070f (diff)
downloadtangara-fw-f013bab7276b8d5e606cee636e31f2157cd6e34d.tar.gz
Migrate to the v5 adc api
Diffstat (limited to 'src')
-rw-r--r--src/drivers/CMakeLists.txt2
-rw-r--r--src/drivers/battery.cpp59
-rw-r--r--src/drivers/include/battery.hpp21
-rw-r--r--src/main/main.cpp5
4 files changed, 61 insertions, 26 deletions
diff --git a/src/drivers/CMakeLists.txt b/src/drivers/CMakeLists.txt
index 4c8d4275..c4e4c172 100644
--- a/src/drivers/CMakeLists.txt
+++ b/src/drivers/CMakeLists.txt
@@ -2,5 +2,5 @@ idf_component_register(
SRCS "dac.cpp" "gpio_expander.cpp" "battery.cpp" "storage.cpp" "i2c.cpp"
"spi.cpp" "display.cpp" "display_init.cpp"
INCLUDE_DIRS "include"
- REQUIRES "esp_adc_cal" "fatfs" "result" "lvgl" "span")
+ REQUIRES "esp_adc" "fatfs" "result" "lvgl" "span")
target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS})
diff --git a/src/drivers/battery.cpp b/src/drivers/battery.cpp
index b3341eab..b45e20cf 100644
--- a/src/drivers/battery.cpp
+++ b/src/drivers/battery.cpp
@@ -1,31 +1,54 @@
#include "battery.hpp"
+#include <cstdint>
-#include "driver/adc.h"
-#include "esp_adc_cal.h"
+#include "esp_adc/adc_oneshot.h"
#include "hal/adc_types.h"
namespace drivers {
-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);
+static const uint8_t kAdcBitWidth = ADC_BITWIDTH_12;
+static const uint8_t kAdcUnit = ADC_UNIT_1;
+// 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.
+static const uint8_t kAdcAttenuation = ADC_ATTEN_DB_11;
+// Corresponds to GPIO 34.
+static const uint8_t kAdcChannel = ADC_CHANNEL_6;
+
+Battery::Battery() {
+ adc_oneshot_unit_init_cfg_t unit_config = {
+ .unit_id = kAdcUnit,
+ };
+ ESP_ERROR_CHECK(adc_oneshot_new_unit(&unit_config, &adc_handle_));
+
+ adc_oneshot_chan_cfg_t channel_config = {
+ .bitwidth = kAdcBitWidth,
+ .atten = kAdcAttenuation,
+ };
+ ESP_ERROR_CHECK(adc_oneshot_config_channel(adc_handle_, kAdcChannel, &channel_config));
+
+ // calibrate
+ // TODO: compile-time assert our scheme is available
+ adc_cali_line_fitting_config_t calibration_config = {
+ .unit_id = kAdcUnit,
+ .atten = kAdcAttenuation,
+ .bitwidth = kAdcBitWidth,
+ };
+ ESP_ERROR_CHECK(adc_cali_create_scheme_line_fitting(&calibration_config, &adc_calibration_handle_));
+}
- return ESP_OK;
+Battery::~Battery() {
+ adc_cali_delete_scheme_line_fitting(adc_calibration_handle_);
}
-uint32_t read_battery_voltage(void) {
+auto Battery::Millivolts() -> uint32_t {
// GPIO 34
- int raw = adc1_get_raw(ADC1_CHANNEL_6);
- return esp_adc_cal_raw_to_voltage(raw, &calibration);
+ int raw;
+ ESP_ERROR_CHECK(adc_oneshot_read(adc_handle, kAdcChannel &raw));
+
+ int voltage;
+ ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc_calibration_handle, raw, &voltage));
+
+ return voltage;
}
} // namespace drivers
diff --git a/src/drivers/include/battery.hpp b/src/drivers/include/battery.hpp
index 9358f9b0..9366a5b1 100644
--- a/src/drivers/include/battery.hpp
+++ b/src/drivers/include/battery.hpp
@@ -1,16 +1,25 @@
#pragma once
-#include <stdint.h>
+#include <cstdint>
+#include "esp_adc/adc_oneshot.h"
#include "esp_err.h"
+#include "result.hpp"
namespace drivers {
-esp_err_t init_adc(void);
+class Battery {
+ public:
+ Battery();
+ ~Battery();
-/**
- * Returns the current battery level in millivolts.
- */
-uint32_t read_battery_voltage(void);
+ /**
+ * Returns the current battery level in millivolts.
+ */
+ auto Millivolts() -> uint32_t;
+ private:
+ adc_oneshot_handle_t adc_handle_;
+ adc_cali_handle_t adc_calibration_handle_;
+};
} // namespace drivers
diff --git a/src/main/main.cpp b/src/main/main.cpp
index deef29e1..ad4b2d01 100644
--- a/src/main/main.cpp
+++ b/src/main/main.cpp
@@ -92,7 +92,6 @@ extern "C" void app_main(void) {
ESP_ERROR_CHECK(gpio_install_isr_service(ESP_INTR_FLAG_LOWMED));
ESP_ERROR_CHECK(drivers::init_i2c());
ESP_ERROR_CHECK(drivers::init_spi());
- ESP_ERROR_CHECK(drivers::init_adc());
ESP_LOGI(TAG, "Init GPIOs");
drivers::GpioExpander* expander = new drivers::GpioExpander();
@@ -105,6 +104,10 @@ extern "C" void app_main(void) {
drivers::GpioExpander::SD_MUX_ESP);
});
+ ESP_LOGI(TAG, "Init battery measurement");
+ drivers::Battery* battery = new drivers::Battery();
+ ESP_LOGI(TAG, "it's reading %dmV!", battery->Millivolts());
+
ESP_LOGI(TAG, "Init SD card");
auto storage_res = drivers::SdStorage::create(expander);
if (storage_res.has_error()) {