#include "adc.h"
#include "delay.h"
#include "usart.h"
#include "sys.h"
#include "math.h"
#include "main.h"
#include "pid.h"
/* 
   ===����������ʾ����===
   Ϊ��������������������ADC���Σ�Ȼ��ƽ�������Ի�ø��ȶ��IJ���ֵ����readThermistor����ʵ�֡�
   http://www.thermistors.cn/news/293.html
*/ 
float ADC_max = 4095.0; //������ֵ��12λADC
/*ʹ��beta���̼�����ֵ��*/ 
float beta = 3950.0; //�̼Ҹ����ĵ����Ӧ25��C�µ�bataֵ
float roomTemp = 298.15; //�Կ�����Ϊ��λ������25��C
float balanceR = 9900.0;//�����
float roomTempR = 10000.0; //NTC��������������25��C�¾��е��͵ĵ���
float currentTemperature = 0; //���浱ǰ�¶�
u16 NTC_Average=0;
u16 T12_Average=0;
#define ADC1_DR_Address    ((u32)0x4001244C)		//ADC1�ĵ�ַ

//��ʼ��ADC-PA0����
															   
void  Adc_Init(void)
{ 	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	  //ʹ��GPIOAʱ��

	//PA6 ��Ϊģ��ͨ����������   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;//�����ѹ��NTC��T12���¶ȼ������
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStructure);  
	
	
	GPIO_InitStructure.GPIO_Pin = SLEEP_Pin;//�񶯿�������
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(SLEEP_GPIO_Port, &GPIO_InitStructure);  
	
	ADC_InitTypeDef ADC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	  //ʹ��ADC1ͨ��ʱ��
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);				//����ADCʱ�ӣ�ΪPCLK2��6��Ƶ����12MHz
	
	ADC_DeInit(ADC1);  //��λADC1 
	
	//ADC1��ʼ��
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 			//����ADCģʽ
	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��ָ���IJ�����ʼ������ADCx�ļĴ���  
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);		//����ADC1ͨ��2Ϊ239.5����������
	ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5);		//����ADC1ͨ��4Ϊ239.5����������
	ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_239Cycles5);		//����ADC1ͨ��6Ϊ239.5���������� 
	
	ADC_Cmd(ADC1, ENABLE);	//ʹ��ָ����ADC1
 
	ADC_ResetCalibration(ADC1);				//��λУ׼�Ĵ���
	while(ADC_GetResetCalibrationStatus(ADC1));				//�ȴ�У׼�Ĵ�����λ���
 
	ADC_StartCalibration(ADC1);				//ADCУ׼
	while(ADC_GetCalibrationStatus(ADC1));				//�ȴ�У׼���
//	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//ʹ��ָ����ADC1������ת����������
}

//���ADCֵ
//ch:ͨ��ֵ 0~9
u16 Get_Adc(u8 ch)   
{
  	//����ָ��ADC�Ĺ�����ͨ����һ�����У�����ʱ��
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADCͨ��,����ʱ��Ϊ239.5������	
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//ʹ��ָ����ADC1������ת����������	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//�ȴ�ת������
	return ADC_GetConversionValue(ADC1);	//�������һ��ADC1�������ת�����
}

//ch:ͨ��ֵ 0~9������times�κ�����ֵ�˲�
u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_us(5);
	}
	return temp_val/times;
}

/*����˵������Arduino,��һ�����ִ�һ����Χ����ӳ�䵽��һ����Χ
Ҳ����˵��fromLow��ֵ��ӳ�䵽toLow��fromlhigh��toHigh��ֵ�ȵȡ�
*/
float map(float value,float fromLow,float fromHigh,float toLow,float toHigh)
{
	return ((value-fromLow)*(toHigh-toLow)/(fromHigh-fromLow)+toLow);
}
/*���ַ����������������е�������ȷ�����ֶ�Ӧ������
ipArray���������ֵ�����
start: ���ҵ���ʼ����0~len
end: ���ҵĽ�������start~len
value: Ҫ���ҵ���ֵ
*/
int SearchIndex(u16 ipArray[], int start, int end ,int  value)  //�����ַ���
{
	int middle = (start + end) / 2;
	if (middle == start)
		return middle;
	else if (value < ipArray[middle])  
		return SearchIndex(ipArray, start, middle, value);
	else
		return SearchIndex(ipArray, middle, end, value);
}
/*�������ܣ���ȡģ�����ţ�������ʾ��
  ͨ��ģ��ת������ѹ�ź�ת��Ϊ���ֱ�ʾ�����ǣ��������˶�Σ�������ǿ��Զ������ƽ��������������
  Ȼ��ʹ�ø�ƽ������������������ĵ��衣�˺󣬵������ڼ�������������¶ȡ�����¶�ת��Ϊ���϶ȡ�
  �йش˹��̵���ϸ��Ϣ��һ�����ۣ������allaboutcircuits.com���¡�
  ԭ��ͼ��
         3.3V ----====-------  | ---------====--------(GND)
                R_balance      |      R_thermistor 
                               | 
                             ADC����
*/ 
u16 get_NTC_temp(void)
{
  float rThermistor = 0; //������������ĵ���ֵ
  float tKelvin = 0; //�Կ������¶ȱ����¶�
  float tCelsius = 0; //�������¶ȱ����¶�
	NTC_Average = Get_Adc(6);
  /*��ʽ������������ĵ��衣*/ 
  rThermistor = balanceR * NTC_Average/(ADC_max - NTC_Average); 
  tKelvin =(beta * roomTemp)/(beta +(roomTemp * log(rThermistor / roomTempR)));  
  tCelsius = tKelvin  -  273.15; //��������ת��Ϊ�����¶�
  return tCelsius;//�����϶ȷ����¶�
}
//��ȡ�����ѹֵ
void get_Vin(void)
{
	VinVolt = 11*3.3*Get_Adc(2)/4095;//��ȡ���ŵIJ���ֵ
}

//��ȡ���ŵ�ADC����ֵ
void get_T12_ADC(void)
{
	u16 nowADC;
	TIM_SetCompare1(TIM2,0); //��ֹͣ����
	delay_us(500);//�ȴ���ѹ�ȶ�
	nowADC = Get_Adc(4);//��ȡ���ŵIJ���ֵ
	if(nowADC<4060) T12_Average = nowADC;
	TIM_SetCompare1(TIM2,uk);//��������
}
//��ȡ�ȵ�ż�ĵ�ѹ�����ݷֶȱ�ת��Ϊ�¶�
u16 get_T12_temp(void)
{
	u16 CurrentTemp=0;
	get_T12_ADC();
	if(T12_Average < TEMP100) CurrentTemp = (u16)map (T12_Average,21,TEMP100, 0, 100);
	else if(T12_Average < TEMP200) CurrentTemp = (u16)map (T12_Average,TEMP100,TEMP200, 100, 200);
	else if(T12_Average < TEMP300) CurrentTemp = (u16)map (T12_Average,TEMP200,TEMP300, 200, 300);
	else CurrentTemp = (u16)map (T12_Average,TEMP300,TEMP420, 300, 420);
//	printf("�¶�:%d\r\n",CurrentTemp);
	return CurrentTemp;//�����϶ȷ����¶�
}
//��ȡ�񶯿��ص�״̬
u16 sleepCheck(void)
{
	u16 nowSleep;
	nowSleep = SLEEP;
	if(nowSleep==0)
	{
		sleepFlag = 0;//�ر�˯��ģʽ
		sleepCount = 0;
		shutCount = 0;
	}
	return nowSleep;
}