libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_adc.cpp
1#include "stm32_adc.hpp"
2
3#ifdef HAL_ADC_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32ADC::Channel::Channel(STM32ADC* adc, uint8_t index, uint32_t ch)
8 : adc_(adc), index_(index), ch_(ch)
9{
10}
11
12STM32ADC::Channel::Channel() {}
13
14float STM32ADC::Channel::Read() { return adc_->ReadChannel(index_); }
15
16STM32ADC::STM32ADC(ADC_HandleTypeDef* hadc, RawData dma_buff, const uint32_t* channels,
17 uint8_t num_channels, float vref)
18 : hadc_(hadc),
19 NUM_CHANNELS(num_channels),
20 filter_size_(dma_buff.size_ / num_channels / 2),
21 use_dma_(hadc_->DMA_Handle != nullptr),
22 dma_buffer_(dma_buff),
23 resolution_(GetADCResolution<ADC_HandleTypeDef>{}.Get(hadc)),
24 channels_(new Channel[num_channels]),
25 vref_(vref)
26{
27 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
28 {
29 channels_[i] = Channel(this, i, channels[i]);
30 }
31
32 use_dma_ ? HAL_ADC_Start_DMA(hadc_, reinterpret_cast<uint32_t*>(dma_buffer_.addr_),
33 NUM_CHANNELS * filter_size_)
34 : HAL_ADC_Start(hadc_);
35}
36
38{
39 use_dma_ ? HAL_ADC_Stop_DMA(hadc_) : HAL_ADC_Stop(hadc_);
40 delete[] channels_;
41}
42
43STM32ADC::Channel& STM32ADC::GetChannel(uint8_t index) { return channels_[index]; }
44
45float STM32ADC::ReadChannel(uint8_t channel)
46{
47 if (channel >= NUM_CHANNELS)
48 {
49 ASSERT(false);
50 return -1.0f;
51 }
52
53 uint16_t* buffer = reinterpret_cast<uint16_t*>(dma_buffer_.addr_);
54 if (use_dma_)
55 {
56#if __DCACHE_PRESENT
57 SCB_InvalidateDCache_by_Addr(buffer, filter_size_ * NUM_CHANNELS * 2);
58#endif
59 uint32_t sum = 0;
60 for (uint8_t i = 0; i < filter_size_; ++i)
61 {
62 sum += buffer[channel + i * NUM_CHANNELS];
63 }
64 return ConvertToVoltage(static_cast<float>(sum) / static_cast<float>(filter_size_));
65 }
66
67 ADC_ChannelConfTypeDef config = {};
68 uint32_t time = 0;
69 UNUSED(time);
70#if defined(ADC_SAMPLETIME_16CYCLES)
71 time = ADC_SAMPLETIME_16CYCLES;
72#elif defined(ADC_SAMPLETIME_16CYCLES_5)
73 time = ADC_SAMPLETIME_16CYCLES_5;
74#elif defined(ADC_SAMPLETIME_17CYCLES)
75 time = ADC_SAMPLETIME_17CYCLES;
76#elif defined(ADC_SAMPLETIME_17CYCLES_5)
77 time = ADC_SAMPLETIME_17CYCLES_5;
78#elif defined(ADC_SAMPLETIME_18CYCLES)
79 time = ADC_SAMPLETIME_18CYCLES;
80#elif defined(ADC_SAMPLETIME_18CYCLES_5)
81 time = ADC_SAMPLETIME_18CYCLES_5;
82#elif defined(ADC_SAMPLETIME_19CYCLES)
83 time = ADC_SAMPLETIME_19CYCLES;
84#elif defined(ADC_SAMPLETIME_19CYCLES_5)
85 time = ADC_SAMPLETIME_19CYCLES_5;
86#elif defined(ADC_SAMPLETIME_20CYCLES)
87 time = ADC_SAMPLETIME_20CYCLES;
88#elif defined(ADC_SAMPLETIME_20CYCLES_5)
89 time = ADC_SAMPLETIME_20CYCLES_5;
90#elif defined(ADC_SAMPLETIME_21CYCLES)
91 time = ADC_SAMPLETIME_21CYCLES;
92#elif defined(ADC_SAMPLETIME_21CYCLES_5)
93 time = ADC_SAMPLETIME_21CYCLES_5;
94#elif defined(ADC_SAMPLETIME_22CYCLES)
95 time = ADC_SAMPLETIME_22CYCLES;
96#elif defined(ADC_SAMPLETIME_22CYCLES_5)
97 time = ADC_SAMPLETIME_22CYCLES_5;
98#elif defined(ADC_SAMPLETIME_23CYCLES)
99 time = ADC_SAMPLETIME_23CYCLES;
100#elif defined(ADC_SAMPLETIME_23CYCLES_5)
101 time = ADC_SAMPLETIME_23CYCLES_5;
102#elif defined(ADC_SAMPLETIME_24CYCLES)
103 time = ADC_SAMPLETIME_24CYCLES;
104#elif defined(ADC_SAMPLETIME_24CYCLES_5)
105 time = ADC_SAMPLETIME_24CYCLES_5;
106#elif defined(ADC_SAMPLETIME_25CYCLES)
107 time = ADC_SAMPLETIME_25CYCLES;
108#elif defined(ADC_SAMPLETIME_25CYCLES_5)
109 time = ADC_SAMPLETIME_25CYCLES_5;
110#elif defined(ADC_SAMPLETIME_26CYCLES)
111 time = ADC_SAMPLETIME_26CYCLES;
112#elif defined(ADC_SAMPLETIME_26CYCLES_5)
113 time = ADC_SAMPLETIME_26CYCLES_5;
114#elif defined(ADC_SAMPLETIME_27CYCLES)
115 time = ADC_SAMPLETIME_27CYCLES;
116#elif defined(ADC_SAMPLETIME_27CYCLES_5)
117 time = ADC_SAMPLETIME_27CYCLES_5;
118#elif defined(ADC_SAMPLETIME_28CYCLES)
119 time = ADC_SAMPLETIME_28CYCLES;
120#elif defined(ADC_SAMPLETIME_28CYCLES_5)
121 time = ADC_SAMPLETIME_28CYCLES_5;
122#elif defined(ADC_SAMPLETIME_29CYCLES)
123 time = ADC_SAMPLETIME_29CYCLES;
124#elif defined(ADC_SAMPLETIME_29CYCLES_5)
125 time = ADC_SAMPLETIME_29CYCLES_5;
126#elif defined(ADC_SAMPLETIME_30CYCLES)
127 time = ADC_SAMPLETIME_30CYCLES;
128#elif defined(ADC_SAMPLETIME_30CYCLES_5)
129 time = ADC_SAMPLETIME_30CYCLES_5;
130#elif defined(ADC_SAMPLETIME_31CYCLES)
131 time = ADC_SAMPLETIME_31CYCLES;
132#elif defined(ADC_SAMPLETIME_31CYCLES_5)
133 time = ADC_SAMPLETIME_31CYCLES_5;
134#elif defined(ADC_SAMPLETIME_32CYCLES)
135 time = ADC_SAMPLETIME_32CYCLES;
136#elif defined(ADC_SAMPLETIME_32CYCLES_5)
137 time = ADC_SAMPLETIME_32CYCLES_5;
138#error "Unsupported sample time"
139#endif
140
141 config.Channel = channels_[channel].ch_;
142 config.Rank = 1;
143#if !defined(STM32L0)
144 config.SamplingTime = time;
145#endif
146
147 HAL_ADC_ConfigChannel(hadc_, &config);
148
149 uint32_t sum = 0;
150 for (uint8_t i = 0; i < filter_size_; ++i)
151 {
152 HAL_ADC_Start(hadc_);
153 HAL_ADC_PollForConversion(hadc_, 20);
154 buffer[channel + i * NUM_CHANNELS] = HAL_ADC_GetValue(hadc_);
155 sum += buffer[channel + i * NUM_CHANNELS];
156 }
157 return ConvertToVoltage(static_cast<float>(sum) / static_cast<float>(filter_size_));
158}
159
160float STM32ADC::ConvertToVoltage(float adc_value)
161{
162 return adc_value * vref_ / resolution_;
163}
164
165#endif
原始数据封装类。 A class for encapsulating raw data.
void * addr_
数据存储地址。 The storage address of the data.
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC.
Definition stm32_adc.hpp:84
float Read() override
读取 ADC 值
Definition stm32_adc.cpp:14
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC channels.
Definition stm32_adc.hpp:23
~STM32ADC()
析构函数 Destructor
Definition stm32_adc.cpp:37
STM32ADC(ADC_HandleTypeDef *hadc, RawData dma_buff, const uint32_t *channels, uint8_t num_channels, float vref)
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32.
Definition stm32_adc.cpp:16
float ReadChannel(uint8_t channel)
读取 ADC 值
Definition stm32_adc.cpp:45
Channel & GetChannel(uint8_t index)
获取 ADC 通道对象 Get ADC channel object
Definition stm32_adc.cpp:43
LibXR 命名空间
Definition ch32_gpio.hpp:9
获取 ADC 分辨率 Get ADC resolution
Definition stm32_adc.hpp:32