libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_adc.hpp
1#pragma once
2
3#include "main.h"
4
5#ifdef HAL_ADC_MODULE_ENABLED
6
7#ifdef ADC
8#undef ADC
9#endif
10
11#include "adc.hpp"
12#include "libxr.hpp"
13
14namespace LibXR
15{
16
23{
30 template <typename, typename = void>
32 {
33 float Get(ADC_HandleTypeDef* hadc)
34 {
35 UNUSED(hadc);
36 return 4095.0f;
37 }
38 };
39
45 template <typename T>
46 struct GetADCResolution<T, std::void_t<decltype(std::declval<T>().Init.Resolution)>>
47 {
48 float Get(T* hadc)
49 {
50 switch (hadc->Init.Resolution)
51 {
52#ifdef ADC_RESOLUTION_16B
53 case ADC_RESOLUTION_16B:
54 return 65535.0f;
55#endif
56#ifdef ADC_RESOLUTION_12B
57 case ADC_RESOLUTION_12B:
58 return 4095.0f;
59#endif
60#ifdef ADC_RESOLUTION_10B
61 case ADC_RESOLUTION_10B:
62 return 1023.0f;
63#endif
64#ifdef ADC_RESOLUTION_8B
65 case ADC_RESOLUTION_8B:
66 return 255.0f;
67#endif
68#ifdef ADC_RESOLUTION_6B
69 case ADC_RESOLUTION_6B:
70 return 63.0f;
71#endif
72 default:
73 return 4095.0f;
74 }
75 }
76 };
77
78 public:
83 class Channel : public ADC
84 {
85 public:
94 Channel(STM32ADC* adc, uint8_t index, uint32_t ch) : adc_(adc), index_(index), ch_(ch)
95 {
96 }
97
104 float Read() override { return adc_->ReadChannel(index_); }
105
106 private:
107 Channel() {};
108 STM32ADC* adc_;
109 uint8_t index_;
110 uint32_t ch_;
111
112 friend class STM32ADC;
113 };
114
124 template <size_t NumChannels>
125 STM32ADC(ADC_HandleTypeDef* hadc, RawData dma_buff,
126 const std::array<uint32_t, NumChannels>& channels, float vref = 3.3f)
127 : hadc_(hadc),
128 NUM_CHANNELS(NumChannels),
129 filter_size_(dma_buff.size_ / NumChannels / 2),
130 use_dma_(hadc_->DMA_Handle != nullptr),
131 dma_buffer_(dma_buff),
132 resolution_(GetADCResolution<ADC_HandleTypeDef>{}.Get(hadc)),
133 channels_(new Channel[NumChannels]),
134 vref_(vref)
135 {
136 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
137 {
138 channels_[i] = Channel(this, i, channels[i]);
139 }
140
141 use_dma_ ? HAL_ADC_Start_DMA(hadc_, reinterpret_cast<uint32_t*>(dma_buffer_.addr_),
142 NUM_CHANNELS * filter_size_)
143 : HAL_ADC_Start(hadc_);
144 }
145
146 ~STM32ADC()
147 {
148 use_dma_ ? HAL_ADC_Stop_DMA(hadc_) : HAL_ADC_Stop(hadc_);
149 delete[] channels_;
150 }
151
158 Channel& GetChannel(uint8_t index) { return channels_[index]; }
159
166 float ReadChannel(uint8_t channel)
167 {
168 if (channel >= NUM_CHANNELS)
169 {
170 ASSERT(false);
171 return -1.0f;
172 }
173
174 uint16_t* buffer = reinterpret_cast<uint16_t*>(dma_buffer_.addr_);
175 if (use_dma_)
176 {
177 uint32_t sum = 0;
178 for (uint8_t i = 0; i < filter_size_; ++i)
179 {
180 sum += buffer[channel + i * NUM_CHANNELS];
181 }
182 return ConvertToVoltage(static_cast<float>(sum) / static_cast<float>(filter_size_));
183 }
184
185 ADC_ChannelConfTypeDef config = {};
186 uint32_t time = 0;
187 UNUSED(time);
188#if defined(ADC_SAMPLETIME_16CYCLES)
189 time = ADC_SAMPLETIME_16CYCLES;
190#elif defined(ADC_SAMPLETIME_16CYCLES_5)
191 time = ADC_SAMPLETIME_16CYCLES_5;
192#elif defined(ADC_SAMPLETIME_17CYCLES)
193 time = ADC_SAMPLETIME_17CYCLES;
194#elif defined(ADC_SAMPLETIME_17CYCLES_5)
195 time = ADC_SAMPLETIME_17CYCLES_5;
196#elif defined(ADC_SAMPLETIME_18CYCLES)
197 time = ADC_SAMPLETIME_18CYCLES;
198#elif defined(ADC_SAMPLETIME_18CYCLES_5)
199 time = ADC_SAMPLETIME_18CYCLES_5;
200#elif defined(ADC_SAMPLETIME_19CYCLES)
201 time = ADC_SAMPLETIME_19CYCLES;
202#elif defined(ADC_SAMPLETIME_19CYCLES_5)
203 time = ADC_SAMPLETIME_19CYCLES_5;
204#elif defined(ADC_SAMPLETIME_20CYCLES)
205 time = ADC_SAMPLETIME_20CYCLES;
206#elif defined(ADC_SAMPLETIME_20CYCLES_5)
207 time = ADC_SAMPLETIME_20CYCLES_5;
208#elif defined(ADC_SAMPLETIME_21CYCLES)
209 time = ADC_SAMPLETIME_21CYCLES;
210#elif defined(ADC_SAMPLETIME_21CYCLES_5)
211 time = ADC_SAMPLETIME_21CYCLES_5;
212#elif defined(ADC_SAMPLETIME_22CYCLES)
213 time = ADC_SAMPLETIME_22CYCLES;
214#elif defined(ADC_SAMPLETIME_22CYCLES_5)
215 time = ADC_SAMPLETIME_22CYCLES_5;
216#elif defined(ADC_SAMPLETIME_23CYCLES)
217 time = ADC_SAMPLETIME_23CYCLES;
218#elif defined(ADC_SAMPLETIME_23CYCLES_5)
219 time = ADC_SAMPLETIME_23CYCLES_5;
220#elif defined(ADC_SAMPLETIME_24CYCLES)
221 time = ADC_SAMPLETIME_24CYCLES;
222#elif defined(ADC_SAMPLETIME_24CYCLES_5)
223 time = ADC_SAMPLETIME_24CYCLES_5;
224#elif defined(ADC_SAMPLETIME_25CYCLES)
225 time = ADC_SAMPLETIME_25CYCLES;
226#elif defined(ADC_SAMPLETIME_25CYCLES_5)
227 time = ADC_SAMPLETIME_25CYCLES_5;
228#elif defined(ADC_SAMPLETIME_26CYCLES)
229 time = ADC_SAMPLETIME_26CYCLES;
230#elif defined(ADC_SAMPLETIME_26CYCLES_5)
231 time = ADC_SAMPLETIME_26CYCLES_5;
232#elif defined(ADC_SAMPLETIME_27CYCLES)
233 time = ADC_SAMPLETIME_27CYCLES;
234#elif defined(ADC_SAMPLETIME_27CYCLES_5)
235 time = ADC_SAMPLETIME_27CYCLES_5;
236#elif defined(ADC_SAMPLETIME_28CYCLES)
237 time = ADC_SAMPLETIME_28CYCLES;
238#elif defined(ADC_SAMPLETIME_28CYCLES_5)
239 time = ADC_SAMPLETIME_28CYCLES_5;
240#elif defined(ADC_SAMPLETIME_29CYCLES)
241 time = ADC_SAMPLETIME_29CYCLES;
242#elif defined(ADC_SAMPLETIME_29CYCLES_5)
243 time = ADC_SAMPLETIME_29CYCLES_5;
244#elif defined(ADC_SAMPLETIME_30CYCLES)
245 time = ADC_SAMPLETIME_30CYCLES;
246#elif defined(ADC_SAMPLETIME_30CYCLES_5)
247 time = ADC_SAMPLETIME_30CYCLES_5;
248#elif defined(ADC_SAMPLETIME_31CYCLES)
249 time = ADC_SAMPLETIME_31CYCLES;
250#elif defined(ADC_SAMPLETIME_31CYCLES_5)
251 time = ADC_SAMPLETIME_31CYCLES_5;
252#elif defined(ADC_SAMPLETIME_32CYCLES)
253 time = ADC_SAMPLETIME_32CYCLES;
254#elif defined(ADC_SAMPLETIME_32CYCLES_5)
255 time = ADC_SAMPLETIME_32CYCLES_5;
256#error "Unsupported sample time"
257#endif
258
259 config.Channel = channels_[channel].ch_;
260 config.Rank = 1;
261#if !defined(STM32L0)
262 config.SamplingTime = time;
263#endif
264
265 HAL_ADC_ConfigChannel(hadc_, &config);
266
267 uint32_t sum = 0;
268 for (uint8_t i = 0; i < filter_size_; ++i)
269 {
270 HAL_ADC_Start(hadc_);
271 HAL_ADC_PollForConversion(hadc_, 20);
272 buffer[channel + i * NUM_CHANNELS] = HAL_ADC_GetValue(hadc_);
273 sum += buffer[channel + i * NUM_CHANNELS];
274 }
275 return ConvertToVoltage(static_cast<float>(sum) / static_cast<float>(filter_size_));
276 }
277
278 private:
279 ADC_HandleTypeDef* hadc_;
280 const uint8_t NUM_CHANNELS;
281 uint8_t filter_size_;
282 bool use_dma_;
283 RawData dma_buffer_;
284 float resolution_;
285 Channel* channels_;
286 float vref_;
287
288 float ConvertToVoltage(float adc_value) { return adc_value * vref_ / resolution_; }
289};
290
291} // namespace LibXR
292
293#endif
模拟数字转换器(ADC)基类
Definition adc.hpp:18
原始数据封装类。 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
Channel(STM32ADC *adc, uint8_t index, uint32_t ch)
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC.
Definition stm32_adc.hpp:94
float Read() override
读取 ADC 值
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC channels.
Definition stm32_adc.hpp:23
float ReadChannel(uint8_t channel)
读取 ADC 值
STM32ADC(ADC_HandleTypeDef *hadc, RawData dma_buff, const std::array< uint32_t, NumChannels > &channels, float vref=3.3f)
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32.
Channel & GetChannel(uint8_t index)
获取 ADC 通道对象 Get ADC channel object
LibXR Color Control Library / LibXR终端颜色控制库
获取 ADC 分辨率 Get ADC resolution
Definition stm32_adc.hpp:32