7#include "esp_adc/adc_continuous.h"
8#include "hal/adc_types.h"
10#if (SOC_ADC_DIGI_RESULT_BYTES == 2)
11#define XR_ADC_DMA_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE1
12#define XR_ADC_DMA_GET_CHANNEL(p_data) ((p_data)->type1.channel)
13#define XR_ADC_DMA_GET_DATA(p_data) ((p_data)->type1.data)
15#define XR_ADC_DMA_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
16#define XR_ADC_DMA_GET_CHANNEL(p_data) ((p_data)->type2.channel)
17#define XR_ADC_DMA_GET_DATA(p_data) ((p_data)->type2.data)
99 adc_unit_t unit,
const adc_channel_t *channels, uint8_t num_channels,
100 uint32_t freq = SOC_ADC_SAMPLE_FREQ_THRES_LOW,
101 adc_atten_t attenuation = ADC_ATTEN_DB_12,
102 adc_bitwidth_t bitwidth =
static_cast<adc_bitwidth_t
>(SOC_ADC_DIGI_MAX_BITWIDTH),
103 float reference_voltage = 3.3f,
size_t dma_buf_size = 256)
127 adc_continuous_handle_cfg_t adc_config = {
128 .max_store_buf_size = dma_buf_size,
129 .conv_frame_size = dma_buf_size / 2,
131 ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &
m_handle_));
133 adc_continuous_config_t dig_cfg = {};
134 dig_cfg.sample_freq_hz = freq;
137 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_1;
141 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_2;
143 dig_cfg.format = XR_ADC_DMA_OUTPUT_TYPE;
146 ESP_ERROR_CHECK(adc_continuous_config(
m_handle_, &dig_cfg));
148 adc_continuous_evt_cbs_t cbs = {
151 ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(
m_handle_, &cbs,
this));
152 ESP_ERROR_CHECK(adc_continuous_start(
m_handle_));
194 static bool IRAM_ATTR
OnConvDone(adc_continuous_handle_t handle,
195 const adc_continuous_evt_data_t *edata,
198 auto *self =
reinterpret_cast<ESP32ADC *
>(user_data);
218 size_t n = size_bytes /
sizeof(adc_digi_output_data_t);
219 const adc_digi_output_data_t *samples =
220 static_cast<const adc_digi_output_data_t *
>(buf);
222 for (
size_t i = 0; i < n; ++i)
224 uint8_t ch = XR_ADC_DMA_GET_CHANNEL(&samples[i]);
229 int raw = XR_ADC_DMA_GET_DATA(&samples[i]);
uint8_t channel_num_
物理通道号 / Physical ADC channel number
uint8_t ChannelNumber() const
获取物理ADC通道号 Get the physical ADC channel number.
Channel(ESP32ADC *parent, uint8_t idx, uint8_t channel_num)
构造指定父ADC和通道编号的通道对象 Construct with given parent ADC and channel numbers.
float Read() override
读取当前通道归一化电压值(单位:V) Read normalized voltage (unit: V) for this channel.
uint8_t idx_
逻辑通道号 / Logical index
Channel()
默认构造函数 Default constructor.
ESP32ADC * parent_
父ADC对象 / Parent ADC pointer
int * m_cnt_buf_
计数缓冲 / Count buffer
float m_reference_voltage_
参考电压 / Reference voltage
float ReadChannel(uint8_t idx)
读取指定通道最新均值(已归一化为电压) Read latest averaged and normalized value (in volts) for the given channel.
Channel & GetChannel(uint8_t idx)
获取通道对象的引用 Get a reference to channel object by index.
float Normalize(float raw) const
原始ADC值归一化到电压 Normalize raw ADC value to voltage.
adc_continuous_handle_t m_handle_
ESP-IDF采集句柄 / ADC handle.
float * m_latest_values_
最新均值(每通道)/ Latest average value (per channel)
ESP32ADC(adc_unit_t unit, const adc_channel_t *channels, uint8_t num_channels, uint32_t freq=SOC_ADC_SAMPLE_FREQ_THRES_LOW, adc_atten_t attenuation=ADC_ATTEN_DB_12, adc_bitwidth_t bitwidth=static_cast< adc_bitwidth_t >(SOC_ADC_DIGI_MAX_BITWIDTH), float reference_voltage=3.3f, size_t dma_buf_size=256)
构造函数:初始化ADC与DMA、参数配置 Constructor: Initialize ADC, DMA, and config parameters.
void HandleSamples(const void *buf, size_t size_bytes)
采样缓冲区数据解析与均值计算 Parse DMA buffer and calculate channel averages.
Channel * m_channels_
通道对象数组 / Channel objects array
adc_unit_t m_unit_
ADC单元 / ADC unit.
uint8_t m_num_channels_
通道数 / Number of channels
int * m_sum_buf_
求和缓冲 / Accumulation buffer
static bool IRAM_ATTR OnConvDone(adc_continuous_handle_t handle, const adc_continuous_evt_data_t *edata, void *user_data)
DMA采集完成中断回调。内部调用。 DMA conversion done callback. Called internally by ESP-IDF.
uint16_t m_max_raw_
最大原始采样值 / Max raw value
adc_digi_pattern_config_t * m_patterns_
ADC采样模式数组 / Pattern config array.
~ESP32ADC()
析构函数,释放所有资源 Destructor. Free all resources and stop ADC.
adc_bitwidth_t m_bitwidth_
位宽 / Bit width
adc_atten_t m_attenuation_
衰减档位 / Attenuation