/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：ntc.c
 * 描  述  ：NTC热敏电阻温度传感器处理程序 
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/04/30
*********************************************************************************/
#include "ntc.h"
#include "my_math.h"
#include "timer.h"
#include "ntc_10K_tab.h"

#define ADC_SIZE 20					      						//一次采集几次AD值
#define FILTER_SIZE 10					  						//滤波深度

uint16_t adc_buf[ADC_SIZE]; 		              //用于ADC采集缓存数据
		
uint16_t NTC1_value = 0;											
uint16_t NTC2_value = 0; 
uint16_t NTC3_value = 0;	  									//各通道采集处理后的数值
					
uint8_t temperature = 0;											//温度
uint8_t temperature_A = 0;										//A路温度
uint8_t temperature_B = 0;										//B路温度
uint8_t temperature_C = 0;										//C路温度

uint8_t fanRunningStatus = 0;									//风扇运转状态


/*
***********************************************************************
*	函 数 名: data_input
*	功能说明: 采集n次数据并对其进行排序后求平均数处理	
*	形    参：
*       		x[]:需要处理的数组
*						n:  采集的次数
*						ch: 需采集的通道
*	返 回 值: 无
***********************************************************************
*/
uint16_t data_input(uint16_t *p, uint16_t n, uint8_t ch)
{
	uint16_t x;
	Data_collection(p, n, ch);			//连续采集n次数据,暂存到P指定的地方
	sort_16(p, n);           				//对存在缓存中的采集数据进行排序
	x = average_16(p, n, 2);				//去掉头和尾后，求平均数
	return x;
}

/*
***********************************************************************
*	函 数 名: filter
*	功能说明: 数据滤波处理			
*	形    参：
*       		value -> 需要滤波的值
*						ch -> 需采集的通道
*	返 回 值: 滤波后的结果
***********************************************************************
*/
uint16_t filter(uint16_t value, uint8_t ch) 
{ 
	uint8_t count=0; 
	uint16_t new_value; 
	new_value = data_input(adc_buf, ADC_SIZE, ch);   
	while (value != new_value)
	{ 
		count++; 
		if (count >= FILTER_SIZE) return new_value; 
		new_value = data_input(adc_buf, ADC_SIZE, ch);
	} 
	return value; 
}

/*
***********************************************************************
*	函 数 名: Get_NTC_values
*	功能说明: 获取AD8,AD9采集处理后的数据
*	形    参：	          
*	返 回 值: 
***********************************************************************
*/
void Get_NTC_values(void)
{
	NTC1_value = filter(NTC1_value, ADC_Channel_10);
// 	NTC2_value = filter(NTC2_value, ADC_Channel_15);
	NTC3_value = filter(NTC3_value, ADC_Channel_0);
// 	printf("\r\nNTC1_value = %d  NTC2_value = %d\r\n", NTC1_value, NTC2_value);
}

/*
***********************************************************************
*	函 数 名: GetTemperatureTask
*	功能说明: 温度采集任务
*	形    参：无	          
*	返 回 值: 无
***********************************************************************
*/
void GetTemperatureTask(void)
{
	uint8_t i;
	
	static timer getTemperatureTimer;					//距离采集时间间隔
	static timer waitingTimer;
	
	static uint8_t timer_ok = 0;
	if(timer_ok == 0)
	{
		timer_ok = 1;
		timer_set(&getTemperatureTimer, CLOCK_SECOND*3);
		timer_set(&waitingTimer, CLOCK_SECOND*10);
	}
	
	if(timer_expired(&getTemperatureTimer))		//每10S采集一次温度
	{
		timer_restart(&getTemperatureTimer);
		Get_NTC_values();
		
		if(NTC1_value > 2548){									//当ADC值大于2548时表明0度以下，当0处理
			temperature_A = 0;
		}else if(NTC1_value < 133){							//当ADC值小于133时表明100度以上，当100处理
			temperature_A = 100;
		}else{
			for(i = 0; i < 100; i++)
			{
				if(NTC1_value >= TabNTC_10K[i])break;
			}
			temperature_A = i;
		}
		
// 		if(NTC2_value > 2548){									//当ADC值大于2548时表明0度以下，当0处理
// 			temperature_B = 0;
// 		}else if(NTC2_value < 133){							//当ADC值小于133时表明100度以上，当100处理
// 			temperature_B = 100;
// 		}else{
// 			for(i = 0; i < 100; i++)
// 			{
// 				if(NTC2_value >= TabNTC_10K[i])break;
// 			}
// 			temperature_B = i;
// 		}
		
		if(NTC3_value > 2548){									//当ADC值大于2548时表明0度以下，当0处理
			temperature_C = 0;
		}else if(NTC3_value < 133){							//当ADC值小于133时表明100度以上，当100处理
			temperature_C = 100;
		}else{
			for(i = 0; i < 100; i++)
			{
				if(NTC3_value >= TabNTC_10K[i])break;
			}
			temperature_C = i;
		}
		
		temperature = temperature_C;
		
// 		if(temperature_A > temperature_B){
// 			temperature = temperature_A;
// 		}else{
// 			temperature = temperature_B;
// 		}
// 		
// 		if(temperature < temperature_C)
// 		{
// 			temperature = temperature_C;
// 		}
		
// 		if((temperature_A > 0) || (temperature_B > 0) || (temperature_C > 0))
// 		{
// 			printf("\r\n温度：No1 = %2.1f ℃, No2 = %2.1f ℃, No3 = %2.1f ℃, Out = %2.1f ℃\r\n", (float)temperature_A, (float)temperature_B, (float)temperature_C, (float)temperature);
// 		}
		
// 		printf("\r\n主板温度：%2.1f ℃, %2.1f ℃,\r\n", (float)temperature_C, (float)temperature_A);
		
	}
	
	if(timer_expired(&waitingTimer))
	{
		timer_restart(&waitingTimer);
		
		printf("\r\n温度：%2.1f ℃, %2.1f ℃,\r\n", (float)temperature_C, (float)temperature_A);
	}
}

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