libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::STM32ADC Class Reference

STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC channels. More...

#include <stm32_adc.hpp>

Collaboration diagram for LibXR::STM32ADC:

Data Structures

class  Channel
 STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC. More...
 
struct  GetADCResolution
 获取 ADC 分辨率 Get ADC resolution More...
 
struct  GetADCResolution< T, std::void_t< decltype(std::declval< T >().Init.Resolution)> >
 获取 ADC 分辨率 Get ADC resolution More...
 

Public Member Functions

template<size_t NumChannels>
 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.
 
ChannelGetChannel (uint8_t index)
 获取 ADC 通道对象 Get ADC channel object
 
float ReadChannel (uint8_t channel)
 读取 ADC
 

Private Member Functions

float ConvertToVoltage (float adc_value)
 

Private Attributes

ADC_HandleTypeDefhadc_
 
const uint8_t NUM_CHANNELS
 
uint8_t filter_size_
 
bool use_dma_
 
RawData dma_buffer_
 
float resolution_
 
Channelchannels_
 
float vref_
 

Detailed Description

STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC channels.

Definition at line 22 of file stm32_adc.hpp.

Constructor & Destructor Documentation

◆ STM32ADC()

template<size_t NumChannels>
LibXR::STM32ADC::STM32ADC ( ADC_HandleTypeDef hadc,
RawData  dma_buff,
const std::array< uint32_t, NumChannels > &  channels,
float  vref = 3.3f 
)
inline

STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32.

Template Parameters
NumChannels通道数量 Number of channels
Parameters
hadcADC外设 ADC device
dma_buffDMA缓冲区 DMA buffer
channels通道号 Channel number
vref参考电压 Reference voltage

Definition at line 125 of file stm32_adc.hpp.

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 }
void * addr_
数据存储地址。 The storage address of the data.
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值

◆ ~STM32ADC()

LibXR::STM32ADC::~STM32ADC ( )
inline

Definition at line 146 of file stm32_adc.hpp.

147 {
148 use_dma_ ? HAL_ADC_Stop_DMA(hadc_) : HAL_ADC_Stop(hadc_);
149 delete[] channels_;
150 }

Member Function Documentation

◆ ConvertToVoltage()

float LibXR::STM32ADC::ConvertToVoltage ( float  adc_value)
inlineprivate

Definition at line 288 of file stm32_adc.hpp.

288{ return adc_value * vref_ / resolution_; }

◆ GetChannel()

Channel & LibXR::STM32ADC::GetChannel ( uint8_t  index)
inline

获取 ADC 通道对象 Get ADC channel object

Parameters
index通道索引 Channel index
Returns
Channel& 通道对象 Channel object

Definition at line 158 of file stm32_adc.hpp.

158{ return channels_[index]; }

◆ ReadChannel()

float LibXR::STM32ADC::ReadChannel ( uint8_t  channel)
inline

读取 ADC

Parameters
channel通道号 Channel number
Returns
float

Definition at line 166 of file stm32_adc.hpp.

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
186 uint32_t time = 0;
187 UNUSED(time);
188#if defined(ADC_SAMPLETIME_16CYCLES)
190#elif defined(ADC_SAMPLETIME_16CYCLES_5)
192#elif defined(ADC_SAMPLETIME_17CYCLES)
194#elif defined(ADC_SAMPLETIME_17CYCLES_5)
196#elif defined(ADC_SAMPLETIME_18CYCLES)
198#elif defined(ADC_SAMPLETIME_18CYCLES_5)
200#elif defined(ADC_SAMPLETIME_19CYCLES)
202#elif defined(ADC_SAMPLETIME_19CYCLES_5)
204#elif defined(ADC_SAMPLETIME_20CYCLES)
206#elif defined(ADC_SAMPLETIME_20CYCLES_5)
208#elif defined(ADC_SAMPLETIME_21CYCLES)
210#elif defined(ADC_SAMPLETIME_21CYCLES_5)
212#elif defined(ADC_SAMPLETIME_22CYCLES)
214#elif defined(ADC_SAMPLETIME_22CYCLES_5)
216#elif defined(ADC_SAMPLETIME_23CYCLES)
218#elif defined(ADC_SAMPLETIME_23CYCLES_5)
220#elif defined(ADC_SAMPLETIME_24CYCLES)
222#elif defined(ADC_SAMPLETIME_24CYCLES_5)
224#elif defined(ADC_SAMPLETIME_25CYCLES)
226#elif defined(ADC_SAMPLETIME_25CYCLES_5)
228#elif defined(ADC_SAMPLETIME_26CYCLES)
230#elif defined(ADC_SAMPLETIME_26CYCLES_5)
232#elif defined(ADC_SAMPLETIME_27CYCLES)
234#elif defined(ADC_SAMPLETIME_27CYCLES_5)
236#elif defined(ADC_SAMPLETIME_28CYCLES)
238#elif defined(ADC_SAMPLETIME_28CYCLES_5)
240#elif defined(ADC_SAMPLETIME_29CYCLES)
242#elif defined(ADC_SAMPLETIME_29CYCLES_5)
244#elif defined(ADC_SAMPLETIME_30CYCLES)
246#elif defined(ADC_SAMPLETIME_30CYCLES_5)
248#elif defined(ADC_SAMPLETIME_31CYCLES)
250#elif defined(ADC_SAMPLETIME_31CYCLES_5)
252#elif defined(ADC_SAMPLETIME_32CYCLES)
254#elif defined(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
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 }

Field Documentation

◆ channels_

Channel* LibXR::STM32ADC::channels_
private

Definition at line 285 of file stm32_adc.hpp.

◆ dma_buffer_

RawData LibXR::STM32ADC::dma_buffer_
private

Definition at line 283 of file stm32_adc.hpp.

◆ filter_size_

uint8_t LibXR::STM32ADC::filter_size_
private

Definition at line 281 of file stm32_adc.hpp.

◆ hadc_

ADC_HandleTypeDef* LibXR::STM32ADC::hadc_
private

Definition at line 279 of file stm32_adc.hpp.

◆ NUM_CHANNELS

const uint8_t LibXR::STM32ADC::NUM_CHANNELS
private

Definition at line 280 of file stm32_adc.hpp.

◆ resolution_

float LibXR::STM32ADC::resolution_
private

Definition at line 284 of file stm32_adc.hpp.

◆ use_dma_

bool LibXR::STM32ADC::use_dma_
private

Definition at line 282 of file stm32_adc.hpp.

◆ vref_

float LibXR::STM32ADC::vref_
private

Definition at line 286 of file stm32_adc.hpp.


The documentation for this class was generated from the following file: