libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_adc.hpp
1#pragma once
2
3#include "adc.hpp"
4#include "esp_adc/adc_oneshot.h"
5#include "hal/adc_types.h"
6
7namespace LibXR
8{
9
10class ESP32ADC : public ADC
11{
12 public:
13 explicit ESP32ADC(
14 adc_unit_t unit, adc_channel_t channel, adc_atten_t attenuation = ADC_ATTEN_DB_12,
15 adc_bitwidth_t bitwidth = static_cast<adc_bitwidth_t>(SOC_ADC_DIGI_MIN_BITWIDTH),
16 float reference_voltage = 3.3f)
17 : m_unit_(unit),
18 m_channel_(channel),
19 m_attenuation_(attenuation),
20 m_bitwidth_(bitwidth),
21 m_reference_voltage_(reference_voltage),
22 m_max_raw_((1 << bitwidth) - 1)
23 {
24 adc_oneshot_unit_init_cfg_t unit_cfg = {};
25 unit_cfg.unit_id = m_unit_;
26 unit_cfg.ulp_mode = ADC_ULP_MODE_DISABLE;
27
28 ESP_ERROR_CHECK(adc_oneshot_new_unit(&unit_cfg, &m_oneshot_));
29
30 adc_oneshot_chan_cfg_t chan_cfg = {
31 .atten = m_attenuation_,
32 .bitwidth = m_bitwidth_,
33 };
34 ESP_ERROR_CHECK(adc_oneshot_config_channel(m_oneshot_, m_channel_, &chan_cfg));
35 }
36
37 ~ESP32ADC()
38 {
39 if (m_oneshot_)
40 {
41 adc_oneshot_del_unit(m_oneshot_);
42 }
43 }
44
45 float Read() override
46 {
47 int raw = 0;
48 if (adc_oneshot_read(m_oneshot_, m_channel_, &raw) == ESP_OK)
49 {
50 return Normalize(raw);
51 }
52 return 0.0f;
53 }
54
55 private:
56 float Normalize(int raw) const
57 {
58 return (static_cast<float>(raw) / static_cast<float>(m_max_raw_)) *
59 m_reference_voltage_;
60 }
61
62 adc_unit_t m_unit_;
63 adc_channel_t m_channel_;
64 adc_atten_t m_attenuation_;
65 adc_bitwidth_t m_bitwidth_;
66 float m_reference_voltage_;
67 uint16_t m_max_raw_;
68 adc_oneshot_unit_handle_t m_oneshot_ = nullptr;
69};
70
71} // namespace LibXR
模拟数字转换器(ADC)基类
Definition adc.hpp:18
float Read() override
读取 ADC 值
Definition esp_adc.hpp:45
LibXR 命名空间
Definition ch32_gpio.hpp:9