cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F2xx single ADC channel with DMA mode value > 4095

ho
Associate II
Posted on February 04, 2016 at 07:26

I am getting ADC value on GPIOB Pin 1, using DMA, with continous conversion mode enable.

The ADC value that i obtain is > 4095, is this normal.

Below is the table of adc value that i obtain compare to the real voltage connected to that pin

Real voltage (V)     Raw Value

3.80 37216

3.97 39008

4.20 41216

Why am i getting the raw value > 4095, is this behavior normal? i thought i should be getting 0 - 4095 (12 bit?)

From the table above, i could deduce that my conversion from raw to real is / 10000
6 REPLIES 6
AvaTar
Lead
Posted on February 04, 2016 at 07:45

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

Or is it not ?
ho
Associate II
Posted on February 04, 2016 at 07:56

yes it is,

my settings are below

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = BATTERY_VOLTAGE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(BATTERY_VOLTAGE_PORT, &GPIO_InitStructure);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adc_value;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
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);
DMA_Cmd(DMA2_Stream0, ENABLE);
ADC_CommonInitTypeDef ADC_CommonInitStructure;
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_20Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_480Cycles);
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv(ADC1);

Posted on February 04, 2016 at 08:57

And how is adc_value defined?

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
AvaTar
Lead
Posted on February 04, 2016 at 09:08

Back to your first post:

>Real voltage (V)     Raw Value

 

>

3.80

37216

 

>

3.97

39008

 

>

4.20

41216

 

Are these the voltage on the GPIO/ADC pins ?

Are you aware of the 3.6V specified limit for analogue inputs ?

ho
Associate II
Posted on February 04, 2016 at 09:46

I defined it as

volatile uint16_t adc_value;

and yes it is aware of the max voltage rating. I found out the problem, that i dint include the line below

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

Once, i include it i could get the correct ADC value, but I dont understand why do i need to configure this settings, and is the meaning of

ADC_ExternalTrigConv_T1_CC1?

Posted on February 04, 2016 at 12:15

Perhaps because it stops random stack junk in the structure from misconfiguring the ADC. You've chosen continuous, and no trigger, but failing to initialize all fields appears to have resulted in a change of alignment.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..