7#include "../../../../communication/SimpleFOCDebug.h"
10ADC_HandleTypeDef hadc[ADC_COUNT] = {0};
12ADC_HandleTypeDef* _get_adc_handles(){
25int _adc_init_regular(ADC_TypeDef* adc_instance)
28 if(adc_instance == ADC1) __HAL_RCC_ADC1_CLK_ENABLE();
30 else if(adc_instance == ADC2) __HAL_RCC_ADC2_CLK_ENABLE();
33 else if(adc_instance == ADC3) __HAL_RCC_ADC3_CLK_ENABLE();
36#ifdef SIMPLEFOC_STM32_DEBUG
42 int adc_num = _adcToIndex(adc_instance);
44#ifdef SIMPLEFOC_STM32_DEBUG
48 hadc[adc_num].Instance = adc_instance;
49 hadc[adc_num].Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
50 hadc[adc_num].Init.Resolution = ADC_RESOLUTION_12B;
51 hadc[adc_num].Init.ScanConvMode = ENABLE;
52 hadc[adc_num].Init.ContinuousConvMode = DISABLE;
53 hadc[adc_num].Init.DiscontinuousConvMode = DISABLE;
54 hadc[adc_num].Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
55 hadc[adc_num].Init.ExternalTrigConv = ADC_SOFTWARE_START;
56 hadc[adc_num].Init.DataAlign = ADC_DATAALIGN_RIGHT;
57 hadc[adc_num].Init.NbrOfConversion = 1;
58 hadc[adc_num].Init.DMAContinuousRequests = DISABLE;
59 hadc[adc_num].Init.EOCSelection = ADC_EOC_SINGLE_CONV;
60 if ( HAL_ADC_Init(&hadc[adc_num]) != HAL_OK){
61#ifdef SIMPLEFOC_STM32_DEBUG
77int _adc_init(Stm32CurrentSenseParams*
cs_params,
const STM32DriverParams* driver_params)
82 auto adc_instance = _findBestADCForInjectedPins(3,
cs_params->pins, hadc);
83 if(adc_instance == NP){
84#ifdef SIMPLEFOC_STM32_DEBUG
89 if( _adc_init_regular(adc_instance) != 0){
92 int adc_num = _adcToIndex(adc_instance);
94#ifdef SIMPLEFOC_STM32_DEBUG
99 ADC_InjectionConfTypeDef sConfigInjected;
103 sConfigInjected.InjectedNbrOfConversion = 0;
104 for(
int pin_no=0; pin_no<3; pin_no++){
106 sConfigInjected.InjectedNbrOfConversion++;
109 sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_3CYCLES;
110 sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONVEDGE_RISINGFALLING;
111 sConfigInjected.AutoInjectedConv = DISABLE;
112 sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
113 sConfigInjected.InjectedOffset = 0;
117 for (
size_t i=0; i<6; i++) {
118 TIM_HandleTypeDef *timer_to_check = driver_params->timers_handle[tim_num++];
119 TIM_TypeDef *instance_to_check = timer_to_check->Instance;
121 uint32_t trigger_flag = _timerToInjectedTRGO(timer_to_check);
122 if(trigger_flag == _TRGO_NOT_AVAILABLE)
continue;
125 if((timer_to_check->Instance->CR2 & LL_TIM_TRGO_ENABLE) ||
126 (timer_to_check->Instance->CR2 & LL_TIM_TRGO_UPDATE))
133 sConfigInjected.ExternalTrigInjecConv = trigger_flag;
136 cs_params->timer_handle = timer_to_check;
137 if (!IS_TIM_REPETITION_COUNTER_INSTANCE(instance_to_check)) {
140 __HAL_RCC_DAC_CLK_ENABLE();
147 #ifdef SIMPLEFOC_STM32_DEBUG
148 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot sync any timer to injected channels!");
152#ifdef SIMPLEFOC_STM32_DEBUG
157 uint8_t channel_no = 0;
158 for(
int i=0; i<3; i++){
162 sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
163 sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance);
164#ifdef SIMPLEFOC_STM32_DEBUG
165 SIMPLEFOC_DEBUG(
"STM32-CS: ADC channel: ", (
int)STM_PIN_CHANNEL(pinmap_function(PinMap_ADC[i].pin, PinMap_ADC)));
167 if (HAL_ADCEx_InjectedConfigChannel(&hadc[adc_num], &sConfigInjected) != HAL_OK){
168 #ifdef SIMPLEFOC_STM32_DEBUG
169 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot init injected channel: ", (
int)_getADCChannel(analogInputToPinName(
cs_params->pins[i]) , hadc[adc_num].Instance));
189int _adc_gpio_init(Stm32CurrentSenseParams*
cs_params,
const int pinA,
const int pinB,
const int pinC)
192 const char* port_names[3] = {
"A",
"B",
"C"};
193 for(
int i=0; i<3; i++){
196 if(pinmap_peripheral(analogInputToPinName(pins[i]), PinMap_ADC) == NP){
198#if defined(SIMPLEFOC_STM32_DEBUG) && !defined(SIMPLEFOC_DISABLE_DEBUG)
205 pinmap_pinout(analogInputToPinName(pins[i]), PinMap_ADC);
213 void ADC_IRQHandler(
void)
215 for(
int adc_num=0; adc_num<ADC_COUNT; adc_num++){
216 if(hadc[adc_num].Instance == NP)
continue;
217 HAL_ADC_IRQHandler(&hadc[adc_num]);
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)
const int const int const int pinC