/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：adc.c
 * 描  述  ：ADC驱动程序
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/04/30
*********************************************************************************/
#include "adc.h" 

/*
***********************************************************************
*	函 数 名: Adc_Init
*	功能说明: 初始化ADC		
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/															   
void Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE);	  							//使能ADC1通道时钟
 
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   																	//72M/6=12,ADC最大时间不能超过14M
	
	//外部温度检测	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;													//模拟输入引脚
	GPIO_Init(GPIOC, &GPIO_InitStructure);	
	
	//主板温度检测
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;													//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	//电机电流检测
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;													//模拟输入引脚
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	//红外测距ADC引脚
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;													//模拟输入引脚
	GPIO_Init(GPIOC, &GPIO_InitStructure);	

	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);																		//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
 

	ADC_Cmd(ADC1, ENABLE);														//使能指定的ADC1
	
	ADC_ResetCalibration(ADC1);												//重置指定的ADC1的校准寄存器
	 
	while(ADC_GetResetCalibrationStatus(ADC1));				//获取ADC1重置校准寄存器的状态,设置状态则等待
	
	ADC_StartCalibration(ADC1);												//开始指定ADC1的校准状态
 
	while(ADC_GetCalibrationStatus(ADC1));						//获取指定ADC1的校准程序,设置状态则等待
 
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);						//使能指定的ADC1的软件转换启动功能

}				  

/*
***********************************************************************
*	函 数 名: Get_Adc
*	功能说明: 获得ADC值
*	形    参：ch:通道值 0~3
*	返 回 值: 无
***********************************************************************
*/
uint16_t GetADC(uint8_t ch)   
{
  //设置指定ADC的规则组通道，设置它们的转化顺序和采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_28Cycles5);
//	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期	  			    
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);																//使能指定的ADC1的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));												//等待转换结束

	return ADC_GetConversionValue(ADC1);																	//返回最近一次ADC1规则组的转换结果
}

/*
***********************************************************************
*	函 数 名: Data_collection
*	功能说明: 数据采集			
*	形    参：
*       		x[]:需要处理的数组
*						n:采集的次数
*						ch:需采集的通道
*	返 回 值: 无
***********************************************************************
*/
void Data_collection(uint16_t x[], uint16_t n, uint8_t ch)
{
	uint8_t i;
	
	for(i=0; i<n; i++)
	{
		x[i] = GetADC(ch);     //采样数据送缓存
	}
}

/******************** (C) COPYRIGHT 2017 CXHY *****END OF FILE*******************/
