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

ESP32 多通道 ADC 驱动 / ESP32 multi-channel ADC driver. More...

#include <esp_adc.hpp>

Collaboration diagram for LibXR::ESP32ADC:
[legend]

Data Structures

class  Channel
 ADC 通道对象 / ADC channel object. 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 驱动对象 / Construct ADC driver
 
 ~ESP32ADC ()
 析构函数 / Destructor
 
ChannelGetChannel (uint8_t idx)
 获取通道对象 / Get channel object
 
float ReadChannel (uint8_t idx)
 读取指定通道电压值 / Read channel voltage
 

Private Member Functions

void HandleSamples (const void *buf, size_t size_bytes)
 解析 DMA 缓冲并计算均值 / Parse DMA buffer and compute averages
 
float Normalize (float raw) const
 将原始 ADC 值归一化为电压 / Normalize raw ADC 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.
 

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.

封装 ADC 连续采样、DMA 读取和通道均值计算。 Encapsulates continuous ADC sampling, DMA reads, and per-channel averaging.

Definition at line 29 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 驱动对象 / Construct ADC driver

Parameters
unitADC 单元(ADC_UNIT_1 或 ADC_UNIT_2) / ADC unit
channelsADC 通道号数组 / ADC channel array
num_channels通道数量 / Number of channels
freq采样频率(Hz) / Sample frequency in Hz
attenuation衰减档位 / ADC attenuation
bitwidth位宽 / ADC bit width
reference_voltage参考电压(V) / Reference voltage in volts
dma_buf_sizeDMA 缓冲区大小(字节) / DMA buffer size in bytes

Definition at line 87 of file esp_adc.hpp.

93 : m_unit_(unit),
94 m_num_channels_(num_channels),
95 m_attenuation_(attenuation),
96 m_bitwidth_(bitwidth),
97 m_reference_voltage_(reference_voltage),
98 m_max_raw_((1 << bitwidth) - 1)
99 {
100 m_patterns_ = new adc_digi_pattern_config_t[m_num_channels_];
101 m_channels_ = new Channel[m_num_channels_];
103 m_sum_buf_ = new int[m_num_channels_];
104 m_cnt_buf_ = new int[m_num_channels_];
105
106 for (uint8_t i = 0; i < m_num_channels_; ++i)
107 {
108 m_patterns_[i].atten = static_cast<uint8_t>(m_attenuation_);
109 m_patterns_[i].channel = channels[i];
110 m_patterns_[i].unit = static_cast<uint8_t>(m_unit_);
111 m_patterns_[i].bit_width = static_cast<uint8_t>(m_bitwidth_);
112 m_channels_[i] = Channel(this, i, channels[i]);
113 m_latest_values_[i] = 0.f;
114 }
115
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},
120 };
121 ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &m_handle_));
122
123 adc_continuous_config_t dig_cfg = {};
124 dig_cfg.sample_freq_hz = freq;
125 if (m_unit_ == ADC_UNIT_1)
126 {
127 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_1;
128 }
129 else
130 {
131 dig_cfg.conv_mode = ADC_CONV_SINGLE_UNIT_2;
132 }
133 dig_cfg.format = XR_ADC_DMA_OUTPUT_TYPE;
134 dig_cfg.adc_pattern = m_patterns_;
135 dig_cfg.pattern_num = m_num_channels_;
136 ESP_ERROR_CHECK(adc_continuous_config(m_handle_, &dig_cfg));
137
138 adc_continuous_evt_cbs_t cbs = {
139 .on_conv_done = &ESP32ADC::OnConvDone,
140 };
141 ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(m_handle_, &cbs, this));
142 ESP_ERROR_CHECK(adc_continuous_start(m_handle_));
143 }
int * m_cnt_buf_
计数缓冲 / Count buffer
Definition esp_adc.hpp:247
float m_reference_voltage_
参考电压 / Reference voltage
Definition esp_adc.hpp:253
adc_continuous_handle_t m_handle_
ESP-IDF采集句柄 / ADC handle.
Definition esp_adc.hpp:255
float * m_latest_values_
最新均值(每通道)/ Latest average value (per channel)
Definition esp_adc.hpp:245
Channel * m_channels_
通道对象数组 / Channel objects array
Definition esp_adc.hpp:244
adc_unit_t m_unit_
ADC单元 / ADC unit.
Definition esp_adc.hpp:249
uint8_t m_num_channels_
通道数 / Number of channels
Definition esp_adc.hpp:250
int * m_sum_buf_
求和缓冲 / Accumulation buffer
Definition esp_adc.hpp:246
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.
Definition esp_adc.hpp:180
uint16_t m_max_raw_
最大原始采样值 / Max raw value
Definition esp_adc.hpp:254
adc_digi_pattern_config_t * m_patterns_
ADC采样模式数组 / Pattern config array.
Definition esp_adc.hpp:243
adc_bitwidth_t m_bitwidth_
位宽 / Bit width
Definition esp_adc.hpp:252
adc_atten_t m_attenuation_
衰减档位 / Attenuation
Definition esp_adc.hpp:251

◆ ~ESP32ADC()

LibXR::ESP32ADC::~ESP32ADC ( )
inline

析构函数 / Destructor

Definition at line 148 of file esp_adc.hpp.

149 {
150 if (m_handle_)
151 {
152 adc_continuous_stop(m_handle_);
153 adc_continuous_deinit(m_handle_);
154 }
155 delete[] m_patterns_;
156 delete[] m_channels_;
157 delete[] m_latest_values_;
158 delete[] m_sum_buf_;
159 delete[] m_cnt_buf_;
160 }

Member Function Documentation

◆ GetChannel()

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

获取通道对象 / Get channel object

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

Definition at line 167 of file esp_adc.hpp.

167{ return m_channels_[idx]; }

◆ HandleSamples()

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

解析 DMA 缓冲并计算均值 / Parse DMA buffer and compute averages

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

Definition at line 195 of file esp_adc.hpp.

196 {
197 for (uint8_t idx = 0; idx < m_num_channels_; ++idx)
198 {
199 m_sum_buf_[idx] = 0;
200 m_cnt_buf_[idx] = 0;
201 }
202
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);
206
207 for (size_t i = 0; i < n; ++i)
208 {
209 uint8_t ch = XR_ADC_DMA_GET_CHANNEL(&samples[i]);
210 for (uint8_t idx = 0; idx < m_num_channels_; ++idx)
211 {
212 if (ch == m_channels_[idx].ChannelNumber())
213 {
214 int raw = XR_ADC_DMA_GET_DATA(&samples[i]);
215 m_sum_buf_[idx] += raw;
216 m_cnt_buf_[idx] += 1;
217 break;
218 }
219 }
220 }
221
222 for (uint8_t idx = 0; idx < m_num_channels_; ++idx)
223 {
224 if (m_cnt_buf_[idx] > 0)
225 {
226 float avg = Normalize(static_cast<float>(m_sum_buf_[idx]) / m_cnt_buf_[idx]);
227 m_latest_values_[idx] = avg;
228 }
229 }
230 }
float Normalize(float raw) const
将原始 ADC 值归一化为电压 / Normalize raw ADC to voltage
Definition esp_adc.hpp:238

◆ Normalize()

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

将原始 ADC 值归一化为电压 / Normalize raw ADC to voltage

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

Definition at line 238 of file esp_adc.hpp.

239 {
240 return (raw / static_cast<float>(m_max_raw_)) * m_reference_voltage_;
241 }

◆ 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.

Definition at line 180 of file esp_adc.hpp.

183 {
184 auto* self = reinterpret_cast<ESP32ADC*>(user_data);
185 self->HandleSamples(edata->conv_frame_buffer, edata->size);
186 return false;
187 }
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
Definition esp_adc.hpp:87

◆ ReadChannel()

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

读取指定通道电压值 / Read channel voltage

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

Definition at line 174 of file esp_adc.hpp.

174{ return m_latest_values_[idx]; }

Field Documentation

◆ m_attenuation_

adc_atten_t LibXR::ESP32ADC::m_attenuation_
private

衰减档位 / Attenuation

Definition at line 251 of file esp_adc.hpp.

◆ m_bitwidth_

adc_bitwidth_t LibXR::ESP32ADC::m_bitwidth_
private

位宽 / Bit width

Definition at line 252 of file esp_adc.hpp.

◆ m_channels_

Channel* LibXR::ESP32ADC::m_channels_
private

通道对象数组 / Channel objects array

Definition at line 244 of file esp_adc.hpp.

◆ m_cnt_buf_

int* LibXR::ESP32ADC::m_cnt_buf_
private

计数缓冲 / Count buffer

Definition at line 247 of file esp_adc.hpp.

◆ m_handle_

adc_continuous_handle_t LibXR::ESP32ADC::m_handle_ = nullptr
private

ESP-IDF采集句柄 / ADC handle.

Definition at line 255 of file esp_adc.hpp.

◆ m_latest_values_

float* LibXR::ESP32ADC::m_latest_values_
private

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

Definition at line 245 of file esp_adc.hpp.

◆ m_max_raw_

uint16_t LibXR::ESP32ADC::m_max_raw_
private

最大原始采样值 / Max raw value

Definition at line 254 of file esp_adc.hpp.

◆ m_num_channels_

uint8_t LibXR::ESP32ADC::m_num_channels_
private

通道数 / Number of channels

Definition at line 250 of file esp_adc.hpp.

◆ m_patterns_

adc_digi_pattern_config_t* LibXR::ESP32ADC::m_patterns_
private

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

Definition at line 243 of file esp_adc.hpp.

◆ m_reference_voltage_

float LibXR::ESP32ADC::m_reference_voltage_
private

参考电压 / Reference voltage

Definition at line 253 of file esp_adc.hpp.

◆ m_sum_buf_

int* LibXR::ESP32ADC::m_sum_buf_
private

求和缓冲 / Accumulation buffer

Definition at line 246 of file esp_adc.hpp.

◆ m_unit_

adc_unit_t LibXR::ESP32ADC::m_unit_
private

ADC单元 / ADC unit.

Definition at line 249 of file esp_adc.hpp.


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