#include "adc.h" #include "stm32l1xx_adc.h" #include "bsp.h" //PB0-ADC8,PB1-ADC9 __IO uint16_t VREFINT_CAL; __IO uint16_t VREFINT_DATA; __IO float VDDA_VAL; void ADC15_Init(void) { ADC_CommonInitTypeDef ADC_CommonInitStructure; GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; /*----------------- ADC1 configuration with DMA enabled --------------------*/ /* Enable the HSI oscillator */ RCC_HSICmd(ENABLE); ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4; ADC_CommonInit(&ADC_CommonInitStructure); /* Enable GPIOB clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); /* Configure PB.14 (ADC Channe20) in analog mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Check that HSI oscillator is ready */ while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); /* Enable ADC1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC1 configuration */ ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;//12位 ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_TempSensorVrefintCmd(ENABLE);//内部通道17使能 ADC_Cmd(ADC1, ENABLE); VREFINT_CAL = *(__IO uint16_t *)(0X1FF800F8); } //获得ADC值 //ch:通道值 0~3 u16 Get_Adc(u8 ch) { PWR_CTRLADC_H;//打开ADC电源 //设置指定ADC的规则组通道,一个序列,采样时间 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_384Cycles ); //ADC1,ADC通道 ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 } //读取带参考电压的ADC值 float Get_Adc_Ref(u8 ch) { float ADC_V; u16 adc_ch; PWR_CTRLADC_H;//打开ADC电源 // Get_Adc(ch); VREFINT_DATA=Get_Adc(17); adc_ch=Get_Adc(ch); VDDA_VAL=(float)3*VREFINT_CAL/VREFINT_DATA;//获取VDDA电压 ADC_V=((float)adc_ch/4095)*VDDA_VAL; return ADC_V; } float Get_Adc_Average(u8 ch,u8 times) { float temp_val=0; u8 t; for(t=0;t