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:
[legend]

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

 STM32ADC (ADC_HandleTypeDef *hadc, RawData dma_buff, std::initializer_list< uint32_t > channels, float vref)
 STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32.
 
 ~STM32ADC ()
 析构函数 Destructor
 
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_HandleTypeDef * hadc_
 
const uint8_t NUM_CHANNELS
 
uint8_t filter_size_
 
bool use_dma_
 
RawData dma_buffer_
 
float resolution_
 
Channel ** channels_
 
float vref_
 

Detailed Description

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

Definition at line 24 of file stm32_adc.hpp.

Constructor & Destructor Documentation

◆ STM32ADC()

STM32ADC::STM32ADC ( ADC_HandleTypeDef * hadc,
RawData dma_buff,
std::initializer_list< uint32_t > channels,
float vref )

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

Parameters
hadcADC外设 ADC device
dma_buffDMA缓冲区 DMA buffer
channelsADC通道列表 List of ADC channels
vref参考电压 Reference voltage

Definition at line 14 of file stm32_adc.cpp.

16 : hadc_(hadc),
17 NUM_CHANNELS(channels.size()),
18 filter_size_(dma_buff.size_ / NUM_CHANNELS / 2),
19 use_dma_(hadc_->DMA_Handle != nullptr),
20 dma_buffer_(dma_buff),
21 resolution_(GetADCResolution<ADC_HandleTypeDef>{}.Get(hadc)),
22 channels_(new Channel*[NUM_CHANNELS]),
23 vref_(vref)
24{
25 auto it = channels.begin();
26 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
27 {
28 channels_[i] = new Channel(this, i, *it++);
29 }
30
31 use_dma_ ? HAL_ADC_Start_DMA(hadc_, reinterpret_cast<uint32_t*>(dma_buffer_.addr_),
32 NUM_CHANNELS * filter_size_)
33 : HAL_ADC_Start(hadc_);
34}
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.

◆ ~STM32ADC()

STM32ADC::~STM32ADC ( )

析构函数 Destructor

Definition at line 36 of file stm32_adc.cpp.

37{
38 use_dma_ ? HAL_ADC_Stop_DMA(hadc_) : HAL_ADC_Stop(hadc_);
39 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
40 {
41 delete channels_[i];
42 }
43 delete[] channels_;
44}

Member Function Documentation

◆ ConvertToVoltage()

float STM32ADC::ConvertToVoltage ( float adc_value)
private

Definition at line 163 of file stm32_adc.cpp.

164{
165 return adc_value * vref_ / resolution_;
166}

◆ GetChannel()

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

获取 ADC 通道对象 Get ADC channel object

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

Definition at line 46 of file stm32_adc.cpp.

46{ return *channels_[index]; }

◆ ReadChannel()

float STM32ADC::ReadChannel ( uint8_t channel)

读取 ADC

Parameters
channel通道号 Channel number
Returns
float

Definition at line 48 of file stm32_adc.cpp.

49{
50 if (channel >= NUM_CHANNELS)
51 {
52 ASSERT(false);
53 return -1.0f;
54 }
55
56 uint16_t* buffer = reinterpret_cast<uint16_t*>(dma_buffer_.addr_);
57 if (use_dma_)
58 {
59#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
60 SCB_InvalidateDCache_by_Addr(buffer, filter_size_ * NUM_CHANNELS * 2);
61#endif
62 uint32_t sum = 0;
63 for (uint8_t i = 0; i < filter_size_; ++i)
64 {
65 sum += buffer[channel + i * NUM_CHANNELS];
66 }
67 return ConvertToVoltage(static_cast<float>(sum) / static_cast<float>(filter_size_));
68 }
69
70 ADC_ChannelConfTypeDef config = {};
71 uint32_t time = 0;
72 UNUSED(time);
73#if defined(ADC_SAMPLETIME_16CYCLES)
74 time = ADC_SAMPLETIME_16CYCLES;
75#elif defined(ADC_SAMPLETIME_16CYCLES_5)
76 time = ADC_SAMPLETIME_16CYCLES_5;
77#elif defined(ADC_SAMPLETIME_17CYCLES)
78 time = ADC_SAMPLETIME_17CYCLES;
79#elif defined(ADC_SAMPLETIME_17CYCLES_5)
80 time = ADC_SAMPLETIME_17CYCLES_5;
81#elif defined(ADC_SAMPLETIME_18CYCLES)
82 time = ADC_SAMPLETIME_18CYCLES;
83#elif defined(ADC_SAMPLETIME_18CYCLES_5)
84 time = ADC_SAMPLETIME_18CYCLES_5;
85#elif defined(ADC_SAMPLETIME_19CYCLES)
86 time = ADC_SAMPLETIME_19CYCLES;
87#elif defined(ADC_SAMPLETIME_19CYCLES_5)
88 time = ADC_SAMPLETIME_19CYCLES_5;
89#elif defined(ADC_SAMPLETIME_20CYCLES)
90 time = ADC_SAMPLETIME_20CYCLES;
91#elif defined(ADC_SAMPLETIME_20CYCLES_5)
92 time = ADC_SAMPLETIME_20CYCLES_5;
93#elif defined(ADC_SAMPLETIME_21CYCLES)
94 time = ADC_SAMPLETIME_21CYCLES;
95#elif defined(ADC_SAMPLETIME_21CYCLES_5)
96 time = ADC_SAMPLETIME_21CYCLES_5;
97#elif defined(ADC_SAMPLETIME_22CYCLES)
98 time = ADC_SAMPLETIME_22CYCLES;
99#elif defined(ADC_SAMPLETIME_22CYCLES_5)
100 time = ADC_SAMPLETIME_22CYCLES_5;
101#elif defined(ADC_SAMPLETIME_23CYCLES)
102 time = ADC_SAMPLETIME_23CYCLES;
103#elif defined(ADC_SAMPLETIME_23CYCLES_5)
104 time = ADC_SAMPLETIME_23CYCLES_5;
105#elif defined(ADC_SAMPLETIME_24CYCLES)
106 time = ADC_SAMPLETIME_24CYCLES;
107#elif defined(ADC_SAMPLETIME_24CYCLES_5)
108 time = ADC_SAMPLETIME_24CYCLES_5;
109#elif defined(ADC_SAMPLETIME_25CYCLES)
110 time = ADC_SAMPLETIME_25CYCLES;
111#elif defined(ADC_SAMPLETIME_25CYCLES_5)
112 time = ADC_SAMPLETIME_25CYCLES_5;
113#elif defined(ADC_SAMPLETIME_26CYCLES)
114 time = ADC_SAMPLETIME_26CYCLES;
115#elif defined(ADC_SAMPLETIME_26CYCLES_5)
116 time = ADC_SAMPLETIME_26CYCLES_5;
117#elif defined(ADC_SAMPLETIME_27CYCLES)
118 time = ADC_SAMPLETIME_27CYCLES;
119#elif defined(ADC_SAMPLETIME_27CYCLES_5)
120 time = ADC_SAMPLETIME_27CYCLES_5;
121#elif defined(ADC_SAMPLETIME_28CYCLES)
122 time = ADC_SAMPLETIME_28CYCLES;
123#elif defined(ADC_SAMPLETIME_28CYCLES_5)
124 time = ADC_SAMPLETIME_28CYCLES_5;
125#elif defined(ADC_SAMPLETIME_29CYCLES)
126 time = ADC_SAMPLETIME_29CYCLES;
127#elif defined(ADC_SAMPLETIME_29CYCLES_5)
128 time = ADC_SAMPLETIME_29CYCLES_5;
129#elif defined(ADC_SAMPLETIME_30CYCLES)
130 time = ADC_SAMPLETIME_30CYCLES;
131#elif defined(ADC_SAMPLETIME_30CYCLES_5)
132 time = ADC_SAMPLETIME_30CYCLES_5;
133#elif defined(ADC_SAMPLETIME_31CYCLES)
134 time = ADC_SAMPLETIME_31CYCLES;
135#elif defined(ADC_SAMPLETIME_31CYCLES_5)
136 time = ADC_SAMPLETIME_31CYCLES_5;
137#elif defined(ADC_SAMPLETIME_32CYCLES)
138 time = ADC_SAMPLETIME_32CYCLES;
139#elif defined(ADC_SAMPLETIME_32CYCLES_5)
140 time = ADC_SAMPLETIME_32CYCLES_5;
141#error "Unsupported sample time"
142#endif
143
144 config.Channel = channels_[channel]->ch_;
145 config.Rank = 1;
146#if !defined(STM32L0)
147 config.SamplingTime = time;
148#endif
149
150 HAL_ADC_ConfigChannel(hadc_, &config);
151
152 uint32_t sum = 0;
153 for (uint8_t i = 0; i < filter_size_; ++i)
154 {
155 HAL_ADC_Start(hadc_);
156 HAL_ADC_PollForConversion(hadc_, 20);
157 buffer[channel + i * NUM_CHANNELS] = HAL_ADC_GetValue(hadc_);
158 sum += buffer[channel + i * NUM_CHANNELS];
159 }
160 return ConvertToVoltage(static_cast<float>(sum) / static_cast<float>(filter_size_));
161}

Field Documentation

◆ channels_

Channel** LibXR::STM32ADC::channels_
private

Definition at line 154 of file stm32_adc.hpp.

◆ dma_buffer_

RawData LibXR::STM32ADC::dma_buffer_
private

Definition at line 152 of file stm32_adc.hpp.

◆ filter_size_

uint8_t LibXR::STM32ADC::filter_size_
private

Definition at line 150 of file stm32_adc.hpp.

◆ hadc_

ADC_HandleTypeDef* LibXR::STM32ADC::hadc_
private

Definition at line 148 of file stm32_adc.hpp.

◆ NUM_CHANNELS

const uint8_t LibXR::STM32ADC::NUM_CHANNELS
private

Definition at line 149 of file stm32_adc.hpp.

◆ resolution_

float LibXR::STM32ADC::resolution_
private

Definition at line 153 of file stm32_adc.hpp.

◆ use_dma_

bool LibXR::STM32ADC::use_dma_
private

Definition at line 151 of file stm32_adc.hpp.

◆ vref_

float LibXR::STM32ADC::vref_
private

Definition at line 155 of file stm32_adc.hpp.


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