15 std::initializer_list<uint32_t> channels,
float vref)
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),
22 channels_(
new Channel*[NUM_CHANNELS]),
25 auto it = channels.begin();
26 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
28 channels_[i] =
new Channel(
this, i, *it++);
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_);
50 if (channel >= NUM_CHANNELS)
56 uint16_t* buffer =
reinterpret_cast<uint16_t*
>(dma_buffer_.
addr_);
59#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
60 SCB_InvalidateDCache_by_Addr(buffer, filter_size_ * NUM_CHANNELS * 2);
63 for (uint8_t i = 0; i < filter_size_; ++i)
65 sum += buffer[channel + i * NUM_CHANNELS];
67 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));
70 ADC_ChannelConfTypeDef config = {};
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"
144 config.Channel = channels_[channel]->ch_;
147 config.SamplingTime = time;
150 HAL_ADC_ConfigChannel(hadc_, &config);
153 for (uint8_t i = 0; i < filter_size_; ++i)
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];
160 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));