AnsweredAssumed Answered

STM32F4 potentiometer and ADC

Question asked by pano.samuele on Oct 1, 2014
Latest reply on Oct 3, 2014 by pano.samuele
I want to read the value of a potentiometer; I have this ADC:
01.#include "stm32f4xx_adc.h"
02.#include "stm32f4xx_gpio.h"
03.#include "stm32f4xx_rcc.h"
04.#include "pwm2.h"
06.void adc_configure(void){
07.     ADC_InitTypeDef ADC_init_structure; //Structure for adc confguration
08.     GPIO_InitTypeDef GPIO_initStructre; //Structure for analog input pin
10.     //Clock configuration
11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//The ADC1 is connected the APB2 peripheral bus thus we will use its clock source
12.     RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN,ENABLE);//Clock for the ADC port!! Do not forget about this one ;)
14.    //Analog pin configuration
15.     GPIO_initStructre.GPIO_Pin = GPIO_Pin_0;//The channel 10 is connected to PC0
16.     GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PC0 pin is configured in analog mode
17.     GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down
18.     GPIO_Init(GPIOC,&GPIO_initStructre);//Affecting the port with the initialization structure configuration
20.    //ADC structure configuration
21.     ADC_DeInit();
22.     ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right;//data converted will be shifted to right
23.     ADC_init_structure.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit number giving a maximum value of 4096
24.     ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //the conversion is continuous, the input data is converted more than once
25.     ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;// conversion is synchronous with TIM1 and CC1 (actually I'm not sure about this one :/)
26.     ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//no trigger for conversion
27.     ADC_init_structure.ADC_NbrOfConversion = 1;//I think this one is clear :p
28.     ADC_init_structure.ADC_ScanConvMode = DISABLE;//The scan is configured in one channel
29.     ADC_Init(ADC1,&ADC_init_structure);//Initialize ADC with the previous configuration
31.     //Enable ADC conversion
32.     ADC_Cmd(ADC1,ENABLE);
34.     //Select the channel to be read from
35.     ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_144Cycles);
37. adc_convert(void){
39. ADC_SoftwareStartConv(ADC1);//Start the conversion
40. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion
41. return ADC_GetConversionValue(ADC1); //Return the converted data
and in the main function:
1.ConvertedValue = adc_convert(); //Read the ADC converted value

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°