STM32F0 ADC程序設計

1。 ADC初始化

void ADC_CH_DMA_Config(void)
{
  ADC_InitTypeDef     ADC_InitStructure;
  DMA_InitTypeDef     DMA_InitStructure;
	GPIO_InitTypeDef    GPIO_InitStruct; 
  /* ADC1 DeInit */  
  ADC_DeInit(ADC1);  
	/* Enable  GPIOA clock */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);				//PA0,PA1
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);  
  /* Configure PA0,PA1  as analog input */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;					//PA0,PA1
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStruct);				// PA0&PA1,ÊäÈëʱ²»ÓÃÉèÖÃËÙÂÊ
  /* DMA1 Channel1 Config */
  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);  
  /* 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_InitStructure); 
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  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); 
  /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */ 
  /* Convert the ADC1 ADC_Channel_0 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 */ 
  /* Convert the ADC1 ADC_Channel_1 with 55.5 Cycles as sampling time */ 
  ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles);   
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1); 
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);     
  /* Wait the ADRDY falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));  
  /* ADC1 regular Software Start Conv */ 
  ADC_StartOfConversion(ADC1);
}

2。讀adc 值
void ReadAdcValue(void)
{
/* Test DMA1 TC flag /
while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
/
Clear DMA TC flag /
DMA_ClearFlag(DMA1_FLAG_TC1);
/
Convert temperature sensor voltage value in mv /
// TempSensVoltmv = (uint32_t)((RegularConvData_Tab[0]
3300) / 0xFFF);
AdcChn0Voltmv = (uint32_t)((RegularConvData_Tab[0]* 3300) / 0xFFF);
/* Convert Vref voltage value in mv /
// VrefIntVoltmv = (uint32_t)((RegularConvData_Tab[1]
3300) / 0xFFF);
AdcChn1Voltmv = (uint32_t)((RegularConvData_Tab[1]* 3300) / 0xFFF);
// printf(“AdcChn0Voltmv = %x “,AdcChn0Voltmv);
// printf(”\r\n”);
UART1_SendByte(0x01);
UART1_SendByte(AdcChn0Voltmv&0x00ff); //low
UART1_SendByte((AdcChn0Voltmv>>8)&0x00ff); //hi
UART1_SendByte(0x0D);
UART1_SendByte(0x0A);
// printf(“AdcChn1Voltmv = %x”,AdcChn1Voltmv);
// printf("\r\n");
UART1_SendByte(0x02);
UART1_SendByte(AdcChn1Voltmv&0x00ff); //low
UART1_SendByte((AdcChn1Voltmv>>8)&0x00ff); //hi
UART1_SendByte(0x0D);
UART1_SendByte(0x0A);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章