cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4 potentiometer and ADC

pano
Associate II
Posted on October 01, 2014 at 17:23

HI,

I want to read the value of a potentiometer; I have this ADC:


#include ''stm32f4xx_adc.h''

#include ''stm32f4xx_gpio.h''

#include ''stm32f4xx_rcc.h''

#include ''pwm2.h''


void adc_configure(void){

ADC_InitTypeDef ADC_init_structure; //Structure for adc confguration

GPIO_InitTypeDef GPIO_initStructre; //Structure for analog input pin


//Clock configuration

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//The ADC1 is connected the APB2 peripheral bus thus we will use its clock source

RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN,ENABLE);//Clock for the ADC port!! Do not forget about this one ;)


//Analog pin configuration

GPIO_initStructre.GPIO_Pin = GPIO_Pin_0;//The channel 10 is connected to PC0

GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PC0 pin is configured in analog mode

GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down

GPIO_Init(GPIOC,&GPIO_initStructre);//Affecting the port with the initialization structure configuration


//ADC structure configuration

ADC_DeInit();

ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right;//data converted will be shifted to right

ADC_init_structure.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit number giving a maximum value of 4096

ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //the conversion is continuous, the input data is converted more than once

ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;// conversion is synchronous with TIM1 and CC1 (actually I'm not sure about this one :/)

ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//no trigger for conversion

ADC_init_structure.ADC_NbrOfConversion = 1;//I think this one is clear :p

ADC_init_structure.ADC_ScanConvMode = DISABLE;//The scan is configured in one channel

ADC_Init(ADC1,&ADC_init_structure);//Initialize ADC with the previous configuration


//Enable ADC conversion

ADC_Cmd(ADC1,ENABLE);


//Select the channel to be read from

ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_144Cycles);

}


int adc_convert(void){

ADC_SoftwareStartConv(ADC1);//Start the conversion

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion

return ADC_GetConversionValue(ADC1); //Return the converted data

}

and in the main function:

1.
ConvertedValue = adc_convert(); //Read the ADC converted value
2.
printf(''%i\r\n'',ConvertedValue);

It works but not perfectly: ConvertedValue is 0 when potentiometer is at 0°, ConvertedValue is 4095 when potentiometer is at 180°, ConvertedValue is 2900 when potentiometer is at 270°, why? I would like ConvertedValue=4095 at 270°, not at 180° thanks
5 REPLIES 5
chen
Associate II
Posted on October 01, 2014 at 18:21

Hi

''It works but not perfectly:

ConvertedValue is 0 when potentiometer is at 0°,

ConvertedValue is 4095 when potentiometer is at 180°,

ConvertedValue is 2900 when potentiometer is at 270°,

why? I would like  ConvertedValue=4095 at 270°, not at 180°''

Firstly, what voltage (Vref) are you feeding into the pot?

Have you checked with a voltmenter (or multimeter) that the input into the STM32 ADC is as expected?

ie (full Vref at one end of the pot, 0.5 Vref mid way on pot and ~0V at other end of pot)

pano
Associate II
Posted on October 02, 2014 at 11:07

it works at 5V (

it is connected to the

pin

5V of the

board

).

I don't have measured the output voltage from the potentiometer, but the resistance with a tester: it is ~12ohm at 0° and ~4.8k ohm at 270°.

I'll measure resistance at 180° and voltage output and I'll let you know.

thanks

frankmeyer9
Associate II
Posted on October 02, 2014 at 12:47

it works at 5V (

it is connected to the

pin

5V of the

board

).

 

Really bad idea.

Look at the datasheets, the ADC inputs are specified up to 3.6V.

Misbehavior is the least consequence of overstressing the silicon.

chen
Associate II
Posted on October 02, 2014 at 13:27

''it works at 5V (

it is connected to the

pin

5V of the

board

).''

As fm said - bad idea. The max IP voltage of the ADC is the same as the supply voltage (3.3V + a little head room).

Would also explain why you got full scale at the mid point on the pot.

Try 3.3V to the pot.

pano
Associate II
Posted on October 03, 2014 at 15:06

yes, it works; i'm a noob :D

thanks