libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_dac.hpp
1#pragma once
2
3#include <cstdint>
4
5#include "dac.hpp"
6#include "esp_def.hpp"
7#include "soc/soc_caps.h"
8
9#if SOC_DAC_SUPPORTED
10#include "driver/gpio.h"
11#include "esp_private/gpio.h"
12#include "hal/dac_ll.h"
13#include "soc/dac_periph.h"
14#endif
15
16namespace LibXR
17{
18
19class ESP32DAC : public DAC
20{
21 public:
22 explicit ESP32DAC(uint8_t channel_id = 0, float init_voltage = 0.0f,
23 float reference_voltage = 3.3f)
24 : channel_id_(channel_id), reference_voltage_(reference_voltage)
25 {
26#if SOC_DAC_SUPPORTED
27 if ((channel_id_ >= SOC_DAC_CHAN_NUM) || (reference_voltage_ <= 0.0f))
28 {
29 return;
30 }
31
32 ready_ = true;
33 dac_ll_power_on(ToChannel(channel_id_));
34 dac_ll_rtc_sync_by_adc(false);
35 (void)gpio_config_as_analog(
36 static_cast<gpio_num_t>(dac_periph_signal.dac_channel_io_num[channel_id_]));
37 (void)Write(init_voltage);
38#else
39 (void)init_voltage;
40#endif
41 }
42
43 ErrorCode Write(float voltage) override
44 {
45#if SOC_DAC_SUPPORTED
46 if (!ready_)
47 {
49 }
50
51 if (voltage < 0.0f)
52 {
53 voltage = 0.0f;
54 }
55 else if (voltage > reference_voltage_)
56 {
57 voltage = reference_voltage_;
58 }
59
60 constexpr uint32_t MAX_CODE = (1U << SOC_DAC_RESOLUTION) - 1U;
61 const float scale = static_cast<float>(MAX_CODE) / reference_voltage_;
62 uint32_t code = static_cast<uint32_t>((voltage * scale) + 0.5f);
63 if (code > MAX_CODE)
64 {
65 code = MAX_CODE;
66 }
67
68 dac_ll_update_output_value(ToChannel(channel_id_), static_cast<uint8_t>(code));
69 return ErrorCode::OK;
70#else
71 (void)voltage;
73#endif
74 }
75
76 private:
77#if SOC_DAC_SUPPORTED
78 static dac_channel_t ToChannel(uint8_t channel_id)
79 {
80 return channel_id == 0 ? DAC_CHAN_0 : DAC_CHAN_1;
81 }
82#endif
83
84 uint8_t channel_id_;
85 float reference_voltage_;
86 bool ready_ = false;
87};
88
89} // namespace LibXR
数字模拟转换器(DAC)基类
Definition dac.hpp:18
ErrorCode Write(float voltage) override
输出 DAC 电压
Definition esp_dac.hpp:43
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
@ NOT_SUPPORT
不支持 | Not supported
@ OK
操作成功 | Operation successful