libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::ESP32ADC Class Reference

ESP32 ADC多通道驱动 More...

#include <esp_adc.hpp>

Collaboration diagram for LibXR::ESP32ADC:
[legend]

Data Structures

class  Channel
 ADC通道对象,提供通道级数据访问和抽象接口。 More...
 

Public Member Functions

 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.
 
 ~ESP32ADC ()
 析构函数,释放所有资源 Destructor. Free all resources and stop ADC.
 
ChannelGetChannel (uint8_t idx)
 获取通道对象的引用 Get a reference to channel object by index.
 
float ReadChannel (uint8_t idx)
 读取指定通道最新均值(已归一化为电压) Read latest averaged and normalized value (in volts) for the given channel.
 

Private Member Functions

void HandleSamples (const void *buf, size_t size_bytes)
 采样缓冲区数据解析与均值计算 Parse DMA buffer and calculate channel averages.
 
float Normalize (float raw) const
 原始ADC值归一化到电压 Normalize raw ADC value to voltage.
 

Static Private Member Functions

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.
 

Private Attributes

adc_digi_pattern_config_t * m_patterns_
 ADC采样模式数组 / Pattern config array.
 
Channelm_channels_
 通道对象数组 / Channel objects array
 
float * m_latest_values_
 最新均值(每通道)/ Latest average value (per channel)
 
int * m_sum_buf_
 求和缓冲 / Accumulation buffer
 
int * m_cnt_buf_
 计数缓冲 / Count buffer
 
adc_unit_t m_unit_
 ADC单元 / ADC unit.
 
uint8_t m_num_channels_
 通道数 / Number of channels
 
adc_atten_t m_attenuation_
 衰减档位 / Attenuation
 
adc_bitwidth_t m_bitwidth_
 位宽 / Bit width
 
float m_reference_voltage_
 参考电压 / Reference voltage
 
uint16_t m_max_raw_
 最大原始采样值 / Max raw value
 
adc_continuous_handle_t m_handle_ = nullptr
 ESP-IDF采集句柄 / ADC handle.
 

Detailed Description

ESP32 ADC多通道驱动

ESP32 multi-channel ADC driver

该类封装ESP32的ADC连续采样、DMA搬运和多通道均值计算。 支持线程安全读取,适用于高采样率场景。

This class encapsulates ESP32 ADC continuous sampling, DMA buffering, and per-channel averaging. Thread-safe and suitable for high-speed applications.

Definition at line 33 of file esp_adc.hpp.

Constructor & Destructor Documentation

◆ ESP32ADC()

LibXR::ESP32ADC::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 )
inline

构造函数:初始化ADC与DMA、参数配置 Constructor: Initialize ADC, DMA, and config parameters.

Parameters
unitADC单元(ADC_UNIT_1或2)/ ADC unit number (ADC_UNIT_1 or 2)
channelsADC通道号数组 / Array of ADC channel numbers
num_channels通道数量 / Number of channels
freq采样频率(Hz)/ Sample frequency in Hz (default: SOC_ADC_SAMPLE_FREQ_THRES_LOW)
attenuation衰减档位 / ADC attenuation (default: ADC_ATTEN_DB_12)
bitwidth精度位宽 / Bit width (default: chip max)
reference_voltage参考电压(V)/ Reference voltage (default: 3.3V)
dma_buf_sizeDMA缓冲区大小 / DMA buffer size in bytes (default: 256)

Definition at line 98 of file esp_adc.hpp.

104 : m_unit_(unit),
105 m_num_channels_(num_channels),
106 m_attenuation_(attenuation),
107 m_bitwidth_(bitwidth),
108 m_reference_voltage_(reference_voltage),
109 m_max_raw_((1 << bitwidth) - 1)
110 {
111 m_patterns_ = new adc_digi_pattern_config_t[m_num_channels_];
112 m_channels_ = new Channel[m_num_channels_];
114 m_sum_buf_ = new int[m_num_channels_];
115 m_cnt_buf_ = new int[m_num_channels_];
116
117 for (uint8_t i = 0; i < m_num_channels_; ++i)
118 {
119 m_patterns_[i].atten = static_cast<uint8_t>(m_attenuation_);
120 m_patterns_[i].channel = channels[i];
121 m_patterns_[i].unit = static_cast<uint8_t>(m_unit_);
122 m_patterns_[i].bit_width = static_cast<uint8_t>(m_bitwidth_);
123 m_channels_[i] = Channel(this, i, channels[i]);
124 m_latest_values_[i] = 0.f;
125 }
126
127 adc_continuous_handle_cfg_t adc_config = {
128 .max_store_buf_size = dma_buf_size,
129 .conv_frame_size = dma_buf_size / 2,
130 };
131 ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &m_handle_));
132
133 adc_continuous_config_t dig_cfg = {};
134 dig_cfg.sample_freq_hz = freq;
135 if (m_unit_ == ADC_UNIT_1)
136 {
137 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_1;
138 }
139 else
140 {
141 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_2;
142 }
143 dig_cfg.format = XR_ADC_DMA_OUTPUT_TYPE;
144 dig_cfg.adc_pattern = m_patterns_;
145 dig_cfg.pattern_num = m_num_channels_;
146 ESP_ERROR_CHECK(adc_continuous_config(m_handle_, &dig_cfg));
147
148 adc_continuous_evt_cbs_t cbs = {
149 .on_conv_done = &ESP32ADC::OnConvDone,
150 };
151 ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(m_handle_, &cbs, this));
152 ESP_ERROR_CHECK(adc_continuous_start(m_handle_));
153 }
int * m_cnt_buf_
计数缓冲 / Count buffer
Definition esp_adc.hpp:263
float m_reference_voltage_
参考电压 / Reference voltage
Definition esp_adc.hpp:269
adc_continuous_handle_t m_handle_
ESP-IDF采集句柄 / ADC handle.
Definition esp_adc.hpp:271
float * m_latest_values_
最新均值(每通道)/ Latest average value (per channel)
Definition esp_adc.hpp:261
Channel * m_channels_
通道对象数组 / Channel objects array
Definition esp_adc.hpp:260
adc_unit_t m_unit_
ADC单元 / ADC unit.
Definition esp_adc.hpp:265
uint8_t m_num_channels_
通道数 / Number of channels
Definition esp_adc.hpp:266
int * m_sum_buf_
求和缓冲 / Accumulation buffer
Definition esp_adc.hpp:262
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.
Definition esp_adc.hpp:194
uint16_t m_max_raw_
最大原始采样值 / Max raw value
Definition esp_adc.hpp:270
adc_digi_pattern_config_t * m_patterns_
ADC采样模式数组 / Pattern config array.
Definition esp_adc.hpp:259
adc_bitwidth_t m_bitwidth_
位宽 / Bit width
Definition esp_adc.hpp:268
adc_atten_t m_attenuation_
衰减档位 / Attenuation
Definition esp_adc.hpp:267

◆ ~ESP32ADC()

LibXR::ESP32ADC::~ESP32ADC ( )
inline

析构函数,释放所有资源 Destructor. Free all resources and stop ADC.

Definition at line 159 of file esp_adc.hpp.

160 {
161 if (m_handle_)
162 {
163 adc_continuous_stop(m_handle_);
164 adc_continuous_deinit(m_handle_);
165 }
166 delete[] m_patterns_;
167 delete[] m_channels_;
168 delete[] m_latest_values_;
169 delete[] m_sum_buf_;
170 delete[] m_cnt_buf_;
171 }

Member Function Documentation

◆ GetChannel()

Channel & LibXR::ESP32ADC::GetChannel ( uint8_t idx)
inline

获取通道对象的引用 Get a reference to channel object by index.

Parameters
idx逻辑通道索引 / Channel logical index
Returns
Channel对象引用 / Reference to Channel object

Definition at line 179 of file esp_adc.hpp.

179{ return m_channels_[idx]; }

◆ HandleSamples()

void LibXR::ESP32ADC::HandleSamples ( const void * buf,
size_t size_bytes )
inlineprivate

采样缓冲区数据解析与均值计算 Parse DMA buffer and calculate channel averages.

Parameters
buf缓冲区指针 / Buffer pointer
size_bytes数据字节数 / Buffer size in bytes

Definition at line 210 of file esp_adc.hpp.

211 {
212 for (uint8_t idx = 0; idx < m_num_channels_; ++idx)
213 {
214 m_sum_buf_[idx] = 0;
215 m_cnt_buf_[idx] = 0;
216 }
217
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);
221
222 for (size_t i = 0; i < n; ++i)
223 {
224 uint8_t ch = XR_ADC_DMA_GET_CHANNEL(&samples[i]);
225 for (uint8_t idx = 0; idx < m_num_channels_; ++idx)
226 {
227 if (ch == m_channels_[idx].ChannelNumber())
228 {
229 int raw = XR_ADC_DMA_GET_DATA(&samples[i]);
230 m_sum_buf_[idx] += raw;
231 m_cnt_buf_[idx] += 1;
232 break;
233 }
234 }
235 }
236
237 for (uint8_t idx = 0; idx < m_num_channels_; ++idx)
238 {
239 if (m_cnt_buf_[idx] > 0)
240 {
241 float avg = Normalize(static_cast<float>(m_sum_buf_[idx]) / m_cnt_buf_[idx]);
242 m_latest_values_[idx] = avg;
243 }
244 }
245 }
float Normalize(float raw) const
原始ADC值归一化到电压 Normalize raw ADC value to voltage.
Definition esp_adc.hpp:254

◆ Normalize()

float LibXR::ESP32ADC::Normalize ( float raw) const
inlineprivate

原始ADC值归一化到电压 Normalize raw ADC value to voltage.

Parameters
raw原始采样值 / Raw ADC value
Returns
电压(V)/ Voltage (V)

Definition at line 254 of file esp_adc.hpp.

255 {
256 return (raw / static_cast<float>(m_max_raw_)) * m_reference_voltage_;
257 }

◆ OnConvDone()

static bool IRAM_ATTR LibXR::ESP32ADC::OnConvDone ( adc_continuous_handle_t handle,
const adc_continuous_evt_data_t * edata,
void * user_data )
inlinestaticprivate

DMA采集完成中断回调。内部调用。 DMA conversion done callback. Called internally by ESP-IDF.

Definition at line 194 of file esp_adc.hpp.

197 {
198 auto *self = reinterpret_cast<ESP32ADC *>(user_data);
199 self->HandleSamples(edata->conv_frame_buffer, edata->size);
200 return false;
201 }
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.
Definition esp_adc.hpp:98

◆ ReadChannel()

float LibXR::ESP32ADC::ReadChannel ( uint8_t idx)
inline

读取指定通道最新均值(已归一化为电压) Read latest averaged and normalized value (in volts) for the given channel.

Parameters
idx逻辑通道索引 / Channel index
Returns
电压值(V)/ Voltage value (V)

Definition at line 187 of file esp_adc.hpp.

187{ return m_latest_values_[idx]; }

Field Documentation

◆ m_attenuation_

adc_atten_t LibXR::ESP32ADC::m_attenuation_
private

衰减档位 / Attenuation

Definition at line 267 of file esp_adc.hpp.

◆ m_bitwidth_

adc_bitwidth_t LibXR::ESP32ADC::m_bitwidth_
private

位宽 / Bit width

Definition at line 268 of file esp_adc.hpp.

◆ m_channels_

Channel* LibXR::ESP32ADC::m_channels_
private

通道对象数组 / Channel objects array

Definition at line 260 of file esp_adc.hpp.

◆ m_cnt_buf_

int* LibXR::ESP32ADC::m_cnt_buf_
private

计数缓冲 / Count buffer

Definition at line 263 of file esp_adc.hpp.

◆ m_handle_

adc_continuous_handle_t LibXR::ESP32ADC::m_handle_ = nullptr
private

ESP-IDF采集句柄 / ADC handle.

Definition at line 271 of file esp_adc.hpp.

◆ m_latest_values_

float* LibXR::ESP32ADC::m_latest_values_
private

最新均值(每通道)/ Latest average value (per channel)

Definition at line 261 of file esp_adc.hpp.

◆ m_max_raw_

uint16_t LibXR::ESP32ADC::m_max_raw_
private

最大原始采样值 / Max raw value

Definition at line 270 of file esp_adc.hpp.

◆ m_num_channels_

uint8_t LibXR::ESP32ADC::m_num_channels_
private

通道数 / Number of channels

Definition at line 266 of file esp_adc.hpp.

◆ m_patterns_

adc_digi_pattern_config_t* LibXR::ESP32ADC::m_patterns_
private

ADC采样模式数组 / Pattern config array.

Definition at line 259 of file esp_adc.hpp.

◆ m_reference_voltage_

float LibXR::ESP32ADC::m_reference_voltage_
private

参考电压 / Reference voltage

Definition at line 269 of file esp_adc.hpp.

◆ m_sum_buf_

int* LibXR::ESP32ADC::m_sum_buf_
private

求和缓冲 / Accumulation buffer

Definition at line 262 of file esp_adc.hpp.

◆ m_unit_

adc_unit_t LibXR::ESP32ADC::m_unit_
private

ADC单元 / ADC unit.

Definition at line 265 of file esp_adc.hpp.


The documentation for this class was generated from the following file: