Skip to main content
ho_it
Associate III
February 4, 2016
Question

STM32F2xx single ADC channel with DMA mode value > 4095

  • February 4, 2016
  • 6 replies
  • 1384 views
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
    This topic has been closed for replies.

    6 replies

    AvaTar
    Senior III
    February 4, 2016
    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_it
    ho_itAuthor
    Associate III
    February 4, 2016
    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);

    Tesla DeLorean
    Guru
    February 4, 2016
    Posted on February 04, 2016 at 08:57

    And how is adc_value defined?

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    AvaTar
    Senior III
    February 4, 2016
    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_it
    ho_itAuthor
    Associate III
    February 4, 2016
    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?

    Tesla DeLorean
    Guru
    February 4, 2016
    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 VenmoUp vote any posts that you find helpful, it shows what's working..