Мне esp32s2 понравились, и вроде adc там много ног
АЦП кстати калибровано с завода таблицей аж, которую можно подгрузить при калибровке
#include <stdio.h>
#include <stdlib.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
static const char* TAG = "INFO";
#define ADC1_EXAMPLE_CHAN0 ADC1_CHANNEL_0
#define ADC_EXAMPLE_ATTEN ADC_ATTEN_DB_11
#define ADC_EXAMPLE_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP_FIT
static int adc_raw;
static esp_adc_cal_characteristics_t adc1_chars;
static bool adc_calibration_init(void)
{
esp_err_t ret;
bool cali_enable = false;
ret = esp_adc_cal_check_efuse(ADC_EXAMPLE_CALI_SCHEME);
if (ret == ESP_OK)
{
cali_enable = true;
esp_adc_cal_characterize(ADC_UNIT_1, ADC_EXAMPLE_ATTEN, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);
}
return cali_enable;
}
void app_main(void)
{
uint32_t voltage = 0;
bool cali_enable = adc_calibration_init();
ESP_ERROR_CHECK(adc1_config_width(ADC_WIDTH_BIT_DEFAULT));
ESP_ERROR_CHECK(adc1_config_channel_atten(ADC1_EXAMPLE_CHAN0, ADC_EXAMPLE_ATTEN));
while (1)
{
adc_raw = adc1_get_raw(ADC1_EXAMPLE_CHAN0);
if (cali_enable)
{
voltage = esp_adc_cal_raw_to_voltage(adc_raw, &adc1_chars);
ESP_LOGI(TAG, "cali data: %d mV", voltage);
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}