1#include "../../../hardware_api.h"
5#include "../../../../common/foc_utils.h"
6#include "../../../../drivers/hardware_api.h"
7#include "../../../../drivers/hardware_specific/stm32/stm32_mcu.h"
8#include "../../../hardware_api.h"
9#include "../stm32_mcu.h"
10#include "../stm32_adc_utils.h"
15#define _ADC_VOLTAGE_L4 3.3f
16#define _ADC_RESOLUTION_L4 4096.0f
20uint32_t adc_val[5][4]={0};
22#ifdef SIMPLEFOC_STM32_ADC_INTERRUPT
23#define USE_ADC_INTERRUPT 1
25#define USE_ADC_INTERRUPT 0
29Stm32AdcInterruptConfig adc_interrupt_config[5] = {
30 {0, 0, USE_ADC_INTERRUPT},
31 {0, 0, USE_ADC_INTERRUPT},
32 {0, 0, USE_ADC_INTERRUPT},
33 {0, 0, USE_ADC_INTERRUPT},
34 {0, 0, USE_ADC_INTERRUPT}
39 Stm32CurrentSenseParams*
cs_params=
new Stm32CurrentSenseParams {
41 .adc_voltage_conv = (_ADC_VOLTAGE_L4) / (_ADC_RESOLUTION_L4)
50 STM32DriverParams* driver_params = (STM32DriverParams*)_driver_params;
51 Stm32CurrentSenseParams*
cs_params = (Stm32CurrentSenseParams*)_cs_params;
57 stm32_pause(driver_params);
60 int adc_index = _adcToIndex(
cs_params->adc_handle);
62 bool tim_interrupt = _initTimerInterruptDownsampling(
cs_params, driver_params, adc_interrupt_config[adc_index]);
65 SIMPLEFOC_DEBUG(
"STM32-CS: timer has no repetition counter, ADC interrupt has to be used");
70 LL_TIM_SetTriggerOutput(
cs_params->timer_handle->Instance, LL_TIM_TRGO_UPDATE);
73 HAL_ADCEx_Calibration_Start(
cs_params->adc_handle,ADC_SINGLE_ENDED);
76 if (adc_interrupt_config[adc_index].use_adc_interrupt){
77 if(
cs_params->adc_handle->Instance == ADC1) {
79 HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
80 HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
83 else if (
cs_params->adc_handle->Instance == ADC2) {
85 HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
86 HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
90 else if (
cs_params->adc_handle->Instance == ADC3) {
92 HAL_NVIC_SetPriority(ADC3_IRQn, 0, 0);
93 HAL_NVIC_EnableIRQ(ADC3_IRQn);
97 else if (
cs_params->adc_handle->Instance == ADC4) {
99 HAL_NVIC_SetPriority(ADC4_IRQn, 0, 0);
100 HAL_NVIC_EnableIRQ(ADC4_IRQn);
104 else if (
cs_params->adc_handle->Instance == ADC5) {
106 HAL_NVIC_SetPriority(ADC5_IRQn, 0, 0);
107 HAL_NVIC_EnableIRQ(ADC5_IRQn);
110 HAL_ADCEx_InjectedStart_IT(
cs_params->adc_handle);
112 HAL_ADCEx_InjectedStart(
cs_params->adc_handle);
116 stm32_resume(driver_params);
125 uint8_t adc_index = (uint8_t)_adcToIndex(((Stm32CurrentSenseParams*)
cs_params)->adc_handle);
126 return _readADCInjectedChannelVoltage(pin, (
void*)
cs_params, adc_interrupt_config[adc_index], adc_val[adc_index]);
130 void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *AdcHandle){
131 uint8_t adc_index = (uint8_t)_adcToIndex(AdcHandle);
132 _handleInjectedConvCpltCallback(AdcHandle, adc_interrupt_config[adc_index], adc_val[adc_index]);
#define SIMPLEFOC_DEBUG(msg,...)
void * _driverSyncLowSide(void *driver_params, void *cs_params)
#define SIMPLEFOC_CURRENT_SENSE_INIT_FAILED
void * _configureADCLowSide(const void *driver_params, const int pinA, const int pinB, const int pinC=NOT_SET)
float _readADCVoltageLowSide(const int pinA, const void *cs_params)
const int const int const int pinC