#include "apps_gather.h" //用于头文件打包汇总,函数声明和变量定义 // lv_conf.h { line:282->CPU&FPS; line:289->MEM used } //lv_obj_scroll.c, SCROLL_ANIM_TIME_MIN & SCROLL_ANIM_TIME_MAX 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; //热电阻 // 热电偶真值表,电压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; } //切换屏幕的等待时间(ms) uint16_t screen_switch_wait = 200; 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: { if(m5data.key_main_enable) { scr_main_run(); //主界面显示 key_functions_main(); //主界面的按键功能 } else { //KEY_MENU按下后进入此处,等待(screen_switch_wait)(ms),直接切换存在卡死风险 key = KEY_MENU; key_functions_main(); //主界面的按键功能 } } break; case SCREEN_SETTING: { if (m5data.key_setting_enable) { scr_setting_run(); //设置界面 key_functions_setting(); //设置界面的按键功能 } else { //KEY_BACK按下后进入此处,等待(screen_switch_wait)(ms),直接切换存在卡死风险 key = KEY_BACK; 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 m2r_test_in = 0, m2r_test_out = 0; 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); //m2r_test_out = tcmv2temp(type, m2r_test_in); } 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) { //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); // 初始化事件 }