diff --git a/cores/esp32/esp32-hal-adc.c b/cores/esp32/esp32-hal-adc.c index e0f50bb8..8324fa61 100644 --- a/cores/esp32/esp32-hal-adc.c +++ b/cores/esp32/esp32-hal-adc.c @@ -22,7 +22,7 @@ #include "soc/rtc_cntl_reg.h" #include "soc/sens_reg.h" -static uint8_t __analogAttenuation = 0;//0db +static uint8_t __analogAttenuation = 3;//11db static uint8_t __analogWidth = 3;//12 bits static uint8_t __analogCycles = 8; static uint8_t __analogSamples = 0;//1 sample @@ -66,15 +66,16 @@ void __analogSetClockDiv(uint8_t clockDiv){ SET_PERI_REG_BITS(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_CLK_DIV, __analogClockDiv, SENS_SAR2_CLK_DIV_S); } -void __analogSetAttenuation(uint8_t attenuation){ +void __analogSetAttenuation(adc_attenuation_t attenuation) +{ __analogAttenuation = attenuation & 3; uint32_t att_data = 0; - int i = 8; + int i = 10; while(i--){ att_data |= __analogAttenuation << (i * 2); } - SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, att_data, SENS_MEAS1_DATA_SAR_S); - SET_PERI_REG_BITS(SENS_SAR_MEAS_START2_REG, SENS_MEAS2_DATA_SAR, att_data, SENS_MEAS2_DATA_SAR_S); + WRITE_PERI_REG(SENS_SAR_ATTEN1_REG, att_data & 0xFFFF);//ADC1 has 8 channels + WRITE_PERI_REG(SENS_SAR_ATTEN2_REG, att_data); } void IRAM_ATTR __analogInit(){ @@ -82,6 +83,7 @@ void IRAM_ATTR __analogInit(){ if(initialized){ return; } + __analogSetAttenuation(__analogAttenuation); __analogSetCycles(__analogCycles); __analogSetSamples(__analogSamples + 1);//in samples @@ -108,6 +110,20 @@ void IRAM_ATTR __analogInit(){ initialized = true; } +void __analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation) +{ + int8_t channel = digitalPinToAnalogChannel(pin); + if(channel < 0 || attenuation > 3){ + return ; + } + __analogInit(); + if(channel > 7){ + SET_PERI_REG_BITS(SENS_SAR_ATTEN2_REG, 3, attenuation, ((channel - 10) * 2)); + } else { + SET_PERI_REG_BITS(SENS_SAR_ATTEN1_REG, 3, attenuation, (channel * 2)); + } +} + uint16_t IRAM_ATTR __analogRead(uint8_t pin) { int8_t channel = digitalPinToAnalogChannel(pin); @@ -150,6 +166,7 @@ uint16_t IRAM_ATTR __analogRead(uint8_t pin) while (GET_PERI_REG_MASK(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DONE_SAR) == 0) {}; //read done return GET_PERI_REG_BITS2(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S); } + int __hallRead() //hall sensor without LNA { int Sens_Vp0; @@ -179,5 +196,6 @@ extern void analogSetWidth(uint8_t bits) __attribute__ ((weak, alias("__analogSe extern void analogSetCycles(uint8_t cycles) __attribute__ ((weak, alias("__analogSetCycles"))); extern void analogSetSamples(uint8_t samples) __attribute__ ((weak, alias("__analogSetSamples"))); extern void analogSetClockDiv(uint8_t clockDiv) __attribute__ ((weak, alias("__analogSetClockDiv"))); -//extern void analogSetAttenuation(uint8_t attenuation) __attribute__ ((weak, alias("__analogSetAttenuation"))); +extern void analogSetAttenuation(adc_attenuation_t attenuation) __attribute__ ((weak, alias("__analogSetAttenuation"))); +extern void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation) __attribute__ ((weak, alias("__analogSetPinAttenuation"))); extern int hallRead() __attribute__ ((weak, alias("__hallRead"))); diff --git a/cores/esp32/esp32-hal-adc.h b/cores/esp32/esp32-hal-adc.h index d29ecf6d..3f5572cd 100644 --- a/cores/esp32/esp32-hal-adc.h +++ b/cores/esp32/esp32-hal-adc.h @@ -26,13 +26,22 @@ extern "C" { #include "esp32-hal.h" +typedef enum { + ADC_0db, + ADC_2_5db, + ADC_6db, + ADC_11db +} adc_attenuation_t; + /* * Get ADC value for pin * */ uint16_t analogRead(uint8_t pin); /* - * Sets the sample bits (9 - 12) + * Sets the sample bits + * Default is 12bit (0 - 4095) + * Range is 9 - 12 * */ void analogSetWidth(uint8_t bits); @@ -61,6 +70,18 @@ void analogSetSamples(uint8_t samples); * */ void analogSetClockDiv(uint8_t clockDiv); +/* + * Set the attenuation for all channels + * Default is 11db + * */ +void analogSetAttenuation(adc_attenuation_t attenuation); + +/* + * Set the attenuation for particular pin + * Default is 11db + * */ +void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation); + /* * Get value for HALL sensor (without LNA) * connected to pins 36(SVP) and 39(SVN)