7#include "../../../../communication/SimpleFOCDebug.h"
10ADC_HandleTypeDef hadc[ADC_COUNT] = {0};
12ADC_HandleTypeDef* _get_adc_handles(){
24int _adc_init_regular(ADC_TypeDef* adc_instance){
25 ADC_InjectionConfTypeDef sConfigInjected;
29 if(adc_instance == ADC1) __HAL_RCC_ADC1_CLK_ENABLE();
31 else if(adc_instance == ADC2) __HAL_RCC_ADC2_CLK_ENABLE();
34 else if(adc_instance == ADC3) __HAL_RCC_ADC3_CLK_ENABLE();
37#ifdef SIMPLEFOC_STM32_DEBUG
43 int adc_num = _adcToIndex(adc_instance);
45#ifdef SIMPLEFOC_STM32_DEBUG
49 hadc[adc_num].Instance = adc_instance;
51 hadc[adc_num].Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
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 hadc[adc_num].Init.DataAlign = ADC_DATAALIGN_RIGHT;
59 hadc[adc_num].Init.NbrOfConversion = 1;
60 hadc[adc_num].Init.DMAContinuousRequests = DISABLE;
61 hadc[adc_num].Init.EOCSelection = ADC_EOC_SINGLE_CONV;
62 if ( HAL_ADC_Init(&hadc[adc_num]) != HAL_OK){
63#ifdef SIMPLEFOC_STM32_DEBUG
80int _adc_init(Stm32CurrentSenseParams*
cs_params,
const STM32DriverParams* driver_params)
82 ADC_InjectionConfTypeDef sConfigInjected;
86 auto adc_instance = _findBestADCForInjectedPins(3,
cs_params->pins, hadc);
87 if(adc_instance == NP){
88#ifdef SIMPLEFOC_STM32_DEBUG
93 if( _adc_init_regular(adc_instance) != 0){
96 auto adc_num = _adcToIndex(adc_instance);
100 sConfigInjected.InjectedNbrOfConversion = 0;
101 for(
int pin_no=0; pin_no<3; pin_no++){
103 sConfigInjected.InjectedNbrOfConversion++;
106 sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_3CYCLES;
107 sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONVEDGE_RISING;
108 sConfigInjected.AutoInjectedConv = DISABLE;
109 sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
110 sConfigInjected.InjectedOffset = 0;
114 while(driver_params->timers_handle[tim_num] != NP && tim_num < 6){
115 uint32_t trigger_flag = _timerToInjectedTRGO(driver_params->timers_handle[tim_num++]);
116 if(trigger_flag == _TRGO_NOT_AVAILABLE)
continue;
119 if((driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_ENABLE) ||
120 (driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_UPDATE))
127 sConfigInjected.ExternalTrigInjecConv = trigger_flag;
130 cs_params->timer_handle = driver_params->timers_handle[tim_num-1];
136 #ifdef SIMPLEFOC_STM32_DEBUG
137 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot sync any timer to injected channels!");
141#ifdef SIMPLEFOC_STM32_DEBUG
146 uint8_t channel_no = 0;
147 for(
int i=0; i<3; i++){
151 sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
152 sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance);
153#ifdef SIMPLEFOC_STM32_DEBUG
154 SIMPLEFOC_DEBUG(
"STM32-CS: ADC channel: ", (
int)sConfigInjected.InjectedChannel);
156 if (HAL_ADCEx_InjectedConfigChannel(&hadc[adc_num], &sConfigInjected) != HAL_OK){
157 #ifdef SIMPLEFOC_STM32_DEBUG
158 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot init injected channel: ", (
int)sConfigInjected.InjectedChannel);
176int _adc_gpio_init(Stm32CurrentSenseParams*
cs_params,
const int pinA,
const int pinB,
const int pinC)
179 for(
int i=0; i<3; i++){
182 if(pinmap_peripheral(analogInputToPinName(pins[i]), PinMap_ADC) == NP){
183#if defined(SIMPLEFOC_STM32_DEBUG) && !defined(SIMPLEFOC_DISABLE_DEBUG)
190 pinmap_pinout(analogInputToPinName(pins[i]), PinMap_ADC);
198 void ADC_IRQHandler(
void)
200 for(
int adc_num=0; adc_num<ADC_COUNT; adc_num++){
201 if(hadc[adc_num].Instance == NP)
continue;
202 HAL_ADC_IRQHandler(&hadc[adc_num]);
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)
const int const int const int pinC