126 const std::array<uint32_t, NumChannels>& channels,
float vref = 3.3f)
128 NUM_CHANNELS(NumChannels),
129 filter_size_(dma_buff.size_ / NumChannels / 2),
130 use_dma_(hadc_->DMA_Handle != nullptr),
131 dma_buffer_(dma_buff),
133 channels_(
new Channel[NumChannels]),
136 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
138 channels_[i] = Channel(
this, i, channels[i]);
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_);
168 if (channel >= NUM_CHANNELS)
174 uint16_t* buffer =
reinterpret_cast<uint16_t*
>(dma_buffer_.
addr_);
178 SCB_InvalidateDCache_by_Addr(buffer, filter_size_ * NUM_CHANNELS * 2);
181 for (uint8_t i = 0; i < filter_size_; ++i)
183 sum += buffer[channel + i * NUM_CHANNELS];
185 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));
188 ADC_ChannelConfTypeDef config = {};
191#if defined(ADC_SAMPLETIME_16CYCLES)
192 time = ADC_SAMPLETIME_16CYCLES;
193#elif defined(ADC_SAMPLETIME_16CYCLES_5)
194 time = ADC_SAMPLETIME_16CYCLES_5;
195#elif defined(ADC_SAMPLETIME_17CYCLES)
196 time = ADC_SAMPLETIME_17CYCLES;
197#elif defined(ADC_SAMPLETIME_17CYCLES_5)
198 time = ADC_SAMPLETIME_17CYCLES_5;
199#elif defined(ADC_SAMPLETIME_18CYCLES)
200 time = ADC_SAMPLETIME_18CYCLES;
201#elif defined(ADC_SAMPLETIME_18CYCLES_5)
202 time = ADC_SAMPLETIME_18CYCLES_5;
203#elif defined(ADC_SAMPLETIME_19CYCLES)
204 time = ADC_SAMPLETIME_19CYCLES;
205#elif defined(ADC_SAMPLETIME_19CYCLES_5)
206 time = ADC_SAMPLETIME_19CYCLES_5;
207#elif defined(ADC_SAMPLETIME_20CYCLES)
208 time = ADC_SAMPLETIME_20CYCLES;
209#elif defined(ADC_SAMPLETIME_20CYCLES_5)
210 time = ADC_SAMPLETIME_20CYCLES_5;
211#elif defined(ADC_SAMPLETIME_21CYCLES)
212 time = ADC_SAMPLETIME_21CYCLES;
213#elif defined(ADC_SAMPLETIME_21CYCLES_5)
214 time = ADC_SAMPLETIME_21CYCLES_5;
215#elif defined(ADC_SAMPLETIME_22CYCLES)
216 time = ADC_SAMPLETIME_22CYCLES;
217#elif defined(ADC_SAMPLETIME_22CYCLES_5)
218 time = ADC_SAMPLETIME_22CYCLES_5;
219#elif defined(ADC_SAMPLETIME_23CYCLES)
220 time = ADC_SAMPLETIME_23CYCLES;
221#elif defined(ADC_SAMPLETIME_23CYCLES_5)
222 time = ADC_SAMPLETIME_23CYCLES_5;
223#elif defined(ADC_SAMPLETIME_24CYCLES)
224 time = ADC_SAMPLETIME_24CYCLES;
225#elif defined(ADC_SAMPLETIME_24CYCLES_5)
226 time = ADC_SAMPLETIME_24CYCLES_5;
227#elif defined(ADC_SAMPLETIME_25CYCLES)
228 time = ADC_SAMPLETIME_25CYCLES;
229#elif defined(ADC_SAMPLETIME_25CYCLES_5)
230 time = ADC_SAMPLETIME_25CYCLES_5;
231#elif defined(ADC_SAMPLETIME_26CYCLES)
232 time = ADC_SAMPLETIME_26CYCLES;
233#elif defined(ADC_SAMPLETIME_26CYCLES_5)
234 time = ADC_SAMPLETIME_26CYCLES_5;
235#elif defined(ADC_SAMPLETIME_27CYCLES)
236 time = ADC_SAMPLETIME_27CYCLES;
237#elif defined(ADC_SAMPLETIME_27CYCLES_5)
238 time = ADC_SAMPLETIME_27CYCLES_5;
239#elif defined(ADC_SAMPLETIME_28CYCLES)
240 time = ADC_SAMPLETIME_28CYCLES;
241#elif defined(ADC_SAMPLETIME_28CYCLES_5)
242 time = ADC_SAMPLETIME_28CYCLES_5;
243#elif defined(ADC_SAMPLETIME_29CYCLES)
244 time = ADC_SAMPLETIME_29CYCLES;
245#elif defined(ADC_SAMPLETIME_29CYCLES_5)
246 time = ADC_SAMPLETIME_29CYCLES_5;
247#elif defined(ADC_SAMPLETIME_30CYCLES)
248 time = ADC_SAMPLETIME_30CYCLES;
249#elif defined(ADC_SAMPLETIME_30CYCLES_5)
250 time = ADC_SAMPLETIME_30CYCLES_5;
251#elif defined(ADC_SAMPLETIME_31CYCLES)
252 time = ADC_SAMPLETIME_31CYCLES;
253#elif defined(ADC_SAMPLETIME_31CYCLES_5)
254 time = ADC_SAMPLETIME_31CYCLES_5;
255#elif defined(ADC_SAMPLETIME_32CYCLES)
256 time = ADC_SAMPLETIME_32CYCLES;
257#elif defined(ADC_SAMPLETIME_32CYCLES_5)
258 time = ADC_SAMPLETIME_32CYCLES_5;
259#error "Unsupported sample time"
262 config.Channel = channels_[channel].ch_;
265 config.SamplingTime = time;
268 HAL_ADC_ConfigChannel(hadc_, &config);
271 for (uint8_t i = 0; i < filter_size_; ++i)
273 HAL_ADC_Start(hadc_);
274 HAL_ADC_PollForConversion(hadc_, 20);
275 buffer[channel + i * NUM_CHANNELS] = HAL_ADC_GetValue(hadc_);
276 sum += buffer[channel + i * NUM_CHANNELS];
278 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));