Skip to content

Commit a55da2d

Browse files
committed
Implement current sense for STM32 based B-G431B-ESC1
for this board, use InlineCurrentSense with: shunt_resistor = 0.003 gain = -64.0/7.0
1 parent 8a86629 commit a55da2d

File tree

6 files changed

+479
-2
lines changed

6 files changed

+479
-2
lines changed

src/current_sense/hardware_specific/generic_mcu.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ __attribute__((weak)) void _configureADCLowSide(const int pinA,const int pinB,c
2626
if( _isset(pinC) ) pinMode(pinC, INPUT);
2727
}
2828

29-
3029
// sync driver and the adc
3130
__attribute__((weak)) void _driverSyncLowSide(){ }
3231
__attribute__((weak)) void _startADC3PinConversionLowSide(){ }

src/current_sense/hardware_specific/stm32_mcu.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
#include "../hardware_api.h"
33

4-
#if defined(_STM32_DEF_)
4+
#if defined(_STM32_DEF_) and !defined(STM32G4xx)
55

66
#define _ADC_VOLTAGE 3.3f
77
#define _ADC_RESOLUTION 1024.0f
Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,333 @@
1+
#include "../hardware_api.h"
2+
#if defined(STM32G4xx)
3+
4+
#include "stm32g4xx_hal.h"
5+
#include "stm32g4xx_ll_pwr.h"
6+
#include "stm32g4xx_hal_adc.h"
7+
#include "stm32g4_hal.h"
8+
// From STM32 cube IDE
9+
/**
10+
******************************************************************************
11+
* @attention
12+
*
13+
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
14+
* All rights reserved.</center></h2>
15+
*
16+
* This software component is licensed by ST under BSD 3-Clause license,
17+
* the "License"; You may not use this file except in compliance with the
18+
* License. You may obtain a copy of the License at:
19+
* opensource.org/licenses/BSD-3-Clause
20+
*
21+
******************************************************************************
22+
*/
23+
24+
25+
/**
26+
* @brief GPIO Initialization Function
27+
* @param None
28+
* @retval None
29+
*/
30+
void MX_GPIO_Init(void)
31+
{
32+
/* GPIO Ports Clock Enable */
33+
__HAL_RCC_GPIOC_CLK_ENABLE();
34+
__HAL_RCC_GPIOF_CLK_ENABLE();
35+
__HAL_RCC_GPIOA_CLK_ENABLE();
36+
__HAL_RCC_GPIOB_CLK_ENABLE();
37+
38+
__HAL_RCC_ADC12_CLK_ENABLE();
39+
}
40+
41+
/**
42+
* Enable DMA controller clock
43+
*/
44+
void MX_DMA_Init(void)
45+
{
46+
/* DMA controller clock enable */
47+
__HAL_RCC_DMAMUX1_CLK_ENABLE();
48+
__HAL_RCC_DMA1_CLK_ENABLE();
49+
__HAL_RCC_DMA2_CLK_ENABLE();
50+
51+
/* DMA interrupt init */
52+
/* DMA1_Channel1_IRQn interrupt configuration */
53+
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
54+
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
55+
/* DMA1_Channel2_IRQn interrupt configuration */
56+
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
57+
HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
58+
59+
// Enable external clock for ADC
60+
RCC_PeriphCLKInitTypeDef PeriphClkInit;
61+
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
62+
PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_PLL;
63+
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
64+
}
65+
66+
67+
/**
68+
* @brief ADC1 Initialization Function
69+
* @param None
70+
* @retval None
71+
*/
72+
void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
73+
{
74+
/* USER CODE BEGIN ADC1_Init 0 */
75+
76+
/* USER CODE END ADC1_Init 0 */
77+
78+
ADC_MultiModeTypeDef multimode = {0};
79+
ADC_ChannelConfTypeDef sConfig = {0};
80+
81+
/* USER CODE BEGIN ADC1_Init 1 */
82+
83+
/* USER CODE END ADC1_Init 1 */
84+
/** Common config
85+
*/
86+
hadc1->Instance = ADC1;
87+
hadc1->Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV16;
88+
hadc1->Init.Resolution = ADC_RESOLUTION_12B;
89+
hadc1->Init.DataAlign = ADC_DATAALIGN_RIGHT;
90+
hadc1->Init.GainCompensation = 0;
91+
hadc1->Init.ScanConvMode = ADC_SCAN_ENABLE;
92+
hadc1->Init.EOCSelection = ADC_EOC_SINGLE_CONV;
93+
hadc1->Init.LowPowerAutoWait = DISABLE;
94+
hadc1->Init.ContinuousConvMode = DISABLE;
95+
hadc1->Init.NbrOfConversion = 2;
96+
hadc1->Init.DiscontinuousConvMode = DISABLE;
97+
hadc1->Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
98+
hadc1->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
99+
hadc1->Init.DMAContinuousRequests = ENABLE;
100+
hadc1->Init.Overrun = ADC_OVR_DATA_PRESERVED;
101+
102+
if (HAL_ADC_Init(hadc1) != HAL_OK)
103+
{
104+
Error_Handler();
105+
}
106+
107+
/** Configure the ADC multi-mode
108+
*/
109+
multimode.Mode = ADC_MODE_INDEPENDENT;
110+
if (HAL_ADCEx_MultiModeConfigChannel(hadc1, &multimode) != HAL_OK)
111+
{
112+
Error_Handler();
113+
}
114+
/** Configure Regular Channel
115+
*/
116+
sConfig.Channel = ADC_CHANNEL_12; // ADC1_IN12 = PB1 = OP3_OUT
117+
sConfig.Rank = ADC_REGULAR_RANK_1;
118+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
119+
sConfig.SingleDiff = ADC_SINGLE_ENDED;
120+
sConfig.OffsetNumber = ADC_OFFSET_NONE;
121+
sConfig.Offset = 0;
122+
if (HAL_ADC_ConfigChannel(hadc1, &sConfig) != HAL_OK)
123+
{
124+
Error_Handler();
125+
}
126+
/** Configure Regular Channel
127+
*/
128+
sConfig.Channel = ADC_CHANNEL_3; // ADC1_IN3 = PA2 = OP1_OUT
129+
sConfig.Rank = ADC_REGULAR_RANK_2;
130+
if (HAL_ADC_ConfigChannel(hadc1, &sConfig) != HAL_OK)
131+
{
132+
Error_Handler();
133+
}
134+
/* USER CODE BEGIN ADC1_Init 2 */
135+
136+
/* USER CODE END ADC1_Init 2 */
137+
138+
}
139+
140+
/**
141+
* @brief ADC2 Initialization Function
142+
* @param None
143+
* @retval None
144+
*/
145+
void MX_ADC2_Init(ADC_HandleTypeDef* hadc2)
146+
{
147+
/* USER CODE BEGIN ADC2_Init 0 */
148+
149+
/* USER CODE END ADC2_Init 0 */
150+
151+
ADC_ChannelConfTypeDef sConfig = {0};
152+
153+
/* USER CODE BEGIN ADC2_Init 1 */
154+
155+
/* USER CODE END ADC2_Init 1 */
156+
/** Common config
157+
*/
158+
hadc2->Instance = ADC2;
159+
hadc2->Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV16;
160+
hadc2->Init.Resolution = ADC_RESOLUTION_12B;
161+
hadc2->Init.DataAlign = ADC_DATAALIGN_RIGHT;
162+
hadc2->Init.GainCompensation = 0;
163+
hadc2->Init.ScanConvMode = ADC_SCAN_ENABLE;
164+
hadc2->Init.EOCSelection = ADC_EOC_SINGLE_CONV;
165+
hadc2->Init.LowPowerAutoWait = DISABLE;
166+
hadc2->Init.ContinuousConvMode = DISABLE;
167+
hadc2->Init.NbrOfConversion = 1;
168+
hadc2->Init.DiscontinuousConvMode = DISABLE;
169+
hadc2->Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
170+
hadc2->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
171+
hadc2->Init.DMAContinuousRequests = ENABLE;
172+
hadc2->Init.Overrun = ADC_OVR_DATA_PRESERVED;
173+
174+
if (HAL_ADC_Init(hadc2) != HAL_OK)
175+
{
176+
Error_Handler();
177+
}
178+
/** Configure Regular Channel
179+
*/
180+
sConfig.Channel = ADC_CHANNEL_3; // ADC2_IN3 = PA6
181+
sConfig.Rank = ADC_REGULAR_RANK_1;
182+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
183+
sConfig.SingleDiff = ADC_SINGLE_ENDED;
184+
sConfig.OffsetNumber = ADC_OFFSET_NONE;
185+
sConfig.Offset = 0;
186+
if (HAL_ADC_ConfigChannel(hadc2, &sConfig) != HAL_OK)
187+
{
188+
Error_Handler();
189+
}
190+
/* USER CODE BEGIN ADC2_Init 2 */
191+
192+
/* USER CODE END ADC2_Init 2 */
193+
194+
}
195+
196+
/**
197+
* @brief OPAMP MSP Initialization
198+
* This function configures the hardware resources used in this example
199+
* @param hopamp-> OPAMP handle pointer
200+
* @retval None
201+
*/
202+
void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef* hopamp)
203+
{
204+
GPIO_InitTypeDef GPIO_InitStruct = {0};
205+
if(hopamp->Instance==OPAMP1)
206+
{
207+
/* USER CODE BEGIN OPAMP1_MspInit 0 */
208+
209+
/* USER CODE END OPAMP1_MspInit 0 */
210+
211+
__HAL_RCC_GPIOA_CLK_ENABLE();
212+
/**OPAMP1 GPIO Configuration
213+
PA1 ------> OPAMP1_VINP
214+
PA2 ------> OPAMP1_VOUT
215+
PA3 ------> OPAMP1_VINM
216+
*/
217+
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
218+
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
219+
GPIO_InitStruct.Pull = GPIO_NOPULL;
220+
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
221+
222+
/* USER CODE BEGIN OPAMP1_MspInit 1 */
223+
224+
/* USER CODE END OPAMP1_MspInit 1 */
225+
}
226+
else if(hopamp->Instance==OPAMP2)
227+
{
228+
/* USER CODE BEGIN OPAMP2_MspInit 0 */
229+
230+
/* USER CODE END OPAMP2_MspInit 0 */
231+
232+
__HAL_RCC_GPIOA_CLK_ENABLE();
233+
/**OPAMP2 GPIO Configuration
234+
PA5 ------> OPAMP2_VINM
235+
PA6 ------> OPAMP2_VOUT
236+
PA7 ------> OPAMP2_VINP
237+
*/
238+
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
239+
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
240+
GPIO_InitStruct.Pull = GPIO_NOPULL;
241+
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
242+
243+
/* USER CODE BEGIN OPAMP2_MspInit 1 */
244+
245+
/* USER CODE END OPAMP2_MspInit 1 */
246+
}
247+
else if(hopamp->Instance==OPAMP3)
248+
{
249+
/* USER CODE BEGIN OPAMP3_MspInit 0 */
250+
251+
/* USER CODE END OPAMP3_MspInit 0 */
252+
253+
__HAL_RCC_GPIOB_CLK_ENABLE();
254+
/**OPAMP3 GPIO Configuration
255+
PB0 ------> OPAMP3_VINP
256+
PB1 ------> OPAMP3_VOUT
257+
PB2 ------> OPAMP3_VINM
258+
*/
259+
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
260+
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
261+
GPIO_InitStruct.Pull = GPIO_NOPULL;
262+
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
263+
264+
/* USER CODE BEGIN OPAMP3_MspInit 1 */
265+
266+
/* USER CODE END OPAMP3_MspInit 1 */
267+
}
268+
269+
}
270+
271+
/**
272+
* @brief OPAMP MSP De-Initialization
273+
* This function freeze the hardware resources used in this example
274+
* @param hopamp-> OPAMP handle pointer
275+
* @retval None
276+
*/
277+
void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp)
278+
{
279+
if(hopamp->Instance==OPAMP1)
280+
{
281+
/* USER CODE BEGIN OPAMP1_MspDeInit 0 */
282+
283+
/* USER CODE END OPAMP1_MspDeInit 0 */
284+
285+
/**OPAMP1 GPIO Configuration
286+
PA1 ------> OPAMP1_VINP
287+
PA2 ------> OPAMP1_VOUT
288+
PA3 ------> OPAMP1_VINM
289+
*/
290+
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
291+
292+
/* USER CODE BEGIN OPAMP1_MspDeInit 1 */
293+
294+
/* USER CODE END OPAMP1_MspDeInit 1 */
295+
}
296+
else if(hopamp->Instance==OPAMP2)
297+
{
298+
/* USER CODE BEGIN OPAMP2_MspDeInit 0 */
299+
300+
/* USER CODE END OPAMP2_MspDeInit 0 */
301+
302+
/**OPAMP2 GPIO Configuration
303+
PA5 ------> OPAMP2_VINM
304+
PA6 ------> OPAMP2_VOUT
305+
PA7 ------> OPAMP2_VINP
306+
*/
307+
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
308+
309+
/* USER CODE BEGIN OPAMP2_MspDeInit 1 */
310+
311+
/* USER CODE END OPAMP2_MspDeInit 1 */
312+
}
313+
else if(hopamp->Instance==OPAMP3)
314+
{
315+
/* USER CODE BEGIN OPAMP3_MspDeInit 0 */
316+
317+
/* USER CODE END OPAMP3_MspDeInit 0 */
318+
319+
/**OPAMP3 GPIO Configuration
320+
PB0 ------> OPAMP3_VINP
321+
PB1 ------> OPAMP3_VOUT
322+
PB2 ------> OPAMP3_VINM
323+
*/
324+
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
325+
326+
/* USER CODE BEGIN OPAMP3_MspDeInit 1 */
327+
328+
/* USER CODE END OPAMP3_MspDeInit 1 */
329+
}
330+
331+
}
332+
333+
#endif
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef stm32g4_hal
2+
#define stm32g4_hal
3+
4+
#if defined(STM32G4xx)
5+
void MX_GPIO_Init(void);
6+
void MX_DMA_Init(void);
7+
void MX_ADC1_Init(ADC_HandleTypeDef* hadc1);
8+
void MX_ADC2_Init(ADC_HandleTypeDef* hadc2);
9+
void MX_OPAMP1_Init(OPAMP_HandleTypeDef* hopamp);
10+
void MX_OPAMP2_Init(OPAMP_HandleTypeDef* hopamp);
11+
void MX_OPAMP3_Init(OPAMP_HandleTypeDef* hopamp);
12+
#endif
13+
14+
#endif

0 commit comments

Comments
 (0)