sggt/App/APP_WU/Src/apps_gather.c

859 lines
20 KiB
C
Raw 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.

#include "apps_gather.h" //用于头文件打包汇总,函数声明和变量定义
// lv_conf.h { line:282->CPU&FPS; line:289->MEM used }
OPERATIONS current_operation;
PHYSICAL_QUANTITY VOL[2]; //电压VOL[0]-V, VOL[1]-mV
PHYSICAL_QUANTITY CUR; //电流mA
PHYSICAL_QUANTITY RES; //电阻,Ω
PHYSICAL_QUANTITY FRE; //频率KHz
PHYSICAL_QUANTITY TC[8]; //热电偶共8种
PHYSICAL_QUANTITY RTD; //热电阻
SYSTEM_STATUS_WATCH system_sts; //系统状态监控
SIG_TRANSMISSION sig_trans = TRANS_NONE; //通讯模式
// 热电偶真值表电压mV
// 行:[0,7]->[K, S, N, B, E, J, R, T],列:[0,10]->[mV_Tmin,...,mV_Tmax](均分成10个间隔11个端点)
static float32 TC_TABLE_MV[8][11] =
{
{-6.458, -3.734, 2.354, 9.061, 15.849, 22.819, 29.757, 36.484, 42.980, 49.130, 54.886},
{-0.236, 0.888, 2.451, 4.184, 6.034, 7.992, 10.063, 12.228, 14.421, 16.611, 18.693},
{-4.345, -2.672, 1.174, 5.946, 11.428, 17.323, 23.428, 29.592, 35.714, 41.713, 47.513},
{0.000, 0.144, 0.647, 1.483, 2.625, 4.041, 5.702, 7.567, 9.593, 11.708, 13.820},
{-9.835, -7.021, -0.925, 7.066, 16.269, 26.154, 36.358, 46.624, 56.764, 66.705, 76.373},
{-8.095, -3.300, 3.757, 11.501, 19.311, 27.113, 35.230, 44.010, 52.996, 61.415, 69.553},
{-0.226, 0.895, 2.538, 4.417, 6.472, 8.685, 11.052, 13.549, 16.097, 18.654, 21.101},
{-6.258, -5.650, -4.324, -2.444, -0.077, 2.687, 5.812, 9.235, 12.912, 16.802, 20.872}
};
//热电偶真值表,温度℃
// 行:[0,7]->[K, S, N, B, E, J, R, T],列:[0,10]->[Tmin,...,Tmax](均分成10个间隔11个端点)
static float32 TC_TABLE_TEMP[8][11] =
{
{-270.0, -105.8, 58.4, 222.6, 386.8, 551.0, 715.2, 879.4, 1043.6, 1207.8, 1372.0},
{-50.0, 131.8, 313.6, 495.4, 677.2, 859.0, 1040.8, 1222.6, 1404.4, 1586.2, 1768.0},
{-270.0, -113.0, 44.0, 201.0, 358.0, 515.0, 672.0, 829.0, 986.0, 1143.0, 1300.0},
{0.0, 182.0, 364.0, 546.0, 728.0, 910.0, 1092.0, 1274.0, 1456.0, 1638.0, 1820.0},
{-270.0, -143.0, -16.0, 111.0, 238.0, 365.0, 492.0, 619.0, 746.0, 873.0, 1000.0},
{-210.0, -69.0, 72.0, 213.0, 354.0, 495.0, 636.0, 777.0, 918.0, 1059.0, 1200.0},
{-50.0, 131.8, 313.6, 495.4, 677.2, 859.0, 1040.8, 1222.6, 1404.4, 1586.2, 1768.0},
{-270.0, -203.0, -136.0, -69.0, -2.0, 65.0, 132.0, 199.0, 266.0, 333.0, 400.0}
};
//热电阻真值表,温度℃
static float32 RTD_TABLE_TEMP[11] = {-200, -114, -28, 58, 144, 230, 316, 402, 488, 574, 660};
//热电阻真值表,电阻Ω
static float32 RTD_TABLE_OHM[11] = {18.52, 54.97, 89.01, 122.47, 155.08, 186.84, 217.74, 247.78, 276.97, 305.31, 332.79};
//热电偶数据初始化
void TC_init(void)
{
//热电偶K
TC[0].tag = SIG_TC;
TC[0].typ = TC_K;
TC[0].low = TC_TABLE_TEMP[0][0];
TC[0].up = TC_TABLE_TEMP[0][10];
TC[0].pv = 0;
//热电偶S
TC[1].tag = SIG_TC;
TC[1].typ = TC_S;
TC[1].low = TC_TABLE_TEMP[1][0];
TC[1].up = TC_TABLE_TEMP[1][10];
TC[1].pv = 0;
//热电偶N
TC[2].tag = SIG_TC;
TC[2].typ = TC_N;
TC[2].low = TC_TABLE_TEMP[2][0];
TC[2].up = TC_TABLE_TEMP[2][10];
TC[2].pv = 0;
//热电偶B
TC[3].tag = SIG_TC;
TC[3].typ = TC_B;
TC[3].low = TC_TABLE_TEMP[3][0];;
TC[3].up = TC_TABLE_TEMP[3][10];;
TC[3].pv = 0;
//热电偶E
TC[4].tag = SIG_TC;
TC[4].typ = TC_E;
TC[4].low = TC_TABLE_TEMP[4][0];
TC[4].up = TC_TABLE_TEMP[4][10];
TC[4].pv = 0;
//热电偶J
TC[5].tag = SIG_TC;
TC[5].typ = TC_J;
TC[5].low = TC_TABLE_TEMP[5][0];
TC[5].up = TC_TABLE_TEMP[5][10];
TC[5].pv = 0;
//热电偶R
TC[6].tag = SIG_TC;
TC[6].typ = TC_R;
TC[6].low = TC_TABLE_TEMP[6][0];
TC[6].up = TC_TABLE_TEMP[6][10];
TC[6].pv = 0;
//热电偶T
TC[7].tag = SIG_TC;
TC[7].typ = TC_T;
TC[7].low = TC_TABLE_TEMP[7][0];
TC[7].up = TC_TABLE_TEMP[7][10];
TC[7].pv = 0;
}
//物理量内容初始化
//底层数据,无法通过按键&菜单修改用户使用时仅修改tabdata里的变量
void physical_quantity_init(void)
{
VOL[0].tag = SIG_VOLTAGE;
VOL[0].typ = VOLTAGE_V;
VOL[0].low = 0;
VOL[0].up = 30;
VOL[0].pv = 0;
VOL[1].tag = SIG_VOLTAGE;
VOL[1].typ = VOLTAGE_MV;
VOL[1].low = -2500;
VOL[1].up = 2500;
VOL[1].pv = 0;
CUR.tag = SIG_CURRENT;
CUR.typ = CURRENT_MA;
CUR.low = 0;
CUR.up = 25;
CUR.pv = 0;
RES.tag = SIG_RESISTANT;
RES.typ = RESISTANT_OHM;
RES.low = 0;
RES.up = 4000;
RES.pv = 0;
FRE.tag = SIG_FREQUENCE;
FRE.typ = FREQUENCE_KHZ;
FRE.low = 0;
FRE.up = 100;
FRE.pv = 0;
TC_init();
RTD.tag = SIG_RTD;
RTD.typ = RTD_DC;
RTD.low = RTD_TABLE_TEMP[0];
RTD.up = RTD_TABLE_TEMP[10];
RTD.pv = 0;
}
void screen_run(void)
{
//手动触发显示内容复位
if(m5data.menu_reset_flag)
{
menu_reset();
m5data.menu_reset_flag = 0;
return;
}
if(m5data.scr_init_flag == 0)
{
//未播放过开机动画的情况下,播放开机动画
scr_init_run();
}
else
{
//播放过开机动画之后,跳转至主界面
switch (m5data.scr_now)
{
case SCREEN_MAIN:
{
scr_main_run(); //主界面显示
key_functions_main(); //主界面的按键功能
}
break;
case SCREEN_SETTING:
{
scr_setting_run(); //设置界面
key_functions_setting(); //设置界面的按键功能
}
break;
default:
break;
}
}
}
//通道选择与切换
void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type)
{
switch (io)
{
case IO_INPUT:
{
switch (type)
{
case VOLTAGE_MV:
{
mux_signal.channel = CH7_IN_MVOL;
}
break;
case VOLTAGE_V:
{
mux_signal.channel = CH6_IN_VOL;
}
break;
case CURRENT_MA:
{
mux_signal.channel = CH8_IN_CUR;
}
break;
case RESISTANT_OHM:
{
//与热电阻一致
mux_signal.channel = CH10_IN_RTD;
}
break;
case FREQUENCE_KHZ:
{
mux_signal.channel = CH9_IN_FRE;
}
break;
case TC_K:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_S:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_N:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_B:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_E:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_J:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_R:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case TC_T:
{
mux_signal.channel = CH11_IN_TC;
}
break;
case RTD_DC:
{
mux_signal.channel = CH10_IN_RTD;
}
break;
default:
break;
}
}
break;
case IO_OUTPUT:
{
switch (type)
{
case VOLTAGE_MV:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case VOLTAGE_V:
{
mux_signal.channel = CH0_OUT_VOL_V;
}
break;
case CURRENT_MA:
{
mux_signal.channel = CH2_OUT_CUR;
}
break;
case RESISTANT_OHM:
{
mux_signal.channel = CH4_OUT_RES;
}
break;
case FREQUENCE_KHZ:
{
mux_signal.channel = CH3_OUT_FRE;
}
break;
case TC_K:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_S:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_N:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_B:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_E:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_J:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_R:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case TC_T:
{
mux_signal.channel = CH1_OUT_VOL_MV;
}
break;
case RTD_DC:
{
mux_signal.channel = CH4_OUT_RES;
}
break;
default:
break;
}
}
break;
default:
break;
}
}
//更新设定值根据ON\OFF状态
void sig_sv_update(void)
{
switch (m5data.io_on2off)
{
case IO_ON:
{
mux_signal.data_sv = real2mux( get_output_value() );
}
break;
case IO_OFF:
{
mux_signal.data_sv = 0;
}
break;
default:
break;
}
}
//数据转换,将输入热电偶电压值转换为实际温度值℃
float32 tcmv2temp(SIG_FUNCTIONS_TYPE type, float32 mv)
{
float32 result_temp = 0;
uint8_t typ = 0, i = 0;
typ = (uint8_t)type;
typ -= 5; //[5,12]->[0,7]
float32 mv_left = 0, mv_right = 0;
float32 temp_left = 0, temp_right = 0;
for(i = 0; i < 10; i++)
{
if( ( TC_TABLE_MV[typ][i] <= mv )&&( mv < TC_TABLE_MV[typ][i + 1] ) )
{
mv_left = TC_TABLE_MV[typ][i];
mv_right = TC_TABLE_MV[typ][i + 1];
temp_left = TC_TABLE_TEMP[typ][i];
temp_right = TC_TABLE_TEMP[typ][i + 1];
result_temp = temp_left + ( temp_right - temp_left )*\
( mv - mv_left )/( mv_right - mv_left);
return result_temp;
}
}
//ERROR
return -999;
}
//数据转换将需要模拟的温度值℃转化为热电偶对应的mv
float32 temp2tcmv(SIG_FUNCTIONS_TYPE type, float32 temp)
{
float32 result_mv = 0;
uint8_t typ = 0, i = 0;
typ = (uint8_t)type;
typ -= 5; //[5,12]->[0,7]
float32 mv_left = 0, mv_right = 0;
float32 temp_left = 0, temp_right = 0;
for(i = 0; i < 10; i++)
{
if( ( TC_TABLE_TEMP[typ][i] <= temp )&&( temp < TC_TABLE_TEMP[typ][i + 1] ) )
{
mv_left = TC_TABLE_MV[typ][i];
mv_right = TC_TABLE_MV[typ][i + 1];
temp_left = TC_TABLE_TEMP[typ][i];
temp_right = TC_TABLE_TEMP[typ][i + 1];
result_mv = mv_left + ( mv_right - mv_left )*\
( temp - temp_left )/( temp_right - temp_left);
return result_mv;
}
}
//ERROR
return -999;
}
//数据转换mux_signal.pv -> real_value
float32 mux2real(float32 mux_pv)
{
float32 result = 0;
SIG_FUNCTIONS mode;
SIG_FUNCTIONS_TYPE type;
switch (m5data.io_mode)
{
case IO_INPUT:
{
mode = m5data.input_mode;
type = m5data.input_mode_type;
}
break;
case IO_OUTPUT:
{
mode = m5data.output_mode;
type = m5data.output_mode_type;
}
break;
default:
break;
}
switch (mode)
{
//电压
case SIG_VOLTAGE:
{
switch (type)
{
// mV 输入已处理无需乘以1000
case VOLTAGE_MV:
{
result = mux_pv;
}
break;
//1:1
case VOLTAGE_V:
{
result = mux_pv;
}
break;
default:
break;
}
}
break;
//电流
case SIG_CURRENT:
{
switch (type)
{
//1:1
case CURRENT_MA:
{
result = mux_pv;
}
break;
default:
break;
}
}
break;
//电阻
case SIG_RESISTANT:
{
switch (type)
{
case RESISTANT_OHM:
{
result = mux_pv;
}
break;
default:
break;
}
}
break;
//频率
case SIG_FREQUENCE:
{
switch (type)
{
case FREQUENCE_KHZ:
{
//Hz -> KHz
result = mux_pv / 1000;
}
break;
default:
break;
}
}
break;
//热电偶
case SIG_TC:
{
result = tcmv2temp(type, mux_pv);
}
break;
//热电阻
case SIG_RTD:
{
switch (type)
{
case RTD_DC:
{
result = ohm2temp(mux_pv);
}
break;
default:
break;
}
}
break;
default:
break;
}
return result;
}
//数据转换real_value -> mux_signal.sv
//float32 r2m_test_in = 0, r2m_test_out = 0;
float32 real2mux(float32 real_value)
{
float32 result = 0;
SIG_FUNCTIONS mode;
SIG_FUNCTIONS_TYPE type;
switch (m5data.io_mode)
{
case IO_INPUT:
{
mode = m5data.input_mode;
type = m5data.input_mode_type;
}
break;
case IO_OUTPUT:
{
mode = m5data.output_mode;
type = m5data.output_mode_type;
}
break;
default:
break;
}
switch (mode)
{
//电压
case SIG_VOLTAGE:
{
switch (type)
{
//[-2500mV, 2500mV] -> [-2.5V, 2.5V]
case VOLTAGE_MV:
{
result = real_value / (float32)1000;
}
break;
//1:1
case VOLTAGE_V:
{
result = real_value;
}
break;
default:
break;
}
}
break;
//电流
case SIG_CURRENT:
{
switch (type)
{
//1:1
case CURRENT_MA:
{
result = real_value;
}
break;
default:
break;
}
}
break;
//电阻
case SIG_RESISTANT:
{
switch (type)
{
case RESISTANT_OHM:
{
result = real_value;
}
break;
default:
break;
}
}
break;
//频率
case SIG_FREQUENCE:
{
switch (type)
{
case FREQUENCE_KHZ:
{
//KHz -> Hz
result = real_value * 1000;
}
break;
default:
break;
}
}
break;
//热电偶
case SIG_TC:
{
result = temp2tcmv(type, real_value);
//r2m_test_out = temp2tcmv(type, r2m_test_in);
}
break;
//热电阻
case SIG_RTD:
{
switch (type)
{
case RTD_DC:
{
result = temp2ohm(real_value);
}
break;
default:
break;
}
}
break;
default:
break;
}
return result;
}
//数据转换,热电阻阻值 Ω 转化为温度 ℃
float32 ohm2temp(float32 ohm)
{
float32 result = 0;
for(uint8_t i = 0;i < 10; i++)
{
if( ( RTD_TABLE_OHM[i] <= ohm ) && ( ohm <= RTD_TABLE_OHM[i + 1] ) )
{
result = RTD_TABLE_TEMP[i] + ( RTD_TABLE_TEMP[i + 1] - RTD_TABLE_TEMP[i] ) *\
( ( ohm - RTD_TABLE_OHM[i] ) / ( RTD_TABLE_OHM[i + 1] - RTD_TABLE_OHM[i] ) );
return result;
}
}
return 0;
}
//数据转换,温度 ℃ 转化为热电阻阻值 Ω
float32 temp2ohm(float32 temp)
{
float32 result = 0;
for(uint8_t i = 0;i < 10; i++)
{
if( ( RTD_TABLE_TEMP[i] <= temp ) && ( temp <= RTD_TABLE_TEMP[i + 1] ) )
{
result = RTD_TABLE_OHM[i] + ( RTD_TABLE_OHM[i + 1] - RTD_TABLE_OHM[i] ) *\
( ( temp - RTD_TABLE_TEMP[i] ) / ( RTD_TABLE_TEMP[i + 1] - RTD_TABLE_TEMP[i] ) );
return result;
}
}
return 0;
}
//计算a的b次方
float32 my_power(int a, int b)
{
if(a == 0)
{
return 0;
}
if(b == 0)
{
return 1;
}
float32 result = 1;
if( b > 0 )
{
for(uint8_t i = 0; i < b; i++)
{
result *= a;
}
}
else
{
for(uint8_t i = 0; i < (-b); i++)
{
result /= (float32)a;
}
}
return result;
}
//初始化打包
void my_inits_gather(void)
{
SIG24130_Init();
//HART复位关闭
HART_RESET(GPIO_PIN_SET);
//eeprom
eeprom_spi_init();
//按键扫描
tm1650_init(&hi2c1);
//LVGL
lv_init(); // LVGL 初始化
lv_port_disp_init(); // 注册LVGL的显示任务初始化
// lv_demo_benchmark(); //lv_conf.h, line:761
setup_ui(&guider_ui); // 初始化UI设置与加载初始界面
events_init(&guider_ui); // 初始化事件
}