[adc] Fix internal temperature channel on RP2350A under arduino-pico (#18307)

This commit is contained in:
Jesse Hills
2026-08-12 14:19:59 +12:00
committed by GitHub
parent 3349046c5d
commit bab62b345b
+20 -5
View File
@@ -19,6 +19,25 @@ namespace esphome::adc {
static const char *const TAG = "adc.rp2";
// The on-die temperature sensor sits on the last ADC channel: input 4 on RP2040
// and RP2350A, but input 8 on RP2350B, which has eight external channels rather
// than four.
//
// This deliberately does not use the SDK's ADC_TEMPERATURE_CHANNEL_NUM. That
// derives from NUM_ADC_CHANNELS, which <pico.h> settles from a board header, and
// arduino-pico supplies a fixed B-die one for every RP2350 build. The real die
// is only declared later, by the variant's pins_arduino.h, so the SDK constant
// reads 8 on A-die boards. PICO_RP2350A itself is correct by the time this file
// is compiled, on both arduino-pico and pico-sdk builds.
#if defined(PICO_RP2350) && !defined(PICO_RP2350A)
#error "PICO_RP2350A is not defined, so the RP2350 die is unknown and the temperature ADC channel cannot be chosen"
#endif
#if defined(PICO_RP2350) && !PICO_RP2350A
static constexpr uint8_t TEMPERATURE_ADC_INPUT = 8;
#else
static constexpr uint8_t TEMPERATURE_ADC_INPUT = 4;
#endif
void ADCSensor::setup() {
static bool initialized = false;
if (!initialized) {
@@ -52,11 +71,7 @@ float ADCSensor::sample() {
if (this->is_temperature_) {
adc_set_temp_sensor_enabled(true);
delay(1);
// The on-die temperature sensor sits on the last ADC channel, and which one
// that is depends on the chip: input 4 on RP2040 and RP2350A, but input 8 on
// RP2350B, which has eight external channels instead of four. The SDK
// resolves it for the target being built, so do not hardcode it.
adc_select_input(ADC_TEMPERATURE_CHANNEL_NUM);
adc_select_input(TEMPERATURE_ADC_INPUT);
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
raw = adc_read();