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)
88 adc_unit_t unit,
const adc_channel_t* channels, uint8_t num_channels,
89 uint32_t freq = SOC_ADC_SAMPLE_FREQ_THRES_LOW,
90 adc_atten_t attenuation = ADC_ATTEN_DB_12,
91 adc_bitwidth_t bitwidth =
static_cast<adc_bitwidth_t
>(SOC_ADC_DIGI_MAX_BITWIDTH),
92 float reference_voltage = 3.3f,
size_t dma_buf_size = 256)
116 adc_continuous_handle_cfg_t adc_config = {
117 .max_store_buf_size = dma_buf_size,
118 .conv_frame_size = dma_buf_size / 2,
119 .flags = {.flush_pool = 1},
121 ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &
m_handle_));
123 adc_continuous_config_t dig_cfg = {};
124 dig_cfg.sample_freq_hz = freq;
127 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_1;
131 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_2;
133 dig_cfg.format = XR_ADC_DMA_OUTPUT_TYPE;
136 ESP_ERROR_CHECK(adc_continuous_config(
m_handle_, &dig_cfg));
138 adc_continuous_evt_cbs_t cbs = {
141 ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(
m_handle_, &cbs,
this));
142 ESP_ERROR_CHECK(adc_continuous_start(
m_handle_));
180 static bool IRAM_ATTR
OnConvDone(adc_continuous_handle_t handle,
181 const adc_continuous_evt_data_t* edata,
184 auto* self =
reinterpret_cast<ESP32ADC*
>(user_data);
203 size_t n = size_bytes /
sizeof(adc_digi_output_data_t);
204 const adc_digi_output_data_t* samples =
205 static_cast<const adc_digi_output_data_t*
>(buf);
207 for (
size_t i = 0; i < n; ++i)
209 uint8_t ch = XR_ADC_DMA_GET_CHANNEL(&samples[i]);
214 int raw = XR_ADC_DMA_GET_DATA(&samples[i]);
ADC 通道对象 / ADC channel object.
uint8_t channel_num_
物理通道号 / Physical ADC channel number
uint8_t ChannelNumber() const
获取物理通道号 / Get physical channel number
Channel(ESP32ADC *parent, uint8_t idx, uint8_t channel_num)
构造通道对象 / Construct channel object
float Read() override
读取当前通道电压值 / Read channel voltage
uint8_t idx_
逻辑通道号 / Logical index
Channel()
默认构造函数 / Default constructor
ESP32ADC * parent_
父ADC对象 / Parent ADC pointer
ESP32 多通道 ADC 驱动 / ESP32 multi-channel ADC driver.
int * m_cnt_buf_
计数缓冲 / Count buffer
float m_reference_voltage_
参考电压 / Reference voltage
float ReadChannel(uint8_t idx)
读取指定通道电压值 / Read channel voltage
Channel & GetChannel(uint8_t idx)
获取通道对象 / Get channel object
float Normalize(float raw) const
将原始 ADC 值归一化为电压 / Normalize raw ADC 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 驱动对象 / Construct ADC driver
void HandleSamples(const void *buf, size_t size_bytes)
解析 DMA 缓冲并计算均值 / Parse DMA buffer and compute 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.
uint16_t m_max_raw_
最大原始采样值 / Max raw value
adc_digi_pattern_config_t * m_patterns_
ADC采样模式数组 / Pattern config array.
~ESP32ADC()
析构函数 / Destructor
adc_bitwidth_t m_bitwidth_
位宽 / Bit width
adc_atten_t m_attenuation_
衰减档位 / Attenuation