32 float Read()
override;
34 uint8_t ChannelNumber()
const {
return channel_num_; }
42 enum class ContinuousInitResult : uint8_t
50 adc_unit_t unit,
const adc_channel_t* channels, uint8_t num_channels,
51 uint32_t freq = SOC_ADC_SAMPLE_FREQ_THRES_LOW,
52 adc_atten_t attenuation = ADC_ATTEN_DB_12,
53 adc_bitwidth_t bitwidth =
54 static_cast<adc_bitwidth_t
>(SOC_ADC_DIGI_MAX_BITWIDTH),
55 float reference_voltage = 3.3f,
size_t dma_buf_size = 256);
58 Channel& GetChannel(uint8_t idx);
60 float ReadChannel(uint8_t idx);
63 enum class Backend : uint8_t
70 static adc_bitwidth_t ResolveBitwidth(adc_bitwidth_t bitwidth);
71 float Normalize(
float raw)
const;
72 static uint32_t ClampSampleFreq(uint32_t freq);
73 static uint32_t AlignUp(uint32_t value, uint32_t align);
74 bool IsValidChannel(adc_channel_t channel)
const;
75 void ConfigureAnalogPad(adc_channel_t channel)
const;
76 bool InitCalibration();
78 float RawToVoltage(uint8_t idx, uint16_t raw)
const;
80#if SOC_ADC_DIG_CTRL_SUPPORTED && SOC_ADC_DMA_SUPPORTED
81 static bool IsDigiUnitSupported(adc_unit_t unit);
82 static adc_digi_output_format_t ResolveContinuousFormat();
83 void DrainContinuousFrames(uint32_t timeout_ms);
84 ContinuousInitResult InitContinuous(uint32_t freq,
size_t dma_buf_size);
87 Channel* channels_ =
nullptr;
88 adc_channel_t* channel_ids_ =
nullptr;
89 uint8_t channel_idx_map_[SOC_ADC_MAX_CHANNEL_NUM] = {};
90 bool* channel_ready_ =
nullptr;
91 float* latest_values_ =
nullptr;
92 uint16_t* latest_raw_ =
nullptr;
94 adc_cali_handle_t cali_handles_[SOC_ADC_MAX_CHANNEL_NUM] = {};
97 uint8_t num_channels_;
98 adc_atten_t attenuation_;
99 adc_bitwidth_t bitwidth_;
100 float reference_voltage_;
102 static constexpr uint8_t kInvalidChannelIdx = 0xFFU;
104 Backend backend_ = Backend::NONE;
105 adc_oneshot_hal_ctx_t* oneshot_hal_ =
nullptr;
106 bool oneshot_inited_ =
false;
109#if SOC_ADC_DIG_CTRL_SUPPORTED && SOC_ADC_DMA_SUPPORTED
110 adc_continuous_handle_t continuous_handle_ =
nullptr;
111 uint8_t* continuous_read_buf_ =
nullptr;
112 adc_continuous_data_t* continuous_parsed_buf_ =
nullptr;
113 uint32_t continuous_frame_size_ = 0U;
114 uint32_t continuous_prime_timeout_ms_ = 0U;