cancel
Showing results for 
Search instead for 
Did you mean: 

Extern Potentiometer MCSDK

Undertaker
Associate II

Hello,

I bought the STM32 Nucleo Pack with the Nucleo-F302R8, the X-Nucleo-IHM07M1 and a three-phase motor.

I use MCSDK to control my motor and it's no problem.

But when I want to add an external potentiometer to the ADC, I can't get the values from it.

I've tried lots of things, but nothing works.

To be sure of my potentiometer and my program, I tried with a simple program that doesn't use MCSDK, and everything worked perfectly.

 

Here is the configuration of my MX_ADC1_Init with mcsdk activated:

 
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */

ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
ADC_InjectionConfTypeDef sConfigInjected = {0};
ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */

/** Common config */
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_LEFT;
hadc1.Init.NbrOfConversion = 3;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}

/** Configure Analog WatchDog 1 */
AnalogWDGConfig.WatchdogNumber = ADC_ANALOGWATCHDOG_1;
AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_INJEC;
AnalogWDGConfig.HighThreshold = 0;
AnalogWDGConfig.LowThreshold = 0;
AnalogWDGConfig.Channel = ADC_CHANNEL_9;
AnalogWDGConfig.ITMode = DISABLE;
if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
{
Error_Handler();
}

/** Configure Injected Channel */
sConfigInjected.InjectedChannel = ADC_CHANNEL_9;
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
sConfigInjected.InjectedSingleDiff = ADC_SINGLE_ENDED;
sConfigInjected.InjectedNbrOfConversion = 1;
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_19CYCLES_5;
sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_FALLING;
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T1_TRGO;
sConfigInjected.AutoInjectedConv = DISABLE;
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
sConfigInjected.QueueInjectedContext = DISABLE;
sConfigInjected.InjectedOffset = 0;
sConfigInjected.InjectedOffsetNumber = ADC_OFFSET_NONE;
if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
{
Error_Handler();
}

/** Configure Regular Channel */
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_181CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}

/** Configure Regular Channel */
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}

/** Configure Regular Channel */
sConfig.Channel = ADC_CHANNEL_5; //Potentiometer
sConfig.Rank = ADC_REGULAR_RANK_3;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}

/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */

}
5 REPLIES 5
Karl Yamashita
Principal

Use the </> when posting code. It properly formats it and so it's easier to view the code instead of all the text left hand adjusted

Code Snippet.jpg

 

You need to do is post code on where and how you're using your code along side with the MCSDK.

I was told that if a devices starts to smoke, put the smoke back in. I guess I never got all the smoke because the device never worked afterwards.
Don't worry, I won't byte.
TimerCallback tutorial! | UART and DMA Idle tutorial!

If you find my solution useful, please click the Accept as Solution so others see the solution.

Hello,
I can't post my code today but I can explain how it works.
For now, I just want to read the potentiometer value at the beginning of while(1) and just after start the motor for a while.
Once I'm sure that the potentiometer reading program is correct, I'll use this value as the setpoint for the motor.

Hello @Undertaker,

 

With MCSDK 6.4.0 or 6.3.2, the potentiometer feature is already proposed. You can just enable it from the "Stage configuration" window as shown below:

cedricH_0-1751870115629.png

Once enabled, generate your project, and you will have all the leisure to read and understand the code.

The only condition to have the possibility to enable the potentiometer is that it is described in the power board (or inverter) and the signal is connected to an ADC input pin (which is the case in your pack).

Hi @cedric H, sorry for the delay,

If I understand your solution correctly, I need to activate the internal potentiometer on the IHM07M1. Once I have generated my project, I need to find out how the potentiometer is used and modify or copy this function for my external potentiometer.

In my case, I prefer to copy and modify its use, but this seems to be a difficult task for a single external potentiometer.

Hello @Undertaker 

I think you need to go over the regular conversion manager component, you can access it through about->Documations->Components->Regular Conversion Manager in the MCSDK V6.4. This way user is able to define their own custom conversion

Regards