2015-11-12 09:21 AM
Hi everybody!!
I'm doing a program in which I would like to read two ADC channel but I couldn't. I use to do this the ADC and the DMA. I don't known what is wrong in my code. /* Includes ------------------------------------------------------------------*/#include ''main.h''/* Private define ------------------------------------------------------------*/#define ADC1_DR_Address ((uint32_t)0x4001244C)/* Public variables ----------------------------------------------------------*/GPIO_InitTypeDef GPIO_InitStruct;ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;__IO uint16_t ADC1ConvertedValue [2] = {0};/* Public functions ----------------------------------------------------------*/void RCC_Configuration(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); }void GPIO_Configuration(){ /* Condigure ADC Channel 10*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // We are going to use PC1 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; // Analog input mode GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // Set GPIO speed GPIO_Init(GPIOC, &GPIO_InitStruct); /* Condigure ADC Channel 12*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; // We are going to use PC2 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; // Analog input mode GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // Set GPIO speed GPIO_Init(GPIOC, &GPIO_InitStruct);}void DMA_Configuration(){ /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue; 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); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE);}void ADC_Configuration(){ /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_28Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1));/* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1));}/** * @brief Main program * @param None * @retval None */void main(void){ int i = 0; float tensionADC1 = 0; float tensionADC2 = 0; float tension1 = 0; float tension2 = 0; RCC_Configuration(); GPIO_Configuration(); DMA_Configuration(); ADC_Configuration(); tensionADC1 = 0; tensionADC2 = 0; tension1 = 0; tension2 = 0; for (i=0; i<1000; i++) // ADC measurement loop { ADC_SoftwareStartConvCmd(ADC1, ENABLE); //while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); tensionADC1 += ((ADC1ConvertedValue[0])*(3.3/4096)); tensionADC2 += ((ADC1ConvertedValue[1])*(3.3/4096)); } tension1 = tensionADC1/1000; tension2 = tensionADC2/1000; printf(''%f'', tension1); printf(''%f'', tension2); while(1);}/************************** (C) COPYRIGHT 2015 GIE ************END OF FILE*****/2015-11-12 10:48 AM
There seems to be some unnecessary replication of code, the rank number of the second channel is wrong, and I have no idea what processor you are using. STM32 describes hundreds of parts, over several families. You need to be specific about the chip and board in question. The DISCO boards use a 3.0V reference, not a 3.3V one.
Are you sure I haven't already posted a working example? It's a lot easier to just use something that works and modify it, than have me constantly play ''fix-this broken code I've created''.2015-11-24 12:40 AM