+ Post New Thread
Results 1 to 11 of 11
  1. #1
    Newbie level 4
    Points: 33, Level: 1
    bulanik.mantik's Avatar
    Join Date
    Jun 2014
    Posts
    7
    Helped
    0 / 0
    Points
    33
    Level
    1

    STM32F0 Discovery ADC problem

    hi everyone,
    i am working on my STM32F0 discovery kit and i am trying to learn how to read analog values. i wrote this program but it doesnt work and i dont know why. can someone help me why this code doesnt work. thanks for your help.
    best regards.

    Code:
    #include 
    #include 
    #include 
    #include "stm32f0xx.h"
    #include "stm32f0xx_adc.h"
    #include "stm32f0xx_dma.h"
    #include "stm32f0xx_rcc.h"
    #include 
    #include 
    
    #define ADC1_DR_Address 0x40012440
    
    uint32_t TempSensVoltmv = 0, VrefIntVoltmv = 0;
    uint16_t RegularConvData_Tab[2];
    
    void uart_send_char(char chr);
    void uart_send_string(unsigned char *string);
    
    void USART2_IRQHandler(void)
    {
    	char temp;
    	temp=USART_ReceiveData(USART2);
    	uart_send_char(temp);
    }
    
    void uart_send_char(char chr)
    {
    	while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    	USART_SendData(USART2, chr);
    }
    
    void uart_send_string(unsigned char *string)
    {
        while(*string)
        {
        	uart_send_char(*string);
            *string++;
        }
    }
    
    int main(void)
    {
    	uint32_t times;
    	char str[20];
    
    	ADC_InitTypeDef     ADC_InitStructure;
    	DMA_InitTypeDef     DMA_InitStructure;
    	USART_InitTypeDef 	USART_InitStructure;
    	GPIO_InitTypeDef 	GPIO_InitStructure;
    	NVIC_InitTypeDef 	NVIC_InitStruct;
    	/*rcc ayrlarıe*************************************/
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    	/*gpio ayarları************************************/
    	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
    	GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
    	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	/*usart ayarları***********************************/
    	USART_InitStructure.USART_BaudRate = 115200;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;
    	USART_InitStructure.USART_Parity = USART_Parity_No;
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    	USART_Init(USART2, &USART_InitStructure);
    	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    	/*kesme ayarları***********************************/
    	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStruct);
    	/******************************************************/
    	USART_Cmd(USART2,ENABLE); //usart2 aktif et
    	/******************************************************/
    	ADC_DeInit(ADC1);
    	/*dma ayarları*****************************************/
    	DMA_DeInit(DMA1_Channel1);
    	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
    	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab;
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    	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_M2M = DMA_M2M_Disable;
    	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    	DMA_Cmd(DMA1_Channel1, ENABLE);
    
    	ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    	ADC_DMACmd(ADC1, ENABLE);
    	/*adc ayarları******************************************/
    	ADC_StructInit(&ADC_InitStructure);
    	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    	ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
    	ADC_Init(ADC1, &ADC_InitStructure);
    
    	ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);
    	ADC_TempSensorCmd(ENABLE);
    
    	ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
    	ADC_VrefintCmd(ENABLE);
    
    	ADC_GetCalibrationFactor(ADC1);
    	ADC_Cmd(ADC1, ENABLE);
    
    	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    	ADC_StartOfConversion(ADC1);
    
    	while(1)
        {
    	    while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
    	    DMA_ClearFlag(DMA1_FLAG_TC1);
    
    //	    TempSensVoltmv = (uint32_t)((RegularConvData_Tab[0]* 3300) / 0xFFF);
    //	    VrefIntVoltmv  = (uint32_t)((RegularConvData_Tab[1]* 3300) / 0xFFF);
    
    	    TempSensVoltmv = RegularConvData_Tab[0];
    	    VrefIntVoltmv  = RegularConvData_Tab[1];
    
    	    uart_send_string("----------------------\r\n");
    	    sprintf(str,"Sicaklik: \t%d\r\n",TempSensVoltmv);
    		uart_send_string(str);
    
    	    sprintf(str,"VRef: \t\t%d\r\n",VrefIntVoltmv);
    		uart_send_string(str);
    		uart_send_string("----------------------\r\n");
    		for(times = 0; times < 5000000; times++);
        }
    }

  2. #2
    Newbie level 4
    Points: 33, Level: 1
    bulanik.mantik's Avatar
    Join Date
    Jun 2014
    Posts
    7
    Helped
    0 / 0
    Points
    33
    Level
    1

    Re: STM32F0 Discovery ADC problem

    i guess nobody can find any mistake or problem. whatever i am trying to find the proplem. if i would find it, i will write it down here.
    thanks
    have a great day.



    •   AltAdvertisment

        
       

  3. #3
    Advanced Member level 3
    Points: 4,748, Level: 16
    Achievements:
    7 years registered
    PA3040's Avatar
    Join Date
    Aug 2011
    Posts
    841
    Helped
    43 / 43
    Points
    4,748
    Level
    16

    Re: STM32F0 Discovery ADC problem



    1 members found this post helpful.

    •   AltAdvertisment

        
       

  4. #4
    Newbie level 4
    Points: 33, Level: 1
    bulanik.mantik's Avatar
    Join Date
    Jun 2014
    Posts
    7
    Helped
    0 / 0
    Points
    33
    Level
    1

    Re: STM32F0 Discovery ADC problem

    @PA3040 thanks for your answer. i thing i made my configration correct but clearly it is not correct because it is not working and i dont know why. i coundnt find my mistake.



  5. #5
    Advanced Member level 3
    Points: 4,748, Level: 16
    Achievements:
    7 years registered
    PA3040's Avatar
    Join Date
    Aug 2011
    Posts
    841
    Helped
    43 / 43
    Points
    4,748
    Level
    16

    Re: STM32F0 Discovery ADC problem

    Is UART working?



    •   AltAdvertisment

        
       

  6. #6
    Newbie level 4
    Points: 33, Level: 1
    bulanik.mantik's Avatar
    Join Date
    Jun 2014
    Posts
    7
    Helped
    0 / 0
    Points
    33
    Level
    1

    Re: STM32F0 Discovery ADC problem

    yes. with this code, i always see 4095 on analog value from usart.



  7. #7
    Administrator
    Points: 69,512, Level: 64
    Achievements:
    Created Album pictures Created Blog entry 7 years registered
    bigdogguru's Avatar
    Join Date
    Mar 2010
    Location
    Southwest, USA
    Posts
    9,832
    Helped
    2355 / 2355
    Points
    69,512
    Level
    64
    Blog Entries
    4

    Re: STM32F0 Discovery ADC problem

    Can you post a link to the actual Discovery board you are currently using?

    I may have one here and if so, I'll attempt to troubleshoot the issue.

    BigDog
    The Edge... there is no honest way to explain it, because the only people who really know where it is are the ones who have gone over.
    -- Hunter S. Thompson


    1 members found this post helpful.

  8. #8
    Newbie level 4
    Points: 33, Level: 1
    bulanik.mantik's Avatar
    Join Date
    Jun 2014
    Posts
    7
    Helped
    0 / 0
    Points
    33
    Level
    1

    Re: STM32F0 Discovery ADC problem

    i am using STM32F0 Discovery, here is the link
    HTML Code:
    http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF253215
    thanks for your help.



    •   AltAdvertisment

        
       

  9. #9
    Administrator
    Points: 69,512, Level: 64
    Achievements:
    Created Album pictures Created Blog entry 7 years registered
    bigdogguru's Avatar
    Join Date
    Mar 2010
    Location
    Southwest, USA
    Posts
    9,832
    Helped
    2355 / 2355
    Points
    69,512
    Level
    64
    Blog Entries
    4

    Re: STM32F0 Discovery ADC problem

    Unfortunately, that is about the only Discovery board I do not possess.

    If I have the time I'll examine your code later tonight and see what I can find.

    BigDog
    The Edge... there is no honest way to explain it, because the only people who really know where it is are the ones who have gone over.
    -- Hunter S. Thompson


    1 members found this post helpful.

  10. #10
    Newbie level 4
    Points: 33, Level: 1
    bulanik.mantik's Avatar
    Join Date
    Jun 2014
    Posts
    7
    Helped
    0 / 0
    Points
    33
    Level
    1

    Re: STM32F0 Discovery ADC problem

    ah thanks anyway :) i hope you will have a change to look it. :)



  11. #11
    Junior Member level 1
    Points: 241, Level: 2

    Join Date
    Apr 2014
    Posts
    16
    Helped
    1 / 1
    Points
    241
    Level
    2

    Re: STM32F0 Discovery ADC problem

    Now ,I will give you some code.i wish it can help to you!!

    Code C - [expand]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    
    #include"ADC.h"
     
     
    /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    #define ADC1_DR_Address                0x40012440
    __IO uint16_t RegularConvData_Tab[2];
    void ADC1_DMA_Init(void)
    {
      ADC_InitTypeDef     ADC_InitStruct;
      DMA_InitTypeDef     DMA_InitStruct;
        GPIO_InitTypeDef    GPIO_InitStruct;
          /* ADC1 DeInit */  
      ADC_DeInit(ADC1);
        /* Enable  GPIOA clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
      /* ADC1 Periph clock enable */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
      /* DMA1 clock enable */
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
     
      /* Configure PA.01  as analog input */
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//
      GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
      GPIO_Init(GPIOA, &GPIO_InitStruct);               // PC1,输入时不用设置速率
     
     
      /* DMA1 Channel1 Config */
      DMA_DeInit(DMA1_Channel1);
      DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
      DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab;
      DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
      DMA_InitStruct.DMA_BufferSize =4;
      DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
      DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
      DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
      DMA_InitStruct.DMA_Priority = DMA_Priority_High;
      DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
      DMA_Init(DMA1_Channel1, &DMA_InitStruct);
      
        DMA_DeInit(DMA1_Channel2);
     
      /* DMA1 Channel1 enable */
      DMA_Cmd(DMA1_Channel1, ENABLE);
      
    //   /* ADC DMA request in circular mode */
      ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
      
      /* Enable ADC_DMA */
      ADC_DMACmd(ADC1, ENABLE);  
      
      /* Initialize ADC structure */
      ADC_StructInit(&ADC_InitStruct);
      
      /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
      ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
      ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; 
      ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
      ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
      ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Backward;
      ADC_Init(ADC1, &ADC_InitStruct); 
     
    //   /* Convert the ADC_Channel_0 sensor  with 55.5 Cycles as sampling time */ 
      ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_55_5Cycles);  
      
      /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */ 
      ADC_ChannelConfig(ADC1, ADC_Channel_1  , ADC_SampleTime_55_5Cycles); 
      
      /* ADC Calibration */
      ADC_GetCalibrationFactor(ADC1);
      ADC_DMACmd(ADC1, ENABLE);
      /* Enable ADC1 */
      ADC_Cmd(ADC1, ENABLE);     
      
      /* Wait the ADCEN falg */
      while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); 
      /* ADC1 regular Software Start Conv */ 
      ADC_StartOfConversion(ADC1);
    }
     
    //取得AD值
    u16 GetADValue(u8 CHSeclect)
    { 
        DMA_ClearFlag(DMA1_FLAG_TC1);
        if(CHSeclect==0)
        return RegularConvData_Tab[0]; 
        else
            return RegularConvData_Tab[1]; 
    }
    Last edited by bigdogguru; 27th June 2014 at 02:01. Reason: Added CODE or SYNTAX Tags



--[[ ]]--