7#include "../../../../communication/SimpleFOCDebug.h"
10ADC_HandleTypeDef hadc[ADC_COUNT] = {0};
12ADC_HandleTypeDef* _get_adc_handles(){
24int _adc_init_regular(ADC_TypeDef* adc_instance)
30 if(adc_instance == ADC1) __HAL_RCC_ADC12_CLK_ENABLE();
32 else if(adc_instance == ADC2) __HAL_RCC_ADC12_CLK_ENABLE();
35 else if(adc_instance == ADC3) __HAL_RCC_ADC3_CLK_ENABLE();
38#ifdef SIMPLEFOC_STM32_DEBUG
39 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: Cannot find a common ADC for the pins!");
44 int adc_num = _adcToIndex(adc_instance);
46#ifdef SIMPLEFOC_STM32_DEBUG
50 hadc[adc_num].Instance = adc_instance;
51 hadc[adc_num].Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
52 hadc[adc_num].Init.Resolution = ADC_RESOLUTION_12B;
53 hadc[adc_num].Init.ScanConvMode = ENABLE;
54 hadc[adc_num].Init.ContinuousConvMode = DISABLE;
55 hadc[adc_num].Init.DiscontinuousConvMode = DISABLE;
56 hadc[adc_num].Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
57 hadc[adc_num].Init.ExternalTrigConv = ADC_SOFTWARE_START;
58#if defined(ADC_VER_V5_V90)
60 if(hadc[adc_num].Instance == ADC3){
61 hadc[adc_num].Init.DataAlign = ADC3_DATAALIGN_RIGHT;
65 hadc[adc_num].Init.DMAContinuousRequests = DISABLE;
67 hadc[adc_num].Init.SamplingMode = ADC_SAMPLING_MODE_NORMAL;
69 hadc[adc_num].Init.NbrOfConversion = 1;
70 hadc[adc_num].Init.NbrOfDiscConversion = 0;
71 hadc[adc_num].Init.EOCSelection = ADC_EOC_SINGLE_CONV;
73 hadc[adc_num].Init.LowPowerAutoWait = DISABLE;
76 if ( HAL_ADC_Init(&hadc[adc_num]) != HAL_OK){
77#ifdef SIMPLEFOC_STM32_DEBUG
93int _adc_init(Stm32CurrentSenseParams*
cs_params,
const STM32DriverParams* driver_params)
99 auto adc_instance = _findBestADCForInjectedPins(3,
cs_params->pins, hadc);
100 if(adc_instance == NP){
101#ifdef SIMPLEFOC_STM32_DEBUG
106 if( _adc_init_regular(adc_instance) != 0){
109 int adc_num = _adcToIndex(adc_instance);
113 ADC_InjectionConfTypeDef sConfigInjected;
114 sConfigInjected.InjectedNbrOfConversion = 0;
115 for(
int pin_no=0; pin_no<3; pin_no++){
117 sConfigInjected.InjectedNbrOfConversion++;
121 if(hadc[adc_num].Instance == ADC1 || hadc[adc_num].Instance == ADC2){
123 sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_2CYCLES_5;
127 sConfigInjected.InjectedSamplingTime = ADC3_SAMPLETIME_2CYCLES_5;
129 sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISINGFALLING;
130 sConfigInjected.AutoInjectedConv = DISABLE;
131 sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
132 sConfigInjected.InjectedOffset = 0;
133 sConfigInjected.InjectedSingleDiff = ADC_SINGLE_ENDED;
134 sConfigInjected.InjectedOffsetNumber = ADC_OFFSET_NONE;
135 sConfigInjected.QueueInjectedContext = DISABLE;
136 sConfigInjected.InjecOversamplingMode = DISABLE;
140 for (
size_t i=0; i<6; i++) {
141 TIM_HandleTypeDef *timer_to_check = driver_params->timers_handle[tim_num++];
142 TIM_TypeDef *instance_to_check = timer_to_check->Instance;
144 uint32_t trigger_flag = _timerToInjectedTRGO(timer_to_check);
145 if(trigger_flag == _TRGO_NOT_AVAILABLE)
continue;
148 if((timer_to_check->Instance->CR2 & LL_TIM_TRGO_ENABLE) ||
149 (timer_to_check->Instance->CR2 & LL_TIM_TRGO_UPDATE))
156 sConfigInjected.ExternalTrigInjecConv = trigger_flag;
159 cs_params->timer_handle = timer_to_check;
165 #ifdef SIMPLEFOC_STM32_DEBUG
166 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot sync any timer to injected channels!");
170#ifdef SIMPLEFOC_STM32_DEBUG
175 uint8_t channel_no = 0;
176 for(
int i=0; i<3; i++){
180 sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
181 sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance);
182#ifdef SIMPLEFOC_STM32_DEBUG
183 SIMPLEFOC_DEBUG(
"STM32-CS: ADC channel: ", (
int)STM_PIN_CHANNEL(pinmap_function(PinMap_ADC[i].pin, PinMap_ADC)));
185 if (HAL_ADCEx_InjectedConfigChannel(&hadc[adc_num], &sConfigInjected) != HAL_OK){
186 #ifdef SIMPLEFOC_STM32_DEBUG
187 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot init injected channel: ", (
int)_getADCChannel(analogInputToPinName(
cs_params->pins[i]) , hadc[adc_num].Instance));
207int _adc_gpio_init(Stm32CurrentSenseParams*
cs_params,
const int pinA,
const int pinB,
const int pinC)
210 const char* port_names[3] = {
"A",
"B",
"C"};
211 for(
int i=0; i<3; i++){
214 if(pinmap_peripheral(analogInputToPinName(pins[i]), PinMap_ADC) == NP){
216#if defined(SIMPLEFOC_STM32_DEBUG) && !defined(SIMPLEFOC_DISABLE_DEBUG)
223 pinmap_pinout(analogInputToPinName(pins[i]), PinMap_ADC);
232 void ADC_IRQHandler(
void)
234 if (hadc[0].Instance != NP)
235 HAL_ADC_IRQHandler(&hadc[0]);
236 if (hadc[1].Instance != NP)
237 HAL_ADC_IRQHandler(&hadc[1]);
243 void ADC3_IRQHandler(
void)
245 if (hadc[2].Instance != NP)
246 HAL_ADC_IRQHandler(&hadc[2]);
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)
const int const int const int pinC