Skip to main content
pano
Associate II
October 1, 2014
Question

STM32F4 potentiometer and ADC

  • October 1, 2014
  • 5 replies
  • 2665 views
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
    This topic has been closed for replies.

    5 replies

    chen
    Associate II
    October 1, 2014
    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
    panoAuthor
    Associate II
    October 2, 2014
    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 III
    October 2, 2014
    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
    October 2, 2014
    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
    panoAuthor
    Associate II
    October 3, 2014
    Posted on October 03, 2014 at 15:06

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

    thanks