Skip to content

Commit b9b9cf3

Browse files
committed
restructuring for f1
1 parent d8fac13 commit b9b9cf3

File tree

2 files changed

+17
-19
lines changed

2 files changed

+17
-19
lines changed

src/current_sense/hardware_specific/stm32/stm32f1/stm32f1_hal.cpp

+12-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
2222

2323
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
2424
*/
25-
hadc.Instance = (ADC_TypeDef *)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC);
25+
hadc.Instance = _findBestADCForPins(3, cs_params->pins);
26+
2627
if(hadc.Instance == ADC1) __HAL_RCC_ADC1_CLK_ENABLE();
2728
#ifdef ADC2 // if defined ADC2
2829
else if(hadc.Instance == ADC2) __HAL_RCC_ADC2_CLK_ENABLE();
@@ -49,7 +50,12 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
4950

5051
/**Configures for the selected ADC injected channel its corresponding rank in the sequencer and its sample time
5152
*/
52-
sConfigInjected.InjectedNbrOfConversion = _isset(cs_params->pins[2]) ? 3 : 2;
53+
sConfigInjected.InjectedNbrOfConversion = 0;
54+
for(int pin_no=0; pin_no<3; pin_no++){
55+
if(_isset(cs_params->pins[pin_no])){
56+
sConfigInjected.InjectedNbrOfConversion++;
57+
}
58+
}
5359
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
5460
sConfigInjected.AutoInjectedConv = DISABLE;
5561
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
@@ -90,16 +96,16 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
9096
}
9197

9298

93-
uint32_t ranks[4]= {ADC_INJECTED_RANK_1, ADC_INJECTED_RANK_2, ADC_INJECTED_RANK_3, ADC_INJECTED_RANK_4};
99+
uint8_t channel_no = 0;
94100
for(int i=0; i<3; i++){
95101
// skip if not set
96102
if (!_isset(cs_params->pins[i])) continue;
97103

98-
sConfigInjected.InjectedRank = ranks[i];
99-
sConfigInjected.InjectedChannel = STM_PIN_CHANNEL(pinmap_function(analogInputToPinName(cs_params->pins[i]), PinMap_ADC));
104+
sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
105+
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[i]), hadc.Instance);
100106
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
101107
#ifdef SIMPLEFOC_STM32_DEBUG
102-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)STM_PIN_CHANNEL(pinmap_function(analogInputToPinName(cs_params->pins[i]), PinMap_ADC)));
108+
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[i]) , hadc.Instance));
103109
#endif
104110
return -1;
105111
}

src/current_sense/hardware_specific/stm32/stm32f1/stm32f1_mcu.cpp

+5-13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "../../../../drivers/hardware_api.h"
66
#include "../../../../drivers/hardware_specific/stm32/stm32_mcu.h"
77
#include "../../../hardware_api.h"
8+
#include "../stm32_adc_utils.h"
89
#include "../stm32_mcu.h"
910
#include "stm32f1_hal.h"
1011
#include "Arduino.h"
@@ -25,17 +26,6 @@ uint8_t use_adc_interrupt = 1;
2526
uint8_t use_adc_interrupt = 0;
2627
#endif
2728

28-
int _adcToIndex(ADC_HandleTypeDef *AdcHandle){
29-
if(AdcHandle->Instance == ADC1) return 0;
30-
#ifdef ADC2 // if ADC2 exists
31-
else if(AdcHandle->Instance == ADC2) return 1;
32-
#endif
33-
#ifdef ADC3 // if ADC3 exists
34-
else if(AdcHandle->Instance == ADC3) return 2;
35-
#endif
36-
return 0;
37-
}
38-
3929
void* _configureADCLowSide(const void* driver_params, const int pinA, const int pinB, const int pinC){
4030

4131
Stm32CurrentSenseParams* cs_params= new Stm32CurrentSenseParams {
@@ -107,16 +97,18 @@ void* _driverSyncLowSide(void* _driver_params, void* _cs_params){
10797

10898
// function reading an ADC value and returning the read voltage
10999
float _readADCVoltageLowSide(const int pin, const void* cs_params){
100+
uint8_t channel_no = 0;
110101
for(int i=0; i < 3; i++){
111102
if( pin == ((Stm32CurrentSenseParams*)cs_params)->pins[i]){ // found in the buffer
112103
if (use_adc_interrupt){
113-
return adc_val[_adcToIndex(((Stm32CurrentSenseParams*)cs_params)->adc_handle)][i] * ((Stm32CurrentSenseParams*)cs_params)->adc_voltage_conv;
104+
return adc_val[_adcToIndex(((Stm32CurrentSenseParams*)cs_params)->adc_handle)][channel_no] * ((Stm32CurrentSenseParams*)cs_params)->adc_voltage_conv;
114105
}else{
115106
// an optimized way to go from i to the channel i=0 -> channel 1, i=1 -> channel 2, i=2 -> channel 3
116-
uint32_t channel = (i == 0) ? ADC_INJECTED_RANK_1 : (i == 1) ? ADC_INJECTED_RANK_2 : ADC_INJECTED_RANK_3;;
107+
uint32_t channel = _getADCInjectedRank(channel_no);
117108
return HAL_ADCEx_InjectedGetValue(((Stm32CurrentSenseParams*)cs_params)->adc_handle, channel) * ((Stm32CurrentSenseParams*)cs_params)->adc_voltage_conv;
118109
}
119110
}
111+
if(_isset(((Stm32CurrentSenseParams*)cs_params)->pins[i])) channel_no++;
120112
}
121113
return 0;
122114
}

0 commit comments

Comments
 (0)