#include "adc.h"
#include "../APP/globalDef.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

//        printf("aaaaaaaaaaaaaaaaaaaa = %x\r\n",g_firmwareMsg.gatewayMsg.hardwareMsg.data);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//配置PA01
        if((g_firmwareMsg.gatewayMsg.hardwareMsg.data>0x20221113) \
           && (g_firmwareMsg.gatewayMsg.hardwareMsg.data <0x20230411)){
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_IPD;//GPIO_Mode_AIN;			//模拟输入
            g_runData.bRef12 = 1;
        }
        else {
            g_runData.bRef12 = 0;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//GPIO_Mode_IPD;//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_InitStructure.ADC_ExternalTrigConv = 0;                      //顺序进行规则转换的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;
}
