25 ESP_LOGCONFIG(TAG,
"Setting up ADC '%s'...", this->
get_name().c_str());
27 if (this->
channel1_ != ADC1_CHANNEL_MAX) {
28 adc1_config_width(ADC_WIDTH_MAX_SOC_BITS);
32 }
else if (this->
channel2_ != ADC2_CHANNEL_MAX) {
38 for (int32_t i = 0; i <= ADC_ATTEN_DB_12_COMPAT; i++) {
39 auto adc_unit = this->
channel1_ != ADC1_CHANNEL_MAX ? ADC_UNIT_1 : ADC_UNIT_2;
40 auto cal_value = esp_adc_cal_characterize(adc_unit, (adc_atten_t) i, ADC_WIDTH_MAX_SOC_BITS,
44 case ESP_ADC_CAL_VAL_EFUSE_VREF:
45 ESP_LOGV(TAG,
"Using eFuse Vref for calibration");
47 case ESP_ADC_CAL_VAL_EFUSE_TP:
48 ESP_LOGV(TAG,
"Using two-point eFuse Vref for calibration");
50 case ESP_ADC_CAL_VAL_DEFAULT_VREF:
91 if (this->
channel1_ != ADC1_CHANNEL_MAX) {
93 }
else if (this->
channel2_ != ADC2_CHANNEL_MAX) {
94 adc2_get_raw(this->
channel2_, ADC_WIDTH_MAX_SOC_BITS, &
raw);
100 aggr.add_sample(
raw);
103 return aggr.aggregate();
106 esp_adc_cal_raw_to_voltage(aggr.aggregate(), &this->cal_characteristics_[(int32_t) this->attenuation_]);
110 int raw12 = ADC_MAX, raw6 = ADC_MAX, raw2 = ADC_MAX, raw0 = ADC_MAX;
112 if (this->
channel1_ != ADC1_CHANNEL_MAX) {
113 adc1_config_channel_atten(this->
channel1_, ADC_ATTEN_DB_12_COMPAT);
115 if (raw12 < ADC_MAX) {
116 adc1_config_channel_atten(this->
channel1_, ADC_ATTEN_DB_6);
118 if (raw6 < ADC_MAX) {
119 adc1_config_channel_atten(this->
channel1_, ADC_ATTEN_DB_2_5);
121 if (raw2 < ADC_MAX) {
122 adc1_config_channel_atten(this->
channel1_, ADC_ATTEN_DB_0);
127 }
else if (this->
channel2_ != ADC2_CHANNEL_MAX) {
128 adc2_config_channel_atten(this->
channel2_, ADC_ATTEN_DB_12_COMPAT);
129 adc2_get_raw(this->
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw12);
130 if (raw12 < ADC_MAX) {
131 adc2_config_channel_atten(this->
channel2_, ADC_ATTEN_DB_6);
132 adc2_get_raw(this->
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw6);
133 if (raw6 < ADC_MAX) {
134 adc2_config_channel_atten(this->
channel2_, ADC_ATTEN_DB_2_5);
135 adc2_get_raw(this->
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw2);
136 if (raw2 < ADC_MAX) {
137 adc2_config_channel_atten(this->
channel2_, ADC_ATTEN_DB_0);
138 adc2_get_raw(this->
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw0);
144 if (raw0 == -1 || raw2 == -1 || raw6 == -1 || raw12 == -1) {
148 uint32_t mv12 = esp_adc_cal_raw_to_voltage(raw12, &this->
cal_characteristics_[(int32_t) ADC_ATTEN_DB_12_COMPAT]);
149 uint32_t mv6 = esp_adc_cal_raw_to_voltage(raw6, &this->
cal_characteristics_[(int32_t) ADC_ATTEN_DB_6]);
150 uint32_t mv2 = esp_adc_cal_raw_to_voltage(raw2, &this->
cal_characteristics_[(int32_t) ADC_ATTEN_DB_2_5]);
151 uint32_t mv0 = esp_adc_cal_raw_to_voltage(raw0, &this->
cal_characteristics_[(int32_t) ADC_ATTEN_DB_0]);
153 uint32_t c12 = std::min(raw12, ADC_HALF);
154 uint32_t c6 = ADC_HALF - std::abs(raw6 - ADC_HALF);
155 uint32_t c2 = ADC_HALF - std::abs(raw2 - ADC_HALF);
156 uint32_t c0 = std::min(ADC_MAX - raw0, ADC_HALF);
157 uint32_t csum = c12 + c6 + c2 + c0;
159 uint32_t mv_scaled = (mv12 * c12) + (mv6 * c6) + (mv2 * c2) + (mv0 * c0);
160 return mv_scaled / (float) (csum * 1000U);