49 std::initializer_list<uint32_t> channels,
float vref)
51 NUM_CHANNELS(channels.size()),
52 filter_size_(CalculateFilterSize(dma_buff, channels.size())),
53 use_dma_(hadc_->DMA_Handle != nullptr),
54 dma_buffer_(dma_buff),
56 channels_(
new Channel*[NUM_CHANNELS]),
59 auto it = channels.begin();
60 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
62 channels_[i] =
new Channel(
this, i, *it++);
65#if defined(ADC_CALIB_OFFSET_AND_LINEARITY) && defined(ADC_SINGLE_ENDED)
66 HAL_ADCEx_Calibration_Start(hadc, ADC_CALIB_OFFSET_AND_LINEARITY, ADC_SINGLE_ENDED);
67#elif defined(ADC_CALIB_OFFSET_LINEARITY) && defined(ADC_SINGLE_ENDED)
68 HAL_ADCEx_Calibration_Start(hadc, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
69#elif defined(ADC_CALIB_OFFSET) && defined(ADC_SINGLE_ENDED)
70 HAL_ADCEx_Calibration_Start(hadc, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
71#elif defined(ADC_SINGLE_ENDED)
72 HAL_ADCEx_Calibration_Start(hadc, ADC_SINGLE_ENDED);
74 HAL_ADCEx_Calibration_Start(hadc);
80 AssertContinuousConvModeEnabled<H>(hadc_);
81 AssertDMAContReqEnabled<H>(hadc_);
82 AssertDMACircular<H>(hadc_);
83 AssertNbrOfConvEq<H>(hadc_, NUM_CHANNELS);
84 HAL_ADC_Start_DMA(hadc_,
reinterpret_cast<uint32_t*
>(dma_buffer_.addr_),
85 NUM_CHANNELS * filter_size_);
89 AssertNbrOfConvEq<H>(hadc_, 1);
90 AssertContinuousConvModeDisabled<H>(hadc_);
109 if (channel >= NUM_CHANNELS)
115 uint16_t* buffer =
reinterpret_cast<uint16_t*
>(dma_buffer_.
addr_);
120 for (uint8_t i = 0; i < filter_size_; ++i)
122 sum += buffer[channel + i * NUM_CHANNELS];
124 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));
127 ADC_ChannelConfTypeDef config = {};
130#if defined(ADC_SAMPLETIME_16CYCLES)
131 time = ADC_SAMPLETIME_16CYCLES;
132#elif defined(ADC_SAMPLETIME_16CYCLES_5)
133 time = ADC_SAMPLETIME_16CYCLES_5;
134#elif defined(ADC_SAMPLETIME_17CYCLES)
135 time = ADC_SAMPLETIME_17CYCLES;
136#elif defined(ADC_SAMPLETIME_17CYCLES_5)
137 time = ADC_SAMPLETIME_17CYCLES_5;
138#elif defined(ADC_SAMPLETIME_18CYCLES)
139 time = ADC_SAMPLETIME_18CYCLES;
140#elif defined(ADC_SAMPLETIME_18CYCLES_5)
141 time = ADC_SAMPLETIME_18CYCLES_5;
142#elif defined(ADC_SAMPLETIME_19CYCLES)
143 time = ADC_SAMPLETIME_19CYCLES;
144#elif defined(ADC_SAMPLETIME_19CYCLES_5)
145 time = ADC_SAMPLETIME_19CYCLES_5;
146#elif defined(ADC_SAMPLETIME_20CYCLES)
147 time = ADC_SAMPLETIME_20CYCLES;
148#elif defined(ADC_SAMPLETIME_20CYCLES_5)
149 time = ADC_SAMPLETIME_20CYCLES_5;
150#elif defined(ADC_SAMPLETIME_21CYCLES)
151 time = ADC_SAMPLETIME_21CYCLES;
152#elif defined(ADC_SAMPLETIME_21CYCLES_5)
153 time = ADC_SAMPLETIME_21CYCLES_5;
154#elif defined(ADC_SAMPLETIME_22CYCLES)
155 time = ADC_SAMPLETIME_22CYCLES;
156#elif defined(ADC_SAMPLETIME_22CYCLES_5)
157 time = ADC_SAMPLETIME_22CYCLES_5;
158#elif defined(ADC_SAMPLETIME_23CYCLES)
159 time = ADC_SAMPLETIME_23CYCLES;
160#elif defined(ADC_SAMPLETIME_23CYCLES_5)
161 time = ADC_SAMPLETIME_23CYCLES_5;
162#elif defined(ADC_SAMPLETIME_24CYCLES)
163 time = ADC_SAMPLETIME_24CYCLES;
164#elif defined(ADC_SAMPLETIME_24CYCLES_5)
165 time = ADC_SAMPLETIME_24CYCLES_5;
166#elif defined(ADC_SAMPLETIME_25CYCLES)
167 time = ADC_SAMPLETIME_25CYCLES;
168#elif defined(ADC_SAMPLETIME_25CYCLES_5)
169 time = ADC_SAMPLETIME_25CYCLES_5;
170#elif defined(ADC_SAMPLETIME_26CYCLES)
171 time = ADC_SAMPLETIME_26CYCLES;
172#elif defined(ADC_SAMPLETIME_26CYCLES_5)
173 time = ADC_SAMPLETIME_26CYCLES_5;
174#elif defined(ADC_SAMPLETIME_27CYCLES)
175 time = ADC_SAMPLETIME_27CYCLES;
176#elif defined(ADC_SAMPLETIME_27CYCLES_5)
177 time = ADC_SAMPLETIME_27CYCLES_5;
178#elif defined(ADC_SAMPLETIME_28CYCLES)
179 time = ADC_SAMPLETIME_28CYCLES;
180#elif defined(ADC_SAMPLETIME_28CYCLES_5)
181 time = ADC_SAMPLETIME_28CYCLES_5;
182#elif defined(ADC_SAMPLETIME_29CYCLES)
183 time = ADC_SAMPLETIME_29CYCLES;
184#elif defined(ADC_SAMPLETIME_29CYCLES_5)
185 time = ADC_SAMPLETIME_29CYCLES_5;
186#elif defined(ADC_SAMPLETIME_30CYCLES)
187 time = ADC_SAMPLETIME_30CYCLES;
188#elif defined(ADC_SAMPLETIME_30CYCLES_5)
189 time = ADC_SAMPLETIME_30CYCLES_5;
190#elif defined(ADC_SAMPLETIME_31CYCLES)
191 time = ADC_SAMPLETIME_31CYCLES;
192#elif defined(ADC_SAMPLETIME_31CYCLES_5)
193 time = ADC_SAMPLETIME_31CYCLES_5;
194#elif defined(ADC_SAMPLETIME_32CYCLES)
195 time = ADC_SAMPLETIME_32CYCLES;
196#elif defined(ADC_SAMPLETIME_32CYCLES_5)
197 time = ADC_SAMPLETIME_32CYCLES_5;
198#error "Unsupported sample time"
201 config.Channel = channels_[channel]->ch_;
202#if defined(ADC_REGULAR_RANK_1)
203 config.Rank = ADC_REGULAR_RANK_1;
207#if defined(ADC_SINGLE_ENDED) && !defined(STM32L0)
208 config.SingleDiff = ADC_SINGLE_ENDED;
210#if defined(ADC_OFFSET_NONE)
211 config.OffsetNumber = ADC_OFFSET_NONE;
215 config.SamplingTime = time;
218 uint32_t expected = 0U;
220 if (!locked_.compare_exchange_strong(expected, 0xF0F0F0F0U, std::memory_order_acquire,
221 std::memory_order_relaxed))
229 HAL_ADC_ConfigChannel(hadc_, &config);
232 for (uint8_t i = 0; i < filter_size_; ++i)
234 HAL_ADC_Start(hadc_);
235 HAL_ADC_PollForConversion(hadc_, 20);
236 buffer[channel + i * NUM_CHANNELS] = HAL_ADC_GetValue(hadc_);
237 sum += buffer[channel + i * NUM_CHANNELS];
240 locked_.store(0, std::memory_order_release);
242 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));