5#include "../../../../communication/SimpleFOCDebug.h"
6#include "../stm32_adc_utils.h"
9ADC_HandleTypeDef hadc[ADC_COUNT] = {0};
11ADC_HandleTypeDef* _get_adc_handles(){
24int _adc_init_regular(ADC_TypeDef* adc_instance)
27 if(adc_instance == ADC1) __HAL_RCC_ADC1_CLK_ENABLE();
29 else if(adc_instance == ADC2) __HAL_RCC_ADC2_CLK_ENABLE();
32 else if(adc_instance == ADC3) __HAL_RCC_ADC3_CLK_ENABLE();
35#ifdef SIMPLEFOC_STM32_DEBUG
41 auto adc_num = _adcToIndex(adc_instance);
42 hadc[adc_num].Instance = adc_instance;
43 hadc[adc_num].Init.ScanConvMode = ADC_SCAN_ENABLE;
44 hadc[adc_num].Init.ContinuousConvMode = ENABLE;
45 hadc[adc_num].Init.DiscontinuousConvMode = DISABLE;
46 hadc[adc_num].Init.ExternalTrigConv = ADC_SOFTWARE_START;
47 hadc[adc_num].Init.DataAlign = ADC_DATAALIGN_RIGHT;
48 hadc[adc_num].Init.NbrOfConversion = 1;
49 HAL_ADC_Init(&hadc[adc_num]);
62int _adc_init(Stm32CurrentSenseParams*
cs_params,
const STM32DriverParams* driver_params)
64 ADC_InjectionConfTypeDef sConfigInjected;
68 auto adc_instance = _findBestADCForInjectedPins(3,
cs_params->pins, hadc);
70 if(adc_instance == NP){
71#ifdef SIMPLEFOC_STM32_DEBUG
77 if( _adc_init_regular(adc_instance) != 0){
81 auto adc_num = _adcToIndex(adc_instance);
82 hadc[adc_num].Instance = adc_instance;
83 hadc[adc_num].Init.ScanConvMode = ADC_SCAN_ENABLE;
84 hadc[adc_num].Init.ContinuousConvMode = DISABLE;
85 hadc[adc_num].Init.DiscontinuousConvMode = DISABLE;
86 hadc[adc_num].Init.ExternalTrigConv = ADC_SOFTWARE_START;
87 hadc[adc_num].Init.DataAlign = ADC_DATAALIGN_RIGHT;
88 hadc[adc_num].Init.NbrOfConversion = 1;
89 HAL_ADC_Init(&hadc[adc_num]);
95 sConfigInjected.InjectedNbrOfConversion = 0;
96 for(
int pin_no=0; pin_no<3; pin_no++){
98 sConfigInjected.InjectedNbrOfConversion++;
101 sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
102 sConfigInjected.AutoInjectedConv = DISABLE;
103 sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
104 sConfigInjected.InjectedOffset = 0;
108 while(driver_params->timers_handle[tim_num] != NP && tim_num < 6){
109 uint32_t trigger_flag = _timerToInjectedTRGO(driver_params->timers_handle[tim_num++]);
110 if(trigger_flag == _TRGO_NOT_AVAILABLE)
continue;
113 if((driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_ENABLE) ||
114 (driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_UPDATE))
121 sConfigInjected.ExternalTrigInjecConv = trigger_flag;
124 cs_params->timer_handle = driver_params->timers_handle[tim_num-1];
130 #ifdef SIMPLEFOC_STM32_DEBUG
131 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot sync any timer to injected channels!");
135 #ifdef SIMPLEFOC_STM32_DEBUG
141 uint8_t channel_no = 0;
142 for(
int i=0; i<3; i++){
146 sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
147 sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance);
148#ifdef SIMPLEFOC_STM32_DEBUG
149 SIMPLEFOC_DEBUG(
"STM32-CS: ADC channel: ", (
int)STM_PIN_CHANNEL(pinmap_function(PinMap_ADC[i].pin, PinMap_ADC)));
151 if (HAL_ADCEx_InjectedConfigChannel(&hadc[adc_num], &sConfigInjected) != HAL_OK){
152 #ifdef SIMPLEFOC_STM32_DEBUG
153 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot init injected channel: ", (
int)_getADCChannel(analogInputToPinName(
cs_params->pins[i]) , hadc[adc_num].Instance));
171int _adc_gpio_init(Stm32CurrentSenseParams*
cs_params,
const int pinA,
const int pinB,
const int pinC)
174 const char* port_names[3] = {
"A",
"B",
"C"};
175 for(
int i=0; i<3; i++){
178 if(pinmap_peripheral(analogInputToPinName(pins[i]), PinMap_ADC) == NP){
179#if defined(SIMPLEFOC_STM32_DEBUG) && !defined(SIMPLEFOC_DISABLE_DEBUG)
186 pinmap_pinout(analogInputToPinName(pins[i]), PinMap_ADC);
195 void ADC1_2_IRQHandler(
void)
197 if (hadc[0].Instance != NP)
198 HAL_ADC_IRQHandler(&hadc[0]);
199 if (hadc[1].Instance != NP)
200 HAL_ADC_IRQHandler(&hadc[1]);
203 void ADC3_IRQHandler(
void)
205 if (hadc[2].Instance != NP)
206 HAL_ADC_IRQHandler(&hadc[2]);
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)
const int const int const int pinC