From 6bb17bb1794a5348799a1cdfae70d3b93795abbc Mon Sep 17 00:00:00 2001 From: anecdata <16617689+anecdata@users.noreply.github.com> Date: Thu, 17 Oct 2019 00:12:35 -0500 Subject: [PATCH] Add basic ADC calibration. --- arduino/cores/esp32/wiring_analog.c | 22 +++++++++++++++++++--- arduino/cores/esp32/wiring_analog.h | 2 +- main/CommandHandler.cpp | 4 +++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/arduino/cores/esp32/wiring_analog.c b/arduino/cores/esp32/wiring_analog.c index e72650d..9b80a0c 100644 --- a/arduino/cores/esp32/wiring_analog.c +++ b/arduino/cores/esp32/wiring_analog.c @@ -19,6 +19,7 @@ #include #include +#include #include #include "wiring_analog.h" @@ -46,33 +47,48 @@ void analogWrite(uint32_t pin, uint32_t value) ledc_channel_config(&ledc_conf); } -int analogRead(uint32_t pin) +int analogRead(uint32_t pin, uint32_t atten) { - int channel; + #define DEFAULT_VREF 1100 + static esp_adc_cal_characteristics_t *adc_chars; + adc_channel_t channel; + switch(pin) { case ADC1_CHANNEL_0_GPIO_NUM: channel = ADC1_GPIO36_CHANNEL; + break; case ADC1_CHANNEL_1_GPIO_NUM: channel = ADC1_GPIO37_CHANNEL; + break; case ADC1_CHANNEL_2_GPIO_NUM: channel = ADC1_GPIO38_CHANNEL; + break; case ADC1_CHANNEL_3_GPIO_NUM: channel = ADC1_GPIO39_CHANNEL; + break; case ADC1_CHANNEL_4_GPIO_NUM: channel = ADC1_GPIO32_CHANNEL; + break; case ADC1_CHANNEL_5_GPIO_NUM: channel = ADC1_GPIO33_CHANNEL; + break; case ADC1_CHANNEL_6_GPIO_NUM: channel = ADC1_GPIO34_CHANNEL; + break; case ADC1_CHANNEL_7_GPIO_NUM: channel = ADC1_GPIO35_CHANNEL; + break; default: return -1; } adc1_config_width(ADC_WIDTH_BIT_12); - adc1_config_channel_atten(channel, ADC_ATTEN_DB_11); + adc1_config_channel_atten(channel, atten); + + adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t)); + esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars); + int val = adc1_get_raw(channel); return val; } diff --git a/arduino/cores/esp32/wiring_analog.h b/arduino/cores/esp32/wiring_analog.h index 0902ac0..2bc480d 100644 --- a/arduino/cores/esp32/wiring_analog.h +++ b/arduino/cores/esp32/wiring_analog.h @@ -28,7 +28,7 @@ extern "C" { extern void analogWrite(uint32_t pin, uint32_t value); -extern int analogRead(uint32_t pin); +extern int analogRead(uint32_t pin, uint32_t atten); #ifdef __cplusplus } diff --git a/main/CommandHandler.cpp b/main/CommandHandler.cpp index db81052..bca87bb 100644 --- a/main/CommandHandler.cpp +++ b/main/CommandHandler.cpp @@ -1010,11 +1010,13 @@ int setDigitalRead(const uint8_t command[], uint8_t response[]) int setAnalogRead(const uint8_t command[], uint8_t response[]) { uint8_t pin = command[4]; + uint8_t atten = command[6]; - int value = digitalRead(pin); + int value = analogRead(pin, atten); response[2] = 1; // number of parameters response[3] = sizeof(value); // parameter 1 length + memcpy(&response[4], &value, sizeof(value)); return 5 + sizeof(value);