libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_adc.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5
6#include "adc.hpp"
7#include "esp_adc/adc_cali.h"
8#include "esp_adc/adc_oneshot.h"
9#include "esp_def.hpp"
10#include "hal/adc_types.h"
11#include "soc/soc_caps.h"
12
13#if SOC_ADC_DIG_CTRL_SUPPORTED && SOC_ADC_DMA_SUPPORTED
14#include "esp_adc/adc_continuous.h"
15#endif
16
17struct adc_oneshot_hal_ctx_t;
18
19namespace LibXR
20{
21
23{
24 public:
25 class Channel : public ADC
26 {
27 public:
28 Channel();
29 Channel(ESP32ADC* parent, uint8_t idx, uint8_t channel_num);
30
31 float Read() override;
32
33 uint8_t ChannelNumber() const { return channel_num_; }
34
35 private:
36 ESP32ADC* parent_;
37 uint8_t idx_;
38 uint8_t channel_num_;
39 };
40
41 enum class ContinuousInitResult : uint8_t
42 {
43 STARTED = 0,
44 UNSUPPORTED,
45 FAILED,
46 };
47
49 adc_unit_t unit, const adc_channel_t* channels, uint8_t num_channels,
50 uint32_t freq = SOC_ADC_SAMPLE_FREQ_THRES_LOW,
51 adc_atten_t attenuation = ADC_ATTEN_DB_12,
52 adc_bitwidth_t bitwidth = static_cast<adc_bitwidth_t>(SOC_ADC_DIGI_MAX_BITWIDTH),
53 float reference_voltage = 3.3f, size_t dma_buf_size = 256);
54
55 Channel& GetChannel(uint8_t idx);
56
57 float ReadChannel(uint8_t idx);
58
59 private:
60 enum class Backend : uint8_t
61 {
62 NONE = 0,
63 CONTINUOUS_DMA,
64 ONESHOT,
65 };
66
67 static adc_bitwidth_t ResolveBitwidth(adc_bitwidth_t bitwidth);
68 float Normalize(float raw) const;
69 static uint32_t ClampSampleFreq(uint32_t freq);
70 static uint32_t AlignUp(uint32_t value, uint32_t align);
71 bool IsValidChannel(adc_channel_t channel) const;
72 void ConfigureAnalogPad(adc_channel_t channel) const;
73 bool InitCalibration();
74 bool InitOneshot();
75 float RawToVoltage(uint8_t idx, uint16_t raw) const;
76
77#if SOC_ADC_DIG_CTRL_SUPPORTED && SOC_ADC_DMA_SUPPORTED
78 static bool IsDigiUnitSupported(adc_unit_t unit);
79 static adc_digi_output_format_t ResolveContinuousFormat();
80 void DrainContinuousFrames(uint32_t timeout_ms);
81 ContinuousInitResult InitContinuous(uint32_t freq, size_t dma_buf_size);
82#endif
83
84 Channel* channels_ = nullptr;
85 adc_channel_t* channel_ids_ = nullptr;
86 uint8_t channel_idx_map_[SOC_ADC_MAX_CHANNEL_NUM] = {};
87 bool* channel_ready_ = nullptr;
88 float* latest_values_ = nullptr;
89 uint16_t* latest_raw_ = nullptr;
90
91 adc_cali_handle_t cali_handles_[SOC_ADC_MAX_CHANNEL_NUM] = {};
92
93 adc_unit_t unit_;
94 uint8_t num_channels_;
95 adc_atten_t attenuation_;
96 adc_bitwidth_t bitwidth_;
97 float reference_voltage_;
98 uint16_t max_raw_;
99 static constexpr uint8_t INVALID_CHANNEL_IDX = 0xFFU;
100
101 Backend backend_ = Backend::NONE;
102 adc_oneshot_hal_ctx_t* oneshot_hal_ = nullptr;
103 bool oneshot_inited_ = false;
104 bool valid_ = false;
105
106#if SOC_ADC_DIG_CTRL_SUPPORTED && SOC_ADC_DMA_SUPPORTED
107 adc_continuous_handle_t continuous_handle_ = nullptr;
108 uint8_t* continuous_read_buf_ = nullptr;
109 adc_continuous_data_t* continuous_parsed_buf_ = nullptr;
110 uint32_t continuous_frame_size_ = 0U;
111 uint32_t continuous_prime_timeout_ms_ = 0U;
112#endif
113};
114
115} // namespace LibXR
模拟数字转换器(ADC)基类
Definition adc.hpp:18
float Read() override
读取 ADC 值
Definition esp_adc.cpp:50
LibXR 命名空间
Definition ch32_can.hpp:14
@ FAILED
操作失败 | Operation failed