ADC Pull-Up Not Disabling on SparkFun ESP32-S3 Thing Plus (Pin 10/IOA6)

Hi everyone,

I’m experiencing an issue with the ADC on my SparkFun ESP32‑S3 Thing Plus. When I use a simple 10 kΩ divider (two 10 kΩ resistors) with 2 V across it, I expect the midpoint to be 1 V. However, when I connect that divider to the ADC, I measure with a DMM about 2.792 V at the ADC pin. This indicates that the ADC input is being pulled up by an internal resistor towards the 3.3V rail.

Divider:
V_mid = 2 V × (10 kΩ / (10 kΩ + 10 kΩ)) = 1 V

Measured value = 2.729

KCL:
(2V – 2.729V)/10k + (3.3V – 2.729V)/R_pullup – (2.729V)/10k = 0

->(2 – 2.729 – 2.729)/10k = (2 – 2×2.729)/10k = (2 – 5.458)/10k = -3.458/10,000 = -345.8 uA

->-345.8e-6 + (0.571)/R_pullup = 0

→ R_pullup
(0.571)/R_pullup = 345.8e-6
R_pullup = 0.571 / 345.8e-6 ≈ 1650 Ω

So, based on your measurement, the effective internal pull‑up resistor is roughly 1.65 kΩ.

==Board and Pin Mapping==

According to the SparkFun Thing Plus ESP32‑S3 schematic, header pin 10 is labeled IOA6.
The schematic and internal documentation map IOA6 to RTC_GPIO6, which in turn is used as ADC1_CH5 and also has a Touch6 function.
I checked the ESP32‑S3 datasheet (v1.9) Appendix A – ESP32‑S3 Consolidated Pin Overview,

which shows for this pad:
Pin No. = 11 (IC pad)
Pin Name = GPIO6
Type = I/O/T
Power Provided By = VDD3P3_RTC
RTC Function = RTC_GPIO6
Analog Function 0 = TOUCH6
Analog Function 1 = ADC1_CH5 (GPIO6)

So i made this sketch based on the commands from Search - ESP32-S3 - — ESP-IDF Programming Guide latest documentation

Sketch:

#include <Arduino.h>
#include <driver/rtc_io.h> // For rtc_gpio_* functions
#include <driver/touch_pad.h> // For touch_pad_deinit()

// Function to convert a 12-bit ADC reading to a voltage
float convertToVoltage(int adcReading) {
return (adcReading / 4095.0) * 3.3;
}

void setup() {
Serial.begin(115200);
delay(100);
Serial.println(“ADC test with pull-up disabled and voltage measurement”);

// Disable touch functionality on all RTC GPIOs so that the Touch6 function doesn’t force a pull-up.
touch_pad_deinit();

// For the ADC pin: header pin “10” is labeled IOA6,
// RTC_GPIO6 (ADC1_CH5, Touch6).
// RTC_GPIO6 = GPIO_NUM_6?
rtc_gpio_init(GPIO_NUM_6);
rtc_gpio_set_direction(GPIO_NUM_6, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pullup_dis(GPIO_NUM_6);
rtc_gpio_pulldown_dis(GPIO_NUM_6);

delay(100);

// display the values.
int adcReading = analogRead(10);
float voltage = convertToVoltage(adcReading);
Serial.print(“Initial ADC reading: “);
Serial.print(adcReading);
Serial.print(” → Voltage: “);
Serial.print(voltage, 3);
Serial.println(” V”);
}

void loop() {
int adcReading = analogRead(10);
float voltage = convertToVoltage(adcReading);
Serial.print(“ADC reading: “);
Serial.print(adcReading);
Serial.print(” → Voltage: “);
Serial.print(voltage, 3);
Serial.println(” V”);
delay(1000);
}

And ultimately my ADC seems to still have its pull-up resistor active.
If I’m doing something wrong or anyone could help me with this i would very much appreciate it.

The schematics are a bit confusion, but isn’t pin 10 : ESP10/A0 and thus IOA10 on the processor ?

(source : https://cdn.sparkfun.com/assets/5/e/6/5/0/SparkFun_Thing_Plus_ESP32-S3.pdf)

This is also supported by the variant pins_arduino.h:
static const uint8_t A0 = 10;
static const uint8_t A1 = 14;
static const uint8_t A2 = 15;
static const uint8_t A3 = 16;
static const uint8_t A4 = 17;
static const uint8_t A5 = 18;

1 Like