got current sense readings!

This commit is contained in:
2023-11-14 21:03:05 -05:00
parent 0dae513a2c
commit 06cc2f413d
7 changed files with 145 additions and 159 deletions

View File

@@ -5,8 +5,6 @@ ADC_HandleTypeDef hadc2;
DMA_HandleTypeDef hdma_adc1;
DMA_HandleTypeDef hdma_adc2;
uint32_t HAL_RCC_ADC12_CLK_ENABLED = 0;
void MX_ADC1_Init(void)
{
ADC_MultiModeTypeDef multimode = {0};
@@ -21,7 +19,7 @@ void MX_ADC1_Init(void)
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 2;
hadc1.Init.NbrOfConversion = 3;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
@@ -35,18 +33,23 @@ void MX_ADC1_Init(void)
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
SIMPLEFOC_DEBUG("HAL ADC1 multimode configuration fail.");
// sConfig.Channel = ADC_CHANNEL_VOPAMP1;
sConfig.Channel = ADC_CHANNEL_VOPAMP1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_1;
sConfig.Offset = 0x7FF;
sConfig.OffsetSaturation = ENABLE;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
SIMPLEFOC_DEBUG("HAL ADC OPAMP1 init failed!");
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR_ADC1;
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_2;
if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
SIMPLEFOC_DEBUG("HAL ADC Vmotor init failed!");
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR_ADC1;
sConfig.Rank = ADC_REGULAR_RANK_3;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
SIMPLEFOC_DEBUG("HAL ADC temp init failed!");
}
@@ -78,9 +81,8 @@ void MX_ADC2_Init(void)
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_1;
sConfig.Offset = 0x7FF;
sConfig.OffsetSaturation = ENABLE;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
SIMPLEFOC_DEBUG("HAL ADC OPAMP2 init failed!");
@@ -90,17 +92,24 @@ void MX_ADC2_Init(void)
SIMPLEFOC_DEBUG("HAL ADC OPAMP3 init failed!");
}
void ADC_DMA_Init(ADC_HandleTypeDef* adcHandle)
uint32_t HAL_RCC_ADC12_CLK_ENABLED = 0;
void ADC_DMA_Init(void)
{
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
SIMPLEFOC_DEBUG("Error initializing peripheral clock in adc.cpp");
HAL_RCC_ADC12_CLK_ENABLED++;
if(HAL_RCC_ADC12_CLK_ENABLED==1){
if (HAL_RCC_ADC12_CLK_ENABLED == 1)
{
__HAL_RCC_ADC12_CLK_ENABLE();
}
if(adcHandle->Instance==ADC1)
{
/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
@@ -110,16 +119,12 @@ void ADC_DMA_Init(ADC_HandleTypeDef* adcHandle)
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_DeInit(&hdma_adc1);
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
SIMPLEFOC_DEBUG("HAL error enabling DMA1 channel 1.");
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
}
else if(adcHandle->Instance==ADC2)
{
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1);
/* ADC2 DMA Init */
/* ADC2 Init */
hdma_adc2.Instance = DMA1_Channel2;
hdma_adc2.Init.Request = DMA_REQUEST_ADC2;
hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
@@ -129,33 +134,31 @@ void ADC_DMA_Init(ADC_HandleTypeDef* adcHandle)
hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc2.Init.Mode = DMA_CIRCULAR;
hdma_adc2.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_DeInit(&hdma_adc2);
if (HAL_DMA_Init(&hdma_adc2) != HAL_OK)
SIMPLEFOC_DEBUG("HAL error enabling DMA1 channel 2.");
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc2);
}
__HAL_LINKDMA(&hadc2, DMA_Handle, hdma_adc2);
}
// void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
// {
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
// if(adcHandle->Instance==ADC1)
// {
// HAL_RCC_ADC12_CLK_ENABLED--;
// if(HAL_RCC_ADC12_CLK_ENABLED==0){
// __HAL_RCC_ADC12_CLK_DISABLE();
// }
if(adcHandle->Instance==ADC1)
{
HAL_RCC_ADC12_CLK_ENABLED--;
if(HAL_RCC_ADC12_CLK_ENABLED==0){
__HAL_RCC_ADC12_CLK_DISABLE();
}
// HAL_DMA_DeInit(adcHandle->DMA_Handle);
// }
// else if(adcHandle->Instance==ADC2)
// {
// HAL_RCC_ADC12_CLK_ENABLED--;
// if(HAL_RCC_ADC12_CLK_ENABLED==0){
// __HAL_RCC_ADC12_CLK_DISABLE();
// }
HAL_DMA_DeInit(adcHandle->DMA_Handle);
}
else if(adcHandle->Instance==ADC2)
{
HAL_RCC_ADC12_CLK_ENABLED--;
if(HAL_RCC_ADC12_CLK_ENABLED==0){
__HAL_RCC_ADC12_CLK_DISABLE();
}
// HAL_DMA_DeInit(adcHandle->DMA_Handle);
// }
// }
HAL_DMA_DeInit(adcHandle->DMA_Handle);
}
}

View File

@@ -3,6 +3,7 @@
#include "stm32g4xx_hal.h"
#include "stm32g4xx_hal_adc.h"
#include "stm32g4xx_hal_adc_ex.h"
#include "communication/SimpleFOCDebug.h"
extern ADC_HandleTypeDef hadc1;
@@ -12,7 +13,7 @@ extern DMA_HandleTypeDef hdma_adc2;
void MX_ADC1_Init(void);
void MX_ADC2_Init(void);
void ADC_DMA_Init(ADC_HandleTypeDef* adcHandle);
void ADC_DMA_Init(void);
#endif

View File

@@ -4,7 +4,7 @@ void MX_DMA_Init(void)
{
__HAL_RCC_DMAMUX1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
__HAL_RCC_DMA2_CLK_ENABLE();
// __HAL_RCC_DMA2_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

View File

@@ -4,68 +4,56 @@ OPAMP_HandleTypeDef hopamp1;
OPAMP_HandleTypeDef hopamp2;
OPAMP_HandleTypeDef hopamp3;
void initOPAMP(OPAMP_HandleTypeDef *hopamp, OPAMP_TypeDef *opamp)
{
#ifdef USE_OPAMP_PGA
hopamp->Instance = opamp;
hopamp->Init.PowerMode = OPAMP_POWERMODE_NORMALSPEED;
hopamp->Init.Mode = OPAMP_PGA_MODE;
hopamp->Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO1;
hopamp->Init.InternalOutput = ENABLE;
hopamp->Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;
hopamp->Init.PgaConnect = OPAMP_PGA_CONNECT_INVERTINGINPUT_NO;
hopamp->Init.PgaGain = OPAMP_PGA_GAIN_16_OR_MINUS_15; // Adjust this to change the gains of the opamp.
hopamp->Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
#else
hopamp->Instance = opamp;
hopamp->Init.PowerMode = OPAMP_POWERMODE_NORMALSPEED;
hopamp->Init.Mode = OPAMP_FOLLOWER_MODE;
hopamp->Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO1;
hopamp->Init.InternalOutput = ENABLE;
hopamp->Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;
hopamp->Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
#endif
if (HAL_OPAMP_Init(hopamp) != HAL_OK)
SIMPLEFOC_DEBUG("HAL OPAMP Init failed!");
}
void configureOPAMPs(void)
{
initOPAMP(&hopamp1, OPAMP1); // PA3
initOPAMP(&hopamp2, OPAMP2); // PB0
initOPAMP(&hopamp3, OPAMP3); // PA1
hopamp1.Instance = OPAMP1;
hopamp1.Init.PowerMode = OPAMP_POWERMODE_NORMALSPEED;
hopamp1.Init.Mode = OPAMP_FOLLOWER_MODE;
hopamp1.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO1;
hopamp1.Init.InternalOutput = ENABLE;
hopamp1.Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;
hopamp1.Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
if(HAL_OPAMP_Init(&hopamp1) != HAL_OK)
SIMPLEFOC_DEBUG("OPAMP1 init failed.");
hopamp2.Instance = OPAMP2;
hopamp2.Init.PowerMode = OPAMP_POWERMODE_NORMALSPEED;
hopamp2.Init.Mode = OPAMP_FOLLOWER_MODE;
hopamp2.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO2;
hopamp2.Init.InternalOutput = ENABLE;
hopamp2.Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;
hopamp2.Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
if(HAL_OPAMP_Init(&hopamp2) != HAL_OK)
SIMPLEFOC_DEBUG("OPAMP2 init failed.");
hopamp3.Instance = OPAMP2;
hopamp3.Init.PowerMode = OPAMP_POWERMODE_NORMALSPEED;
hopamp3.Init.Mode = OPAMP_FOLLOWER_MODE;
hopamp3.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO1;
hopamp3.Init.InternalOutput = ENABLE;
hopamp3.Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;
hopamp3.Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
if(HAL_OPAMP_Init(&hopamp3) != HAL_OK)
SIMPLEFOC_DEBUG("OPAMP3 init failed.");
}
void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef* opampHandle)
void OPAMP_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(opampHandle->Instance==OPAMP1)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
else if(opampHandle->Instance==OPAMP2)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
else if(opampHandle->Instance==OPAMP3)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef *opampHandle)
{
@@ -83,4 +71,3 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* opampHandle)
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13);
}
}

View File

@@ -12,6 +12,7 @@ extern OPAMP_HandleTypeDef hopamp2;
extern OPAMP_HandleTypeDef hopamp3;
void configureOPAMPs(void);
void OPAMP_GPIO_Init(void);
#endif

View File

@@ -10,7 +10,7 @@ float adcResolution = 4096.0f; // 12 bit ADC
float voltageScale = 3.3f; // full scale voltage range of ADC
float adcSens = adcResolution * voltageScale;
volatile uint16_t adc1Result[2] = {0};
volatile uint16_t adc1Result[3] = {0};
volatile uint16_t adc2Result[2] = {0};
void MX_GPIO_Init(void)
@@ -20,8 +20,9 @@ void MX_GPIO_Init(void)
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_ADC12_CLK_ENABLE();
OPAMP_GPIO_Init();
}
float _readADCVoltageInline(const int pin, const void *cs_params)
@@ -30,6 +31,10 @@ float _readADCVoltageInline(const int pin, const void *cs_params)
uint32_t rawResult;
switch (pin)
{
case PA2:
rawResult = adc1Result[1];
break;
case PA3:
rawResult = adc1Result[0]; // ADC1 CH13 -> Vopamp1 internal output
break;
@@ -38,13 +43,13 @@ float _readADCVoltageInline(const int pin, const void *cs_params)
rawResult = adc2Result[0]; // ADC2 CH16 -> Vopamp2 internal output
break;
case PA1:
rawResult = adc2Result[1]; // ADC2 CH18 -> Vopamp3 internal output
case PA13:
rawResult = adc2Result[2]; // ADC2 CH18 -> Vopamp3 internal output
break;
case PA2:
rawResult = adc1Result[1]; // ADC1 CH16 -> not sure what pin should represent this?
break;
// case PA2:
// rawResult = adc1Result[1]; // ADC1 CH16 -> not sure what pin should represent this?
// break;
default:
return 0.0f;
@@ -65,16 +70,21 @@ void *_configureADCInline(const void *driver_params, const int pinA, const int p
_UNUSED(driver_params);
HAL_Init();
HAL_SYSCFG_VREFBUF_VoltageScalingConfig(SYSCFG_VREFBUF_VOLTAGE_SCALE2);
HAL_SYSCFG_EnableVREFBUF();
HAL_SYSCFG_VREFBUF_HighImpedanceConfig(SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE);
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_ADC2_Init();
configureOPAMPs();
ADC_DMA_Init(&hadc1);
ADC_DMA_Init(&hadc2);
ADC_DMA_Init();
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1Result, 2) != HAL_OK)
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1Result, 3) != HAL_OK)
{
SIMPLEFOC_DEBUG("DMA1 read init failed");
}

View File

@@ -36,8 +36,8 @@ uint8_t updateData = 0;
const uint16_t magicWord = 0xAF0C;
// canbus things
extern uint8_t TxData[8];
extern uint8_t RxData[8];
extern volatile uint8_t TxData[8];
extern volatile uint8_t RxData[8];
// simpleFOC things
#define POLEPAIRS 50
@@ -68,6 +68,8 @@ StepperMotor motor = StepperMotor(POLEPAIRS);
Commander commander = Commander(SERIALPORT);
uint16_t counter = 0;
extern volatile uint16_t adc1Result[3];
extern volatile uint16_t adc2Result[2];
// Prototypes
uint8_t configureFOC(void);
@@ -149,29 +151,11 @@ void loop()
motor.move();
commander.run();
if (counter == 0xFF)
{
PhaseCurrent_s current = currentsense.getPhaseCurrents();
if(counter == 0){
digitalToggle(LED_GOOD);
SERIALPORT.print(current.a);
SERIALPORT.print("\t");
SERIALPORT.print(current.b);
SERIALPORT.print("\t");
SERIALPORT.println(current.c);
// SERIALPORT.print(sensor.getAngle());
// SERIALPORT.print("\t");
// SERIALPORT.print(enc.getAngle());
// SERIALPORT.print("\t");
// SERIALPORT.println(sensor.getABZResolution());
// SERIALPORT.printf("%d\t%d\t%d\n", sensor.getAngle(), sensor.getABZResolution(), enc.getAngle());
counter = 0;
Serial.println(adc1Result[0]);
}
counter++;
#ifdef HAS_MONITOR
motor.monitor();
#endif