R1UWaterRS485/app/UWater_pt_app.c

390 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifdef __cplusplus
extern "C"
{
#endif
#include "type.h"
#include "UWater_pt_app.h"
#include "UWater_gpio_driver.h"
#include "UWater_timer1uS_driver.h"
#include "UWater_adc_driver.h"
#include "UWater_gp22_app.h"
#include "UWater_frame_app.h"
#include "UWater_sys.h"
#include "sys_processor.h"
static float s_g_temp_value = 20;//上电默认20℃
static u32 s_temp_adc_result = 0;
static u8 s_temp_adc_if_done = 0;
static u32 s_pt_tickstart = 0;
//static u32 s_temp_adc_arr[PT_FILTER_NUM]; //20181025 去掉滑动滤波
//static u8 s_pt_arr_sub = 0; //20181025 去掉滑动滤波
static u8 s_g_temp_machine_state_num = TEMP_S0; // 电源电压检测处理机状态号
//static float s_g_temp_value_last = 0;
static float s_g_temp_value_now;
float Temp_cal(float temp_result);
#if (TEMP_RM)//用热敏电阻
#else //用IC温度传感器
static float s_g_temp_voltage;
static float s_g_temp_result;
static float s_g_temp_error;
#endif
extern float temp_calculate_last;//获取温度数据
/***************************************************************
函数名称: u32 PtFilterJunZhi(u32 *data, u8 data_len)
功 能:中值 + 算数平均滤波
参 数u32 *data 需要进行处理的数据数组地址
返回值 :滤波完成后的值
****************************************************************/
//static u32 PtFilterJunZhi(u32 *data, u8 data_len) //20181025 去掉滑动滤波
//{
// u8 i, j, len, count;
// u32 *p;
// u32 temp = 0, sum = 0;
// p = data;
// len = data_len;
// for (j = 0; j < len - 1; j++)
// {
// for (i = 0; i < len - 1 - j; i++)
// {
// if (p[i] > p[i + 1])
// {
// temp = p[i];
// p[i] = p[i + 1];
// p[i + 1] = temp;
// }
// }
// }
// for (count = 2; count < len - 2; count++)
// {
// sum += p[count];
// }
// return (sum / (len - 4));
//}
/***********************温度传感器供电***************************
Function:
Description:
Input:
Return:
Others:
****************************************************************/
void TempADCPowEnable(void)
{
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_SET);//高
}
void TempADCPowDisable(void)
{
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//低
}
/************************************************
Function: u8 TempStartTaskApp(void)
Description: 启动温度测量
Input:
return: 0 启动失败 1 启动成功
Others:
*************************************************/
u8 TempStartTaskApp(void)
{
if((s_g_temp_machine_state_num == TEMP_S0)&&(FixedTimeNbIoTUploadIfIdle() == TASK_IDLE))
{
TempADCPowEnable();
s_pt_tickstart = Timer1usGetTick(); //power on delay
s_g_temp_machine_state_num = TEMP_S2;
return 1;
}
else
return 0;
}
/************************************************
Function: float TempCheckValueApp(void)
Description: 查询温度数据
Input:
return: 温度数据
Others:
*************************************************/
float TempCheckValueApp(void)
{
#if WENDU_FANSUAN_OPEN
s_g_temp_value = temp_calculate_last;//反算温度的实时数值
#else
if(s_g_temp_value > 90)
{
s_g_temp_value = 36;
}
else if(s_g_temp_value < -30)
{
s_g_temp_value = -1;
}
#endif
return s_g_temp_value;
}
void TempInitApp(void)
{
//// u8 i; //20181025 去掉滑动滤波
s_g_temp_machine_state_num = TEMP_S0;
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
//PF7
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->驱动能力
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
Gpio_Init(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, &stcGpioCfg);
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//输出低电平
#if WENDU_FANSUAN_OPEN
#else
TempStartTaskApp();//上电就立马启动温度采集 添加原因表计复位后非检定6s才启动温度采集导致前6s的温度值是0
#endif
}
/************************************************
Function: TempPreSleep()
Description: 休眠前处理函数
Input:
return:
Others:
*************************************************/
void TempPreSleep(void)
{
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//低
}
/************************************************
Function: TempWakeSleep()
Description: 唤醒处理函数
Input:
return:
Others:
*************************************************/
void TempWakeSleep(void)
{
; //空
}
u8 TempIfSleepApp(void)
{
if(s_g_temp_machine_state_num == TEMP_S0)
return TRUE;
else
return FALSE;
}
void TempMachineApp(void)
{
switch (s_g_temp_machine_state_num)
{
case TEMP_S0:
{
break;
}
case TEMP_S1:
{
if(Timer1usGetTick() - s_pt_tickstart > POWER_ON_DELAY)
{
s_g_temp_machine_state_num = TEMP_S2;
}
break;
}
case TEMP_S2:
{
if(TASK_IDLE == AdcIfIdle()) //温度
{
// AdcStartConvert(T_CHECK_ADC, T_CHECK_CHANNEL, T_CHECK_NUM ,T_CHECK_INTERVAL,&s_temp_adc_arr[s_pt_arr_sub],&s_temp_adc_if_done);
AdcStartConvert(T_CHECK_CHANNEL, T_CHECK_NUM ,T_CHECK_INTERVAL,&s_temp_adc_result,&s_temp_adc_if_done);//20181025 去掉滑动滤波
s_g_temp_machine_state_num = TEMP_S3;
}
break;
}
case TEMP_S3:
{
if (TRUE == s_temp_adc_if_done)
{
if (ADC_OK == AdcGetStatus())
{
#if (TEMP_RM)//用热敏传感器
if(s_temp_adc_result>TEMP_SEGMENT_SMALL)
{
s_g_temp_value_now = (float)0.000000004785*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result -(float)0.0000595*s_temp_adc_result*s_temp_adc_result + (float)0.2187*s_temp_adc_result -(float)247.9;//温度传感器建模-20~3
s_g_temp_value_now = s_g_temp_value_now - (float)0.7;
}
else if(s_temp_adc_result>TEMP_SEGMENT_MIDDLE)
{
s_g_temp_value_now = (float)-0.000000002058*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result + (float)0.00001525*s_temp_adc_result*s_temp_adc_result - (float)0.05455*s_temp_adc_result + (float)82.24;//3~43
}
else
{
s_g_temp_value_now = (float)-0.00000005296*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result + (float)0.0001457*s_temp_adc_result*s_temp_adc_result - (float)0.1697*s_temp_adc_result + (float)117.5;//43度以上
}
#else
// s_g_temp_value_now = s_g_temp_result;
// s_temp_adc_result = PtFilterJunZhi(s_temp_adc_arr, PT_FILTER_NUM); //滑动平均滤波
// s_pt_arr_sub++;
// s_pt_arr_sub %= PT_FILTER_NUM;
//根据temp_adc_result计算温度值曲线
// s_g_temp_voltage = ((float)s_g_temp_result)*1.2/10000.0/TMEP_NUM;
// s_g_temp_voltage = (s_g_temp_voltage - 0.5)/0.01;
// s_g_temp_error = 0.000244*(125 - s_g_temp_voltage)*(s_g_temp_voltage +40) - 2;
s_g_temp_voltage = (float)250*s_temp_adc_result/(float)4095; //放大100倍
s_g_temp_result = s_g_temp_voltage;
if(s_g_temp_result >= 50)
{
s_g_temp_result -= 50;
s_g_temp_voltage = s_g_temp_result;
if(s_g_temp_result < 125)
{
s_g_temp_result = (125 - s_g_temp_result) * (s_g_temp_result + 40);
s_g_temp_result = s_g_temp_result * (float)0.000244;
s_g_temp_error = s_g_temp_result - 2;
}
else
{
s_g_temp_error = 0;
}
}
else
{
s_g_temp_result = 50 - s_g_temp_result;
s_g_temp_voltage = - s_g_temp_result;
if(s_g_temp_result >= 40)
{
s_g_temp_result = (125 + s_g_temp_result) * (40 - s_g_temp_result );
s_g_temp_result = s_g_temp_result * (float)0.000244;
s_g_temp_error = s_g_temp_result - 2;
}
else
{
s_g_temp_error = 0;
}
}
s_g_temp_value_now = s_g_temp_voltage - s_g_temp_error;
#endif
// if(s_g_temp_value_last == 0)
// {
// ;
// }
// else if(s_g_temp_value_now >= s_g_temp_value_last)
// {
// if((s_g_temp_value_now - s_g_temp_value_last) > 1)
// {
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
// }
// else
// {
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
// }
// }
// else
// {
// if((s_g_temp_value_last - s_g_temp_value_now) > 1)
// {
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
// }
// else
// {
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
// }
// }
// s_g_temp_value_last = s_g_temp_value_now;
s_g_temp_value = Temp_cal(s_g_temp_value_now);
}
TempADCPowDisable();
s_g_temp_machine_state_num = TEMP_S0;
}
break;
}
default:
break;
}
}
float Temp_cal(float temp_result)
{
// float temp = temp_result ;
float temp;
u32 heat_temp = FrameCheckParaApp(FramePara_Tc0);
if(heat_temp >= 0x80000000)
{
heat_temp &= 0x7FFFFFFF;
temp = temp_result - Gp30DataToFloat(heat_temp);
}
else
{
temp = temp_result + Gp30DataToFloat(heat_temp);
}
#if (TEMP_RM)//热敏电阻
#else//IC传感器才生效
if(temp >= (float)23)
{
temp += (float)0.2;
}
else if(temp > 15)
{
}
else if(temp >= (float)8.5)
{
// temp -= (float)0.3;
}
else
{
temp -= (float)(0.55 );
}
// if(temp <= 0)
// {
// temp = temp*(-1);
// heat_temp = FloatToGp30Data(temp);
// heat_temp = heat_temp|0x80000000;
// return heat_temp;
// }
// else
// {
// return FloatToGp30Data(temp);
// }
#endif
return (temp);
}
#ifdef __cplusplus
}
#endif //#ifdef __cplusplus