cancel
Showing results for 
Search instead for 
Did you mean: 

stm32f4 Discovery multiple potentiometers

kenny__84
Associate II
Posted on November 11, 2012 at 09:33

Hi everyone,

I'm trying to get a accurate reading out of 2 potentiometers but they keep affecting each other. Also when I press my touchpanel (XPT2046) the readout is affected.... Does anyone have any idea how to fix this? Here is my ADC and DMA configuration Maybe you can tell that i tried a few things, but up till now i have very limited results. Thanks in advance, Kenny

void
ADC1_DMA_Config(
void
)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
/* Enable peripheral clocks *************************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* DMA2_Stream0 channel0 configuration **************************************/
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel = DMA_Channel_0; 
//The adress of the analog to digital converter 1
#define ADC1_DR_ADDRESS ((uint32_t)0x4001204C)
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; 
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
/* DMA2_Stream0 enable */
DMA_Cmd(DMA2_Stream0, ENABLE);
/* Configure GPIO pins as analog input ******************************/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC1 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 2;
ADC_InitStructure.ADC_ExternalTrigConv=0x00;
ADC_Init(ADC1, &ADC_InitStructure);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* ADC1 regular channels configuration **************************************/
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_3Cycles);
/* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
/* Enable ADC1 **************************************************************/
ADC_Cmd(ADC1, ENABLE);
}

#stm32f4-adc
7 REPLIES 7
frankmeyer9
Associate II
Posted on November 11, 2012 at 12:39

If anything else works,

ADC_SampleTime_3Cycles

is likely your problem Use something significantly bigger, such as

ADC_SampleTime_84Cycles

or

ADC_SampleTime_144Cycles

. You are probably overrunning the S&H stage of the ADC.
kenny__84
Associate II
Posted on November 11, 2012 at 13:41

I feel like a dumbass now....

I did change this, but i changed a lot more and now it is working!

Thank you!
frankmeyer9
Associate II
Posted on November 11, 2012 at 15:17

I feel like a dumbass now....

 

No need to ...

This is not obvious, and requires detailled knowledge or experience with ADCs.

You can also go back to 3 cycles sample time, if you drive the input hard. It's about charging and discharging the S&H capacitor in really short time.

orn
Associate II
Posted on November 11, 2012 at 15:40

Reading this forum and the various topics I'm learning a lot of things, but these things you have to learn through experience or college?

orn
Associate II
Posted on November 11, 2012 at 15:45

Reading this forum and the various topics I'm learning a lot of things, but these things you have to learn through experience or college?

frankmeyer9
Associate II
Posted on November 11, 2012 at 16:59

... but these things you have to learn through experience or college?

 

College/university is a good starting point.

But actually, such education rather seldom goes into such detail to enable you to solve real-world problems, as you encounter in a corresponding job. Having studied 25 years ago, I often had to deal with equipment from the '50 and '60.

As electronics and microcontroller development is advancing rapidly, self-education is an absolute requirement. About 2/3 of the knowledge and skills I need at my day job are not learned at university. But that may depend.

Experience is the thing you gain while practising - not really new.

But it really speeds up development if you have done something similiar already, and you know which ways to go and which pitfalls to avoid.

And with ''experience'' I primarily associate my kids, who comprehended the meaning of ''hot'' only after touching the hot oven...

kenny__84
Associate II
Posted on November 11, 2012 at 20:34

I've spend a lot of time in Arduino and AVR and I think it's fair to say that this community pretty much solved everything with perfected library's .

This is just a matter of implementing and add some flavor, combine here and there and who-la end product....

But i decided i wanted some more so made the step to stm32 MCU's.

A lot of datasheets ,evaluation kits and a few industrial applications later i can say that

it's just awesome! and the pain of hitting my head against the wall from time to time is totally worth it!

I'm glad that there is a community growing and helping each other out because as you said

a lot of things you'll learn on the way!

Thanks again, it's so great to see a controller with a few sensors and a lcd-touch screen!