/*
*********************************************************************************************************
*
*	模块名称 :  ADC的IO初始化
*	文件名称 :  
*	版    本 :  V0.1
*	说    明 :	读取检波芯片AD8310模拟输出，AD8310默认斜率为24mV/dB
                读取芯片的温度			
                基准参考电压为3000mV 
*	修改记录 :  
*	
*
*********************************************************************************************************
*/

#include "adc.h"
#include "delay.h"	   
#include <math.h>	

u16 adcx1;


/*
*********************************************************************************************************
*	函 数 名: Adc_Init
*	功能说明: 配置ADC的通道输入格式，初始ADC外设
              PA0为检波芯片ADL5513的检波输出
			  内部通道16位内部温度传感器的专用通道
*	形    参: 
*	返 回 值: 无
*********************************************************************************************************
*/																   
void  Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;        //很重要	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	  //使能ADC1通道时钟 
	RCC_ADCCLKConfig(RCC_PCLK2_Div4);   //设置ADC分频因子

	//PA0 作为模拟通道输入引脚                         
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;	//模数转换工作在连续转换模式
	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);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
	
	ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
  
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1	
	
	NVIC_InitStructure.NVIC_IRQChannel =ADC1_2_IRQn ;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             
	NVIC_Init(&NVIC_InitStructure); 	
	
	
	ADC_ResetCalibration(ADC1);	//使能复位校准  	 
	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束	
	ADC_StartCalibration(ADC1);	 //开启AD校准
	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束
	
	ADC_RegularChannelConfig(ADC1, 0, 1, ADC_SampleTime_13Cycles5 );	//ADC1,ADC通道,
	
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能
                                                //这句话改到下面那个函数了
												
// 	ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); //中断使能	
	ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE); //中断关闭
}	



/*
*********************************************************************************************************
*	函 数 名: Get_Adc
*	功能说明: 获取通道x 的ADC的转换值

*	形    参: 
*	返 回 值: 无
*********************************************************************************************************
*/	
u16 Get_Adc(u8 ch)   
{
  	//设置指定ADC的规则组通道，一个序列，采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_7Cycles5 );	//ADC1,ADC通道,采样时间为 			     
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}




/*
*********************************************************************************************************
*	函 数 名: Get_Adc_Average
*	功能说明: 对ADC转换值进行平均

*	形    参: 
*	返 回 值: 无
*********************************************************************************************************
*/
u16 Get_Adc_Average(u8 ch,u16 times)
{
	u32 temp_val=0;
	u16 temp;
	u16 t;
	for(t=0;t<times;t++)
	{	
		temp_val+=Get_Adc(ch);
//		delay_ms(2);
	}
	temp = (u16)(temp_val / times);
	
	return temp;
} 	 


/*
*********************************************************************************************************
*	函 数 名: Get_Adc_Rms
*	功能说明: 对ADC转换值进行均方根计算

*	形    参: 
*	返 回 值: 无
*********************************************************************************************************
*/
u16 Get_Adc_Rms(u8 ch, u16 times)
{
	unsigned char i;
	double dData[100];
	double dSum;
	u16  temp;
	for(i=0; i<times; i++)
	{
		dData[i] = (double)(Get_Adc(ch));
		dSum +=pow(dData[i],2);
//		delay_us(100);
	}
	dSum /= times;//
	dSum = sqrt(dSum);//
	temp =  (u16)dSum;
	return temp;
} 	


/*
*********************************************************************************************************
*	函 数 名: Get_Adc_LPF
*	功能说明: 对ADC转换值进行低通滤波

*	形    参: 
*	返 回 值: 无
*********************************************************************************************************
*/
u16 Get_Adc_LPF(u8 ch, u16 times)
{
	static unsigned int iLastData;
	unsigned int iData;
	u16 temp;
	
	double dPower=0.5;
	iData = (Get_Adc(ch) * dPower)+ (1 - dPower) * iLastData;//??
	iLastData = iData;//
	temp = iData;
	
	return temp;//
} 	





/*
*********************************************************************************************************
*	函 数 名: ADC1_2_IRQHandler
*	功能说明: ADC读取中断，
*	形    参: 
*	返 回 值: 
*********************************************************************************************************
*/
void ADC1_2_IRQHandler(void)
{
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//检查标志位
	adcx1 = ((ADC_GetConversionValue(ADC1))); //
	ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);   //清除位
}























