#include "adc.h" #include "includes.h" void adc_init(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //使能ADC1时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6,72M/6=12,ADC最大时间不能超过14M GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置PA01 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA ADC_DeInit(ADC1); //复位ADC1,重设为默认缺省值 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1 ADC_Cmd(ADC1,ENABLE); //使能ADC1 ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束 ADC_StartCalibration(ADC1); //开启AD校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能ADC1的软件转换启动功能 } u16 get_adc(uint8_t channel, uint8_t rank, uint8_t sample_time) { //配置ADCx,ADC通道,规则采样顺序,采样时间 ADC_RegularChannelConfig(ADC1,channel,rank,sample_time); ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能ADC1的软件转换启动功能 ADC_TempSensorVrefintCmd(ENABLE); while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 } #define ADC_TEST_TIMES 3 int adc_test(void) { float vol=0.0; u16 temp=0, times = 0; adc_init(); times = ADC_TEST_TIMES; while(times--) { temp = get_adc(ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); vol = (float)temp*3300/4096; //电压值(mV) printf("ADC_Channel_0 Voltage measurement is : %f mV(%d)\r\n",vol, temp); //串口打印电压值 delay_ms(1000); } times = ADC_TEST_TIMES; while(times--) { //内部温度采样 //温度 = {(V25 - VSENSE)/Avg_Slope} + 25; //其中v25 = 1.43,Avg_Slope = 0.0043 //参考数据手册温度传感器电器特性一节 temp = get_adc(ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); vol = (1.42 - temp*3.3/4096)*1000/4.35 + 25; printf("ADC_Channel_16 Temper measurement is : %f C(%d)\r\n",vol, temp); //串口打印电压值 delay_ms(1000); } times = ADC_TEST_TIMES; while(times--) { temp = get_adc(ADC_Channel_17, 1, ADC_SampleTime_239Cycles5); vol = (float)temp*3300/4096; //电压值(mV) printf("ADC_Channel_17 Voltage measurement is : %f mV(%d)\r\n",vol, temp); //串口打印电压值 delay_ms(1000); } return 0; }