2012-11-11 12:33 AM
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, Kennyvoid
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
2012-11-11 03:39 AM
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.
2012-11-11 04:41 AM
I feel like a dumbass now....
I did change this, but i changed a lot more and now it is working!Thank you!2012-11-11 06:17 AM
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.
2012-11-11 06:40 AM
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?
2012-11-11 06:45 AM
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?
2012-11-11 07:59 AM
... 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...
2012-11-11 11:34 AM
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 thatit'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 saida 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!