编辑代码

#include <stdio.h>
#include <string.h>

#define CAL_OBJVT_MAX_NUM 3

typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;

typedef struct
{
	int16_t cal_1_objt_s16;
	int16_t cal_2_objt_s16;
	int16_t cal_3_objt_s16;
	int16_t cal_4_objt_s16;
	int16_t cal_5_objt_s16;
	int16_t cal_6_objt_s16;
	int16_t cal_7_objt_s16;
	int16_t cal_8_objt_s16;
	int32_t cal_1_objv_s32;
	int32_t cal_2_objv_s32;
	int32_t cal_3_objv_s32;
	int32_t cal_4_objv_s32;
	int32_t cal_5_objv_s32;
	int32_t cal_6_objv_s32;
	int32_t cal_7_objv_s32;
	int32_t cal_8_objv_s32;
} OBJVCOR;

OBJVCOR sys_obj_gs;
OBJVCOR sys_objvcor_gs;
OBJVCOR sysrwbuf_gu;
int16_t objvzerot_gs16;
int32_t objvzerov_gs32;
uint16_t sys_datatemp_gu16;
int32_t sys_datatemp_gs32;

int16_t data_getobjtemp(int16_t ambtemp_s16,int32_t objv_s32)
{
	uint8_t i = 0;
	uint8_t j = 0;

	int16_t *ecalt_ps16 = (int16_t *)&sys_objvcor_gs.cal_1_objt_s16; //指向校准值

	int32_t *ecalv_ps32 = (int32_t *)&sys_objvcor_gs.cal_1_objv_s32; //指向校准值

	int32_t *icalv_ps32 = (int32_t *)&sysrwbuf_gu.cal_1_objv_s32; //指向内部结构体指针校准值
	/*
	*数据获取原理:当环境温度和对象温度相等时,对象电压理想状态下始终相等且为定值,可根据此定值按照斜率关系求出已打点
	*             的值在实测环境温度下的打点值,进而推算出当前对象电压对应的对象温度值
	*/

    //获取校准点的值
	memcpy(&sys_objvcor_gs,&sys_obj_gs,sizeof(OBJVCOR));
#if 1
	//计算当前环境温度相对应的对象温度在打点温度值的哪个区间
	for (i = 0; i < CAL_OBJVT_MAX_NUM; i++) //共有8个打点区间//打点数超过2的时候使用
	{
		if (ambtemp_s16 < ecalt_ps16[i])
			break;
	}
	if (i == 0)
	{
		icalv_ps32[0] = objvzerov_gs32 - (int32_t)(ecalv_ps32[1] - ecalv_ps32[0]) * (int32_t)(ambtemp_s16 - ecalt_ps16[0]) / (int32_t)(ecalt_ps16[1] - ecalt_ps16[0]);

		for (i = 0; i < CAL_OBJVT_MAX_NUM-1; i++)
		{
			icalv_ps32[i + 1] = icalv_ps32[i] - (ecalv_ps32[i] - ecalv_ps32[i + 1]);
		}
	}
	else if (i == CAL_OBJVT_MAX_NUM)
	{
		icalv_ps32[CAL_OBJVT_MAX_NUM-1] = objvzerov_gs32 - (int32_t)(ecalv_ps32[CAL_OBJVT_MAX_NUM-1] - ecalv_ps32[CAL_OBJVT_MAX_NUM-2]) * (int32_t)(ambtemp_s16 - ecalt_ps16[CAL_OBJVT_MAX_NUM-1]) / (int32_t)(ecalt_ps16[CAL_OBJVT_MAX_NUM-1] - ecalt_ps16[CAL_OBJVT_MAX_NUM-2]);

		for (i = CAL_OBJVT_MAX_NUM-1; i > 0; i--)
		{
			icalv_ps32[i - 1] = icalv_ps32[i] - (ecalv_ps32[i] - ecalv_ps32[i - 1]);
		}
	}
	else
	{
		icalv_ps32[i] = objvzerov_gs32 - (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]) * (int32_t)(ambtemp_s16 - ecalt_ps16[i]) / (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]);

		for (j = i; j > 0; j--)
		{
			icalv_ps32[j - 1] = icalv_ps32[j] - (ecalv_ps32[j] - ecalv_ps32[j - 1]);
		}

		for (j = i; j < CAL_OBJVT_MAX_NUM-1; j++)
		{
			icalv_ps32[j + 1] = icalv_ps32[j] - (ecalv_ps32[j] - ecalv_ps32[j + 1]);
		}
	}

	memcpy(ecalv_ps32, icalv_ps32, 32); //将内部运算出来的校准数据进行迁移到外部运算

    for(i = 0;i < 8;i++)
    {
        printf("%d:%d\n",ecalt_ps16[i],ecalv_ps32[i]);
    }
    printf("\n");

	//计算当前环境下对象电压对应的温度值
	for (i = 0; i < CAL_OBJVT_MAX_NUM; i++) //共有8个打点区间
	{
		if (objv_s32 < ecalv_ps32[i])
			break;
	}

	if (i == 0)
	{
		sys_datatemp_gs32 = (int32_t)ecalt_ps16[0] - (int32_t)(ecalt_ps16[0] - ecalt_ps16[1]) * (int32_t)(ecalv_ps32[0] - objv_s32) / (int32_t)(ecalv_ps32[0] - ecalv_ps32[1]);
	}
	else if (i == CAL_OBJVT_MAX_NUM)
	{
		sys_datatemp_gs32 = (int32_t)ecalt_ps16[CAL_OBJVT_MAX_NUM-1] - (int32_t)(ecalt_ps16[CAL_OBJVT_MAX_NUM-1] - ecalt_ps16[CAL_OBJVT_MAX_NUM-2]) * (int32_t)(ecalv_ps32[CAL_OBJVT_MAX_NUM-1] - objv_s32) / (int32_t)(ecalv_ps32[CAL_OBJVT_MAX_NUM-1] - ecalv_ps32[CAL_OBJVT_MAX_NUM-2]);
	}
	else
	{
		sys_datatemp_gs32 = (int32_t)ecalt_ps16[i] - (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]) * (int32_t)(ecalv_ps32[i] - objv_s32) / (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]);
	}
#else
	//计算当前环境温度相对应的对象温度在打点温度值的哪个区间
	for (i = 0; i < CAL_OBJVT_MAX_NUM; i++) //共有8个打点区间//打点数超过2的时候使用
	{
		if (ambtemp_s16 < ecalt_ps16[i])
			break;
	}

	if (i == 0)
	{
		i = 1;
	}
	else if (i == CAL_OBJVT_MAX_NUM)
	{
		i = CAL_OBJVT_MAX_NUM - 1;
	}
	sys_datatemp_gs32 = objvzerov_gs32 - (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]) * (int32_t)(ambtemp_s16 - objvzerot_gs16) / (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]);
	sys_datatemp_gs32 = sys_datatemp_gs32 - objvzerov_gs32; //计算零点偏差
	for(i = 0;i < CAL_OBJVT_MAX_NUM;i++)
	{
		icalv_ps32[i] = ecalv_ps32[i] + sys_datatemp_gs32; //每个校准点补上零点偏差
	}

	memcpy(ecalv_ps32, icalv_ps32, 32); //将内部运算出来的校准数据进行迁移到外部运算

    for(i = 0;i < 8;i++)
    {
        printf("%d:%d\n",ecalt_ps16[i],ecalv_ps32[i]);
    }
    printf("\n");

	//计算当前环境下对象电压对应的温度值
	for (i = 0; i < CAL_OBJVT_MAX_NUM; i++) //共有8个打点区间
	{
		if (objv_s32 < ecalv_ps32[i])
			break;
	}
	if (i == 0)
	{
		i = 1;
	}
	else if (i == CAL_OBJVT_MAX_NUM)
	{
		i = CAL_OBJVT_MAX_NUM - 1;
	}
	sys_datatemp_gs32 = (int32_t)ecalt_ps16[i] - (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]) * (int32_t)(ecalv_ps32[i] - objv_s32) / (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]);
#endif

    return sys_datatemp_gs32;
}

int main(void)
{
	int16_t *calt_ps16 = (int16_t *)&sys_obj_gs.cal_1_objt_s16; //指向校准值
	int32_t *calv_ps32 = (int32_t *)&sys_obj_gs.cal_1_objv_s32; //指向校准值
    uint8_t i;
    int16_t temp;

#if 0
    sys_obj_gs.cal_1_objt_s16 = 250;
    sys_obj_gs.cal_1_objv_s32 = 0;
    sys_obj_gs.cal_2_objt_s16 = 320;
    sys_obj_gs.cal_2_objv_s32 = 620;
    sys_obj_gs.cal_3_objt_s16 = 370;
    sys_obj_gs.cal_3_objv_s32 = 1083;
    sys_obj_gs.cal_4_objt_s16 = 370;
    sys_obj_gs.cal_4_objv_s32 = 0;
    sys_obj_gs.cal_5_objt_s16 = 370;
    sys_obj_gs.cal_5_objv_s32 = 0;
    sys_obj_gs.cal_6_objt_s16 = 370;
    sys_obj_gs.cal_6_objv_s32 = 0;
    sys_obj_gs.cal_7_objt_s16 = 370;
    sys_obj_gs.cal_7_objv_s32 = 0;
    sys_obj_gs.cal_8_objt_s16 = 370;
    sys_obj_gs.cal_8_objv_s32 = 0;
#else
    sys_obj_gs.cal_1_objt_s16 = 250;
    sys_obj_gs.cal_1_objv_s32 = 174;
    sys_obj_gs.cal_2_objt_s16 = 320;
    sys_obj_gs.cal_2_objv_s32 = 803;
    sys_obj_gs.cal_3_objt_s16 = 370;
    sys_obj_gs.cal_3_objv_s32 = 1271;
    sys_obj_gs.cal_4_objt_s16 = 370;
    sys_obj_gs.cal_4_objv_s32 = 0;
    sys_obj_gs.cal_5_objt_s16 = 370;
    sys_obj_gs.cal_5_objv_s32 = 0;
    sys_obj_gs.cal_6_objt_s16 = 370;
    sys_obj_gs.cal_6_objv_s32 = 0;
    sys_obj_gs.cal_7_objt_s16 = 370;
    sys_obj_gs.cal_7_objv_s32 = 0;
    sys_obj_gs.cal_8_objt_s16 = 370;
    sys_obj_gs.cal_8_objv_s32 = 0;
#endif
    objvzerot_gs16 = sys_obj_gs.cal_1_objt_s16;
    objvzerov_gs32 = sys_obj_gs.cal_1_objv_s32;

    temp = data_getobjtemp(370,-942);
    printf("temp:%d\n\n",temp);

    for (i = 0; i < CAL_OBJVT_MAX_NUM; i++) //共有8个打点区间//打点数超过2的时候使用
	{
        calv_ps32[i] = calv_ps32[i] - objvzerov_gs32;
	}
    objvzerot_gs16 = sys_obj_gs.cal_1_objt_s16;
    objvzerov_gs32 = sys_obj_gs.cal_1_objv_s32;
    for(i = 0;i < 8;i++)
    {
        printf("*%d:%d\n",calt_ps16[i],calv_ps32[i]);
    }
    printf("\n");

    temp = data_getobjtemp(370,-942);
    printf("temp:%d\n\n",temp);

    return 0;
}