Skip to content

Commit 5e04a52

Browse files
Merge pull request #487 from Moddingear/dev
g431-esc: use internal ADC channels, also fix some typos
2 parents c4e8470 + 8593db4 commit 5e04a52

File tree

5 files changed

+107
-26
lines changed

5 files changed

+107
-26
lines changed

src/common/base_classes/FOCMotor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#define _MON_ANGLE 0b0000001 // monitor angle value
2323

2424
/**
25-
* Motiron control type
25+
* Motion control type
2626
*/
2727
enum MotionControlType : uint8_t {
2828
torque = 0x00, //!< Torque control

src/communication/Commander.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
enum VerboseMode : uint8_t {
1616
nothing = 0x00, // display nothing - good for monitoring
1717
on_request = 0x01, // display only on user request
18-
user_friendly = 0x02, // display textual messages to the user
18+
user_friendly = 0x02, // display textual messages to the user
1919
machine_readable = 0x03 // display machine readable commands, matching commands to set each settings
2020
};
2121

@@ -86,7 +86,7 @@ class Commander
8686
void run(char* user_input);
8787

8888
/**
89-
* Function adding a callback to the coomander withe the command id
89+
* Function adding a callback to the commander with the command id
9090
* @param id - char command letter
9191
* @param onCommand - function pointer void function(char*)
9292
* @param label - string label to be displayed when scan command sent

src/current_sense/hardware_specific/stm32/b_g431/b_g431_hal.cpp

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
9595
hadc1->Init.EOCSelection = ADC_EOC_SINGLE_CONV;
9696
hadc1->Init.LowPowerAutoWait = DISABLE;
9797
hadc1->Init.ContinuousConvMode = DISABLE;
98+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
99+
hadc1->Init.NbrOfConversion = 4;
100+
#else
98101
hadc1->Init.NbrOfConversion = 5;
102+
#endif
99103
hadc1->Init.DiscontinuousConvMode = DISABLE;
100104
hadc1->Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
101105
hadc1->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
@@ -114,9 +118,10 @@ void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
114118
{
115119
SIMPLEFOC_DEBUG("HAL_ADCEx_MultiModeConfigChannel failed!");
116120
}
121+
#ifndef OPAMP_USE_INTERNAL_CHANNEL
117122
/** Configure Regular Channel
118123
*/
119-
sConfig.Channel = ADC_CHANNEL_12; // ADC1_IN12 = PB1 = OP3_OUT
124+
sConfig.Channel = ADC_CHANNEL_12; // ADC1_IN12 = PB1 = OP3_OUT or ADC2_IN18 for internal channel
120125
sConfig.Rank = ADC_REGULAR_RANK_1;
121126
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
122127
sConfig.SingleDiff = ADC_SINGLE_ENDED;
@@ -126,10 +131,20 @@ void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
126131
{
127132
SIMPLEFOC_DEBUG("HAL_ADC_ConfigChannel failed!");
128133
}
134+
#endif
129135
/** Configure Regular Channel
130136
*/
131-
sConfig.Channel = ADC_CHANNEL_3; // ADC1_IN3 = PA2 = OP1_OUT
137+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
138+
sConfig.Channel = ADC_CHANNEL_13; // ADC1_IN3 = PA2 = OP1_OUT or ADC1_IN13 for internal channel
139+
sConfig.Rank = ADC_REGULAR_RANK_1;
140+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
141+
sConfig.SingleDiff = ADC_SINGLE_ENDED;
142+
sConfig.OffsetNumber = ADC_OFFSET_NONE;
143+
sConfig.Offset = 0;
144+
#else
145+
sConfig.Channel = ADC_CHANNEL_3; // ADC1_IN3 = PA2 = OP1_OUT or ADC1_IN13 for internal channel
132146
sConfig.Rank = ADC_REGULAR_RANK_2;
147+
#endif
133148
if (HAL_ADC_ConfigChannel(hadc1, &sConfig) != HAL_OK)
134149
{
135150
SIMPLEFOC_DEBUG("HAL_ADC_ConfigChannel failed!");
@@ -140,7 +155,11 @@ void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
140155
/* Configure Regular Channel (PB12, Potentiometer)
141156
*/
142157
sConfig.Channel = ADC_CHANNEL_11;
158+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
159+
sConfig.Rank = ADC_REGULAR_RANK_2;
160+
#else
143161
sConfig.Rank = ADC_REGULAR_RANK_3;
162+
#endif
144163
sConfig.SamplingTime = ADC_SAMPLETIME_47CYCLES_5;
145164
sConfig.SingleDiff = ADC_SINGLE_ENDED;
146165
sConfig.OffsetNumber = ADC_OFFSET_NONE;
@@ -153,7 +172,11 @@ void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
153172
/** Configure Regular Channel (PB14, Temperature)
154173
*/
155174
sConfig.Channel = ADC_CHANNEL_5;
175+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
176+
sConfig.Rank = ADC_REGULAR_RANK_3;
177+
#else
156178
sConfig.Rank = ADC_REGULAR_RANK_4;
179+
#endif
157180
sConfig.SamplingTime = ADC_SAMPLETIME_47CYCLES_5;
158181
sConfig.SingleDiff = ADC_SINGLE_ENDED;
159182
sConfig.OffsetNumber = ADC_OFFSET_NONE;
@@ -163,10 +186,14 @@ void MX_ADC1_Init(ADC_HandleTypeDef* hadc1)
163186
SIMPLEFOC_DEBUG("HAL_ADC_ConfigChannel failed!");
164187
}
165188

166-
/** Configure Regular Channel (PB14, Temperature)
189+
/** Configure Regular Channel (PA0, VBUS)
167190
*/
168191
sConfig.Channel = ADC_CHANNEL_1;
192+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
193+
sConfig.Rank = ADC_REGULAR_RANK_4;
194+
#else
169195
sConfig.Rank = ADC_REGULAR_RANK_5;
196+
#endif
170197
sConfig.SamplingTime = ADC_SAMPLETIME_47CYCLES_5;
171198
sConfig.SingleDiff = ADC_SINGLE_ENDED;
172199
sConfig.OffsetNumber = ADC_OFFSET_NONE;
@@ -208,7 +235,11 @@ void MX_ADC2_Init(ADC_HandleTypeDef* hadc2)
208235
hadc2->Init.EOCSelection = ADC_EOC_SINGLE_CONV;
209236
hadc2->Init.LowPowerAutoWait = DISABLE;
210237
hadc2->Init.ContinuousConvMode = DISABLE;
238+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
239+
hadc2->Init.NbrOfConversion = 2;
240+
#else
211241
hadc2->Init.NbrOfConversion = 1;
242+
#endif
212243
hadc2->Init.DiscontinuousConvMode = DISABLE;
213244
hadc2->Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
214245
hadc2->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
@@ -221,7 +252,11 @@ void MX_ADC2_Init(ADC_HandleTypeDef* hadc2)
221252
}
222253
/** Configure Regular Channel
223254
*/
224-
sConfig.Channel = ADC_CHANNEL_3; // ADC2_IN3 = PA6
255+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
256+
sConfig.Channel = ADC_CHANNEL_16; // ADC2_IN3 = PA6 = OP2_OUT or ADC2_IN16 for internal channel
257+
#else
258+
sConfig.Channel = ADC_CHANNEL_3; // ADC2_IN3 = PA6 = OP2_OUT or ADC2_IN16 for internal channel
259+
#endif
225260
sConfig.Rank = ADC_REGULAR_RANK_1;
226261
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
227262
sConfig.SingleDiff = ADC_SINGLE_ENDED;
@@ -231,6 +266,20 @@ void MX_ADC2_Init(ADC_HandleTypeDef* hadc2)
231266
{
232267
SIMPLEFOC_DEBUG("HAL_ADC_ConfigChannel failed!");
233268
}
269+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
270+
/** Configure Regular Channel
271+
*/
272+
sConfig.Channel = ADC_CHANNEL_18; // ADC1_IN12 = PB1 = OP3_OUT or ADC2_IN18 for internal channel
273+
sConfig.Rank = ADC_REGULAR_RANK_2;
274+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
275+
sConfig.SingleDiff = ADC_SINGLE_ENDED;
276+
sConfig.OffsetNumber = ADC_OFFSET_NONE;
277+
sConfig.Offset = 0;
278+
if (HAL_ADC_ConfigChannel(hadc2, &sConfig) != HAL_OK)
279+
{
280+
SIMPLEFOC_DEBUG("HAL_ADC_ConfigChannel failed!");
281+
}
282+
#endif
234283
/* USER CODE BEGIN ADC2_Init 2 */
235284

236285
/* USER CODE END ADC2_Init 2 */
@@ -331,7 +380,7 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp)
331380
PA2 ------> OPAMP1_VOUT
332381
PA3 ------> OPAMP1_VINM
333382
*/
334-
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
383+
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|(GPIO_PIN_2 * OPAMP_USE_INTERNAL_CHANNEL)|GPIO_PIN_3);
335384

336385
/* USER CODE BEGIN OPAMP1_MspDeInit 1 */
337386

@@ -348,7 +397,7 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp)
348397
PA6 ------> OPAMP2_VOUT
349398
PA7 ------> OPAMP2_VINP
350399
*/
351-
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
400+
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|(GPIO_PIN_6 * OPAMP_USE_INTERNAL_CHANNEL)|GPIO_PIN_7);
352401

353402
/* USER CODE BEGIN OPAMP2_MspDeInit 1 */
354403

@@ -365,7 +414,7 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp)
365414
PB1 ------> OPAMP3_VOUT
366415
PB2 ------> OPAMP3_VINM
367416
*/
368-
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
417+
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|(GPIO_PIN_1 * OPAMP_USE_INTERNAL_CHANNEL)|GPIO_PIN_2);
369418

370419
/* USER CODE BEGIN OPAMP3_MspDeInit 1 */
371420

src/current_sense/hardware_specific/stm32/b_g431/b_g431_hal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ void MX_ADC2_Init(ADC_HandleTypeDef* hadc2);
1313
void MX_OPAMP1_Init(OPAMP_HandleTypeDef* hopamp);
1414
void MX_OPAMP2_Init(OPAMP_HandleTypeDef* hopamp);
1515
void MX_OPAMP3_Init(OPAMP_HandleTypeDef* hopamp);
16+
17+
#ifndef OPAMP_USE_INTERNAL_CHANNEL
18+
#define OPAMP_USE_INTERNAL_CHANNEL 1
19+
#endif
1620
#endif
1721

1822
#endif

src/current_sense/hardware_specific/stm32/b_g431/b_g431_mcu.cpp

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@
1111

1212
#define _ADC_VOLTAGE 3.3f
1313
#define _ADC_RESOLUTION 4096.0f
14+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
15+
#define ADC_BUF_LEN_1 4
16+
#define ADC_BUF_LEN_2 2
17+
#else
1418
#define ADC_BUF_LEN_1 5
1519
#define ADC_BUF_LEN_2 1
20+
#endif
1621

1722
static ADC_HandleTypeDef hadc1;
1823
static ADC_HandleTypeDef hadc2;
@@ -39,23 +44,46 @@ Stm32AdcInterruptConfig adc_interrupt_config[5] = {
3944
// function reading an ADC value and returning the read voltage
4045
// As DMA is being used just return the DMA result
4146
float _readADCVoltageLowSide(const int pin, const void* cs_params){
42-
uint32_t raw_adc = 0;
43-
if(pin == PA2) // = ADC1_IN3 = phase U (OP1_OUT) on B-G431B-ESC1
44-
raw_adc = adcBuffer1[1];
45-
else if(pin == PA6) // = ADC2_IN3 = phase V (OP2_OUT) on B-G431B-ESC1
47+
uint32_t raw_adc;
48+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
49+
#define ADC1_OFFSET 0
50+
#else
51+
#define ADC1_OFFSET 1
52+
#endif
53+
54+
switch (pin)
55+
{
56+
case A_OP1_OUT:
57+
case -1:
58+
raw_adc = adcBuffer1[0+ADC1_OFFSET];
59+
break;
60+
case A_OP2_OUT:
61+
case -2:
4662
raw_adc = adcBuffer2[0];
47-
#ifdef PB1
48-
else if(pin == PB1) // = ADC1_IN12 = phase W (OP3_OUT) on B-G431B-ESC1
63+
break;
64+
#ifdef A_OP3_OUT
65+
case A_OP3_OUT:
66+
#endif
67+
case -3:
68+
#ifdef OPAMP_USE_INTERNAL_CHANNEL
69+
raw_adc = adcBuffer2[1];
70+
#else
4971
raw_adc = adcBuffer1[0];
50-
#endif
51-
52-
else if (pin == A_POTENTIOMETER)
53-
raw_adc = adcBuffer1[2];
54-
else if (pin == A_TEMPERATURE)
55-
raw_adc = adcBuffer1[3];
56-
else if (pin == A_VBUS)
57-
raw_adc = adcBuffer1[4];
58-
72+
#endif
73+
break;
74+
case A_POTENTIOMETER:
75+
raw_adc = adcBuffer1[1+ADC1_OFFSET];
76+
break;
77+
case A_TEMPERATURE:
78+
raw_adc = adcBuffer1[2+ADC1_OFFSET];
79+
break;
80+
case A_VBUS:
81+
raw_adc = adcBuffer1[3+ADC1_OFFSET];
82+
break;
83+
default:
84+
raw_adc = 0;
85+
break;
86+
}
5987
return raw_adc * ((Stm32CurrentSenseParams*)cs_params)->adc_voltage_conv;
6088
}
6189

@@ -65,7 +93,7 @@ void _configureOPAMP(OPAMP_HandleTypeDef *hopamp, OPAMP_TypeDef *OPAMPx_Def){
6593
hopamp->Init.PowerMode = OPAMP_POWERMODE_HIGHSPEED;
6694
hopamp->Init.Mode = OPAMP_PGA_MODE;
6795
hopamp->Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO0;
68-
hopamp->Init.InternalOutput = DISABLE;
96+
hopamp->Init.InternalOutput = OPAMP_USE_INTERNAL_CHANNEL ? ENABLE : DISABLE;
6997
hopamp->Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;
7098
hopamp->Init.PgaConnect = OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0_BIAS;
7199
hopamp->Init.PgaGain = OPAMP_PGA_GAIN_16_OR_MINUS_15;

0 commit comments

Comments
 (0)