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 for (uint8_t i = 0; i < filter_size_; ++i)
180 sum += buffer[channel + i * NUM_CHANNELS];
182 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));
185 ADC_ChannelConfTypeDef config = {};
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"
259 config.Channel = channels_[channel].ch_;
262 config.SamplingTime = time;
265 HAL_ADC_ConfigChannel(hadc_, &config);
268 for (uint8_t i = 0; i < filter_size_; ++i)
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];
275 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));