@@ -183,6 +183,166 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
183183 return 0 ;
184184}
185185
186+ /* *
187+ * Function initializing the ADC and the regular channels for inline current sensing
188+ * with continuous conversion mode
189+ *
190+ * @param cs_params - current sense parameters
191+ *
192+ * @return int - 0 if success
193+ */
194+ int _adc_init_inline (Stm32CurrentSenseParams* cs_params)
195+ {
196+ ADC_ChannelConfTypeDef sConfig = {0 };
197+
198+ /* *Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
199+ */
200+ auto adc_instance = _findBestADCForPins (3 , cs_params->pins , hadc);
201+
202+ if (adc_instance == ADC1) {
203+ #ifdef __HAL_RCC_ADC1_CLK_ENABLE
204+ __HAL_RCC_ADC1_CLK_ENABLE ();
205+ #endif
206+ #ifdef __HAL_RCC_ADC12_CLK_ENABLE
207+ __HAL_RCC_ADC12_CLK_ENABLE ();
208+ #endif
209+ }
210+ #ifdef ADC2
211+ else if (adc_instance == ADC2) {
212+ #ifdef __HAL_RCC_ADC2_CLK_ENABLE
213+ __HAL_RCC_ADC2_CLK_ENABLE ();
214+ #endif
215+ #ifdef __HAL_RCC_ADC12_CLK_ENABLE
216+ __HAL_RCC_ADC12_CLK_ENABLE ();
217+ #endif
218+ }
219+ #endif
220+ #ifdef ADC3
221+ else if (adc_instance == ADC3) {
222+ #ifdef __HAL_RCC_ADC3_CLK_ENABLE
223+ __HAL_RCC_ADC3_CLK_ENABLE ();
224+ #endif
225+ #ifdef __HAL_RCC_ADC34_CLK_ENABLE
226+ __HAL_RCC_ADC34_CLK_ENABLE ();
227+ #endif
228+ #if defined(ADC345_COMMON)
229+ __HAL_RCC_ADC345_CLK_ENABLE ();
230+ #endif
231+ }
232+ #endif
233+ #ifdef ADC4
234+ else if (adc_instance == ADC4) {
235+ #ifdef __HAL_RCC_ADC4_CLK_ENABLE
236+ __HAL_RCC_ADC4_CLK_ENABLE ();
237+ #endif
238+ #ifdef __HAL_RCC_ADC34_CLK_ENABLE
239+ __HAL_RCC_ADC34_CLK_ENABLE ();
240+ #endif
241+ #if defined(ADC345_COMMON)
242+ __HAL_RCC_ADC345_CLK_ENABLE ();
243+ #endif
244+ }
245+ #endif
246+ #ifdef ADC5
247+ else if (adc_instance == ADC5) {
248+ #if defined(ADC345_COMMON)
249+ __HAL_RCC_ADC345_CLK_ENABLE ();
250+ #endif
251+ }
252+ #endif
253+ else {
254+ #ifdef SIMPLEFOC_STM32_DEBUG
255+ SIMPLEFOC_DEBUG (" STM32-CS: ERR: Cannot find a common ADC for the pins!" );
256+ #endif
257+ return -1 ; // error not a valid ADC instance
258+ }
259+
260+ int adc_num = _adcToIndex (adc_instance);
261+
262+ #ifdef SIMPLEFOC_STM32_DEBUG
263+ SIMPLEFOC_DEBUG (" STM32-CS: Using ADC: " , adc_num+1 );
264+ #endif
265+
266+ hadc[adc_num].Instance = adc_instance;
267+
268+ // Configure ADC for continuous conversion mode on regular channels
269+ hadc[adc_num].Init .ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
270+ hadc[adc_num].Init .Resolution = ADC_RESOLUTION_12B;
271+ hadc[adc_num].Init .ScanConvMode = ADC_SCAN_ENABLE; // Enable scan mode for multiple channels
272+ hadc[adc_num].Init .ContinuousConvMode = ENABLE; // Enable continuous conversion
273+ hadc[adc_num].Init .LowPowerAutoWait = DISABLE;
274+ hadc[adc_num].Init .GainCompensation = 0 ;
275+ hadc[adc_num].Init .DiscontinuousConvMode = DISABLE;
276+ hadc[adc_num].Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
277+ hadc[adc_num].Init .ExternalTrigConv = ADC_SOFTWARE_START;
278+ hadc[adc_num].Init .DataAlign = ADC_DATAALIGN_RIGHT;
279+
280+ // Count number of channels to configure
281+ uint8_t num_channels = 0 ;
282+ for (int pin_no=0 ; pin_no<3 ; pin_no++){
283+ if (_isset (cs_params->pins [pin_no])){
284+ num_channels++;
285+ }
286+ }
287+
288+ hadc[adc_num].Init .NbrOfConversion = num_channels;
289+ hadc[adc_num].Init .DMAContinuousRequests = DISABLE;
290+ hadc[adc_num].Init .EOCSelection = ADC_EOC_SEQ_CONV; // End of sequence for multi-channel
291+ hadc[adc_num].Init .Overrun = ADC_OVR_DATA_OVERWRITTEN; // Overwrite old data in continuous mode
292+
293+ if (HAL_ADC_Init (&hadc[adc_num]) != HAL_OK){
294+ #ifdef SIMPLEFOC_STM32_DEBUG
295+ SIMPLEFOC_DEBUG (" STM32-CS: ERR: cannot init ADC!" );
296+ #endif
297+ return -1 ;
298+ }
299+
300+ // Configure regular channels
301+ sConfig .SamplingTime = ADC_SAMPLETIME_6CYCLES_5; // Fast sampling for inline sensing
302+ sConfig .SingleDiff = ADC_SINGLE_ENDED;
303+ sConfig .OffsetNumber = ADC_OFFSET_NONE;
304+ sConfig .Offset = 0 ;
305+
306+ uint8_t rank = 1 ;
307+ for (int i=0 ; i<3 ; i++){
308+ // skip if not set
309+ if (!_isset (cs_params->pins [i])) continue ;
310+
311+ sConfig .Rank = rank++;
312+ sConfig .Channel = _getADCChannel (analogInputToPinName (cs_params->pins [i]), hadc[adc_num].Instance );
313+
314+ if (HAL_ADC_ConfigChannel (&hadc[adc_num], &sConfig ) != HAL_OK){
315+ #ifdef SIMPLEFOC_STM32_DEBUG
316+ SIMPLEFOC_DEBUG (" STM32-CS: ERR: cannot init regular channel: " , (int )sConfig .Channel );
317+ #endif
318+ return -1 ;
319+ }
320+ }
321+
322+ cs_params->adc_handle = &hadc[adc_num];
323+
324+ // Calibrate ADC
325+ if (HAL_ADCEx_Calibration_Start (&hadc[adc_num], ADC_SINGLE_ENDED) != HAL_OK){
326+ #ifdef SIMPLEFOC_STM32_DEBUG
327+ SIMPLEFOC_DEBUG (" STM32-CS: WARN: ADC calibration failed" );
328+ #endif
329+ }
330+
331+ // Start continuous conversion
332+ if (HAL_ADC_Start (&hadc[adc_num]) != HAL_OK){
333+ #ifdef SIMPLEFOC_STM32_DEBUG
334+ SIMPLEFOC_DEBUG (" STM32-CS: ERR: cannot start ADC continuous conversion" );
335+ #endif
336+ return -1 ;
337+ }
338+
339+ #ifdef SIMPLEFOC_STM32_DEBUG
340+ SIMPLEFOC_DEBUG (" STM32-CS: ADC continuous conversion on no.channels: " , (int )num_channels);
341+ #endif
342+
343+ return 0 ;
344+ }
345+
186346/* *
187347 * Function to initialize the ADC GPIO pins
188348 *
0 commit comments