2014-10-01 08:23 AM
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
2014-10-01 09:21 AM
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)2014-10-02 02:07 AM
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. thanks2014-10-02 03:47 AM
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.
2014-10-02 04:27 AM
''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.2014-10-03 06:06 AM
yes, it works; i'm a noob :D
thanks