ADC 구현관련 문의드립니다
글쓴이: rider7979 / 작성시간: 화, 2013/04/23 - 6:09오후
안녕하세요
STM32L에서 DMA와 ADC를 이용한 배터리 잔량 확인을 테스트하고 있습니다
그런데 아무리 해봐도 값이 0이 나오는데 코드가 잘못된 것인지
어디를 고쳐야 할지 모르겠네요
조언 부탁드립니다
#define BSP_MODULE #define ADC1_DR_ADDRESS ((uint32_t)0x40012458) //#define __IO float ADC_ConvertedValue; void ADC_Config(void) { GPIO_Configuration(); ADC_Configuration(); } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; /* DMA1 channel1 configuration ---------------------------------------------*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 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_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = 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_10, 1, ADC_SampleTime_16Cycles); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); //Enable ADC1 DMA ADC_DMACmd(ADC1, ENABLE); //Enable ADC1 ADC_Cmd(ADC1, ENABLE); /* Wait until the ADC1 is ready */ while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == SET){ } //Start ADC1 Conversion ADC_SoftwareStartConv(ADC1); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC , ENABLE); /* Configure PC.0 (ADC Channel0) as analog input -------------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); } void Voltage_Check(void) { char conv_char[11]={0,}; BSP_Debug_Put_String("\r\n"); sprintf(conv_char,"%d",ADC_ConvertedValue+1); BSP_Debug_Put_String("ADC Value\r\n"); BSP_Debug_Put_String(conv_char); BSP_Debug_Put_String("\r\n"); sprintf(conv_char,"%d",ADC_ConvertedValue*3300/4096); BSP_Debug_Put_String(conv_char); }
Forums:
댓글 달기