R1UWaterRS485/app/UWater_pt_app.c

390 lines
10 KiB
C
Raw Permalink Normal View History

2024-06-03 15:49:39 +08:00
#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;//<2F>ϵ<EFBFBD>Ĭ<EFBFBD><C4AC>20<32><30>
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 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
//static u8 s_pt_arr_sub = 0; //20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
static u8 s_g_temp_machine_state_num = TEMP_S0; // <20><>Դ<EFBFBD><D4B4>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><E2B4A6><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
//static float s_g_temp_value_last = 0;
static float s_g_temp_value_now;
float Temp_cal(float temp_result);
#if (TEMP_RM)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#else //<2F><>IC<49>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>
static float s_g_temp_voltage;
static float s_g_temp_result;
static float s_g_temp_error;
#endif
extern float temp_calculate_last;//<2F><>ȡ<EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
/***************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: u32 PtFilterJunZhi(u32 *data, u8 data_len)
<EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ֵ + <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>u32 *data <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ <EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD>ֵ
****************************************************************/
//static u32 PtFilterJunZhi(u32 *data, u8 data_len) //20181025 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
//{
// 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));
//}
/***********************<2A>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>***************************
Function:
Description:
Input:
Return:
Others:
****************************************************************/
void TempADCPowEnable(void)
{
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_SET);//<2F><>
}
void TempADCPowDisable(void)
{
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//<2F><>
}
/************************************************
Function: u8 TempStartTaskApp(void)
Description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD><EFBFBD>
Input:
return: 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
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: <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Input:
return: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Others:
*************************************************/
float TempCheckValueApp(void)
{
#if WENDU_FANSUAN_OPEN
s_g_temp_value = temp_calculate_last;//<2F><><EFBFBD><EFBFBD><EFBFBD>¶ȵ<C2B6>ʵʱ<CAB5><CAB1>ֵ
#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 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
s_g_temp_machine_state_num = TEMP_S0;
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
//PF7
stcGpioCfg.enDir = GpioDirOut; ///< <20>˿ڷ<CBBF><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD>
stcGpioCfg.enDrv = GpioDrvL; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enPu = GpioPuDisable; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><>
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; ///< <20>˿ڿ<CBBF>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
stcGpioCfg.enCtrlMode = GpioAHB; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>->AHB
Gpio_Init(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, &stcGpioCfg);
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ
#if WENDU_FANSUAN_OPEN
#else
TempStartTaskApp();//<2F>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ȳɼ<C8B2> <20><><EFBFBD><EFBFBD>ԭ<EFBFBD>򣺱<EFBFBD><F2A3BAB1>Ƹ<EFBFBD>λ<EFBFBD>󣬷Ǽ춨6s<36><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ȳɼ<C8B2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ6s<36><73><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0
#endif
}
/************************************************
Function: TempPreSleep()
Description: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Input:
return:
Others:
*************************************************/
void TempPreSleep(void)
{
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//<2F><>
}
/************************************************
Function: TempWakeSleep()
Description: <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Input:
return:
Others:
*************************************************/
void TempWakeSleep(void)
{
; //<2F><>
}
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()) //<2F><EFBFBD>
{
// 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 ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>
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)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;//<2F>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ-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<34><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
#else
// s_g_temp_value_now = s_g_temp_result;
// s_temp_adc_result = PtFilterJunZhi(s_temp_adc_arr, PT_FILTER_NUM); //<2F><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>˲<EFBFBD>
// s_pt_arr_sub++;
// s_pt_arr_sub %= PT_FILTER_NUM;
//<2F><><EFBFBD><EFBFBD>temp_adc_result<6C><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
// 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; //<2F>Ŵ<EFBFBD>100<30><30>
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)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#else//IC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
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