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