更新:

1、mux任务调整,开机动画结束后再启动,否则会与其他任务的初始化冲突;
2、EEPROM的读取新增异常数据检测与处理;
This commit is contained in:
吴俊潮 2025-06-25 15:57:14 +08:00
parent 53358b12c6
commit 88c0dbc6e3
7 changed files with 22452 additions and 18728 deletions

View File

@ -116,12 +116,11 @@ float result = 0;
}
else
{
curma_out_cal_enable = 2;
// //存在校准数据
// curma_out_cal_enable = 1;
//存在校准数据
curma_out_cal_enable = 1;
// //将读到的数据存储至cur_ma_out_calibrate_table[CALIBRATE_CUR_MA_OUT_POINTS]
// eeprom_dataread_single(EEPROM_TAG_CAL_CUR_MA_OUT);
//将读到的数据存储至cur_ma_out_calibrate_table[CALIBRATE_CUR_MA_OUT_POINTS]
eeprom_dataread_single(EEPROM_TAG_CAL_CUR_MA_OUT);
}
}
break;

View File

@ -46,6 +46,7 @@ typedef struct dac8552_object
extern dac8552x_object dac8552;
extern float cur_ma_out_calibrate_table[CALIBRATE_CUR_MA_OUT_POINTS];
extern uint8_t curma_out_cal_enable;
void dac8552_init(dac8552x_object *dac, dac8552_write write, dac8552_chip_select cs);
void dac8552_operation(float32 *data1, float32 *data2);

View File

@ -629,54 +629,68 @@ void eeprom_datasave_single(uint8_t tag)
void eeprom_dataread(void)
{
uint8_t temp_h = 0, temp_l = 0;
uint16_t temp_w = 0;
//VOL V
temp_h = eeprom_readdata(VOL_V_UP_ADDR);
temp_l = eeprom_readdata(VOL_V_UP_ADDR + 8);
tabdata.item0_page0_vup[0] = ( temp_h << 8 ) + temp_l;
//数据异常时使用默认值
if( (tabdata.item0_page0_vup[0] > VOL[0].up)||(tabdata.item0_page0_vup[0] < VOL[0].low) ) tabdata.item0_page0_vup[0] = VOL[0].up;
temp_h = eeprom_readdata(VOL_V_LOW_ADDR);
temp_l = eeprom_readdata(VOL_V_LOW_ADDR + 8);
tabdata.item0_page0_vlow[0] = ( temp_h << 8 ) + temp_l;
//数据异常时使用默认值
if( (tabdata.item0_page0_vlow[0] > VOL[0].up)||(tabdata.item0_page0_vlow[0] < VOL[0].low) ) tabdata.item0_page0_vlow[0] = VOL[0].low;
//出现错误后,提前返回
//出现错误后,提前返回(连续四个字节不出错,直接读到最后)
//该错误仅能表示超时,无法表示数据异常
if(system_sts.eeprom_read_error) return;
//VOL mV
temp_h = eeprom_readdata(VOL_MV_UP_ADDR);
temp_l = eeprom_readdata(VOL_MV_UP_ADDR + 8);
tabdata.item0_page0_vup[1] = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page0_vup[1] > VOL[1].up)||(tabdata.item0_page0_vup[1] < VOL[1].low) ) tabdata.item0_page0_vup[0] = VOL[1].up;
temp_h = eeprom_readdata(VOL_MV_LOW_ADDR);
temp_l = eeprom_readdata(VOL_MV_LOW_ADDR + 8);
tabdata.item0_page0_vlow[1] = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page0_vlow[1] > VOL[1].up)||(tabdata.item0_page0_vlow[1] < VOL[1].low) ) tabdata.item0_page0_vlow[0] = VOL[1].low;
//CUR
//temp_h = eeprom_readdata(CUR_UP_ADDR);
temp_l = eeprom_readdata(CUR_UP_ADDR + 8);
tabdata.item0_page0_cup = temp_l;
if( (tabdata.item0_page0_cup > CUR.up)||(tabdata.item0_page0_cup < CUR.low) ) tabdata.item0_page0_cup = CUR.up;
//temp_h = eeprom_readdata(CUR_LOW_ADDR);
temp_l = eeprom_readdata(CUR_LOW_ADDR + 8);
tabdata.item0_page0_clow = temp_l;
if( (tabdata.item0_page0_clow > CUR.up)||(tabdata.item0_page0_clow < CUR.low) ) tabdata.item0_page0_clow = CUR.low;
//RES
temp_h = eeprom_readdata(RES_UP_ADDR);
temp_l = eeprom_readdata(RES_UP_ADDR + 8);
tabdata.item0_page0_rup = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page0_rup > RES.up)||(tabdata.item0_page0_rup < RES.low) ) tabdata.item0_page0_rup = RES.up;
temp_h = eeprom_readdata(RES_LOW_ADDR);
temp_l = eeprom_readdata(RES_LOW_ADDR + 8);
tabdata.item0_page1_rlow = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page1_rlow > RES.up)||(tabdata.item0_page1_rlow < RES.low) ) tabdata.item0_page1_rlow = RES.low;
//FRE
//temp_h = eeprom_readdata(FRE_UP_ADDR);
temp_l = eeprom_readdata(FRE_UP_ADDR + 8);
tabdata.item0_page1_fup = temp_l;
if( (tabdata.item0_page1_fup > FRE.up)||(tabdata.item0_page1_fup < FRE.low) ) tabdata.item0_page1_fup = FRE.up;
//temp_h = eeprom_readdata(FRE_LOW_ADDR);
temp_l = eeprom_readdata(FRE_LOW_ADDR + 8);
tabdata.item0_page1_flow = temp_l;
if( (tabdata.item0_page1_flow > FRE.up)||(tabdata.item0_page1_flow < FRE.low) ) tabdata.item0_page1_flow = FRE.low;
//TC K
temp_h = eeprom_readdata(TC_K_UP_ADDR);
@ -750,39 +764,55 @@ void eeprom_dataread(void)
temp_l = eeprom_readdata(TC_T_LOW_ADDR + 8);
tabdata.item0_page1_TClow[7] = ( temp_h << 8 ) + temp_l;
for(uint8_t i = 0; i < 8; i++)
{
if( (tabdata.item0_page1_TCup[i] > TC[i].up)||(tabdata.item0_page1_TCup[i] < TC[i].low) ) tabdata.item0_page1_TCup[i] = TC[i].up;
if( (tabdata.item0_page1_TClow[i] > TC[i].up)||(tabdata.item0_page1_TClow[i] < TC[i].low) ) tabdata.item0_page1_TClow[i] = TC[i].low;
}
//RTD
temp_h = eeprom_readdata(RTD_UP_ADDR);
temp_l = eeprom_readdata(RTD_UP_ADDR + 8);
tabdata.item0_page2_RTDup = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page2_RTDup > RTD.up)||(tabdata.item0_page2_RTDup < RTD.low) ) tabdata.item0_page2_RTDup = RTD.up;
temp_h = eeprom_readdata(RTD_LOW_ADDR);
temp_l = eeprom_readdata(RTD_LOW_ADDR + 8);
tabdata.item0_page2_RTDlow = ( temp_h << 8 ) + temp_l;
if( (tabdata.item0_page2_RTDlow > RTD.up)||(tabdata.item0_page2_RTDlow < RTD.low) ) tabdata.item0_page2_RTDlow = RTD.low;
//采样间隔
temp_h = eeprom_readdata(SAMPLE_INTERVAL_ADDR);
temp_l = eeprom_readdata(SAMPLE_INTERVAL_ADDR + 8);
tabdata.item1_page0_sample_interval = ( temp_h << 8 ) + temp_l;
if( (tabdata.item1_page0_sample_interval > SAMPLE_INTERVAL_MAX)||(tabdata.item1_page0_sample_interval < MENU_TASK_PERIOD) ) tabdata.item1_page0_sample_interval = 1000;
//描点数量
temp_h = eeprom_readdata(PLOT_COUNT_ADDR);
temp_l = eeprom_readdata(PLOT_COUNT_ADDR + 8);
tabdata.item1_page0_plot_num = ( temp_h << 8 ) + temp_l;
if( (tabdata.item1_page0_plot_num > PLOT_NUM_MAX)||(tabdata.item1_page0_plot_num < PLOT_NUM_MIN) ) tabdata.item1_page0_plot_num = 10;
//输入曲线颜色
temp_h = eeprom_readdata(INPUT_COLOR_ADDR);
temp_l = eeprom_readdata(INPUT_COLOR_ADDR + 8);
tabdata.item1_page0_color_input = (COLORS)( ( temp_h << 8 ) + temp_l );
temp_w = ( temp_h << 8 ) + temp_l;
if(temp_w > 5) temp_w = 0;
tabdata.item1_page0_color_input = (COLORS)temp_w;
//输出曲线颜色
temp_h = eeprom_readdata(OUTPUT_COLOR_ADDR);
temp_l = eeprom_readdata(OUTPUT_COLOR_ADDR + 8);
tabdata.item1_page0_color_output = (COLORS)( ( temp_h << 8 ) + temp_l );
temp_w = ( temp_h << 8 ) + temp_l;
if(temp_w > 5) temp_w = 1;
tabdata.item1_page0_color_output = (COLORS)temp_w;
//语言选择
temp_h = eeprom_readdata(LANGUAGE_SELECT_ADDR);
temp_l = eeprom_readdata(LANGUAGE_SELECT_ADDR + 8);
tabdata.item3_page0_language = (LANGUAGES)( ( temp_h << 8 ) + temp_l );
temp_w = ( temp_h << 8 ) + temp_l;
if(temp_w > 1) temp_w = 0;
tabdata.item3_page0_language = (LANGUAGES)temp_w;
}
//读取指定数据
@ -792,6 +822,7 @@ void eeprom_dataread_single(uint8_t tag)
//32bits: h --- mh --- ml --- l
uint8_t temp_h = 0, temp_l = 0;
uint8_t temp_mh = 0, temp_ml = 0;
float error_check = 0;
switch (tag)
{
@ -806,6 +837,14 @@ void eeprom_dataread_single(uint8_t tag)
temp_ml = eeprom_readdata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 16);
temp_l = eeprom_readdata(CAL_CUR_MA_OUT_ADDR_START + 32*i + 24);
flt[i] = (temp_h << 24)|(temp_mh << 16)|(temp_ml << 8)|(temp_l);
memcpy(&error_check, flt + i, 4);
if( ((int16_t)error_check > CUR.up)||((int16_t)error_check < CUR.low) )
{
//任意一个点异常,随即退出,不启用校准
curma_out_cal_enable = 2;
return;
}
}
memcpy(cur_ma_out_calibrate_table, flt, sizeof(cur_ma_out_calibrate_table));
@ -823,6 +862,14 @@ void eeprom_dataread_single(uint8_t tag)
temp_ml = eeprom_readdata(CAL_VOL_V_OUT_ADDR_START + 32*i + 16);
temp_l = eeprom_readdata(CAL_VOL_V_OUT_ADDR_START + 32*i + 24);
flt[i] = (temp_h << 24)|(temp_mh << 16)|(temp_ml << 8)|(temp_l);
memcpy(&error_check, flt + i, 4);
if( ((int16_t)error_check > VOL[0].up)||((int16_t)error_check < VOL[0].low) )
{
//任意一个点异常,随即退出,不启用校准
volv_out_cal_enable = 2;
return;
}
}
memcpy(vol_v_out_calibrate_table, flt, sizeof(vol_v_out_calibrate_table));

View File

@ -49,6 +49,7 @@ void MX_DAC_Init(void);
float calibrate_vol_v(float raw);
extern float vol_v_out_calibrate_table[CALIBRATE_VOL_V_OUT_POINTS];
extern uint8_t volv_out_cal_enable;
/* USER CODE END Prototypes */
#ifdef __cplusplus

View File

@ -331,37 +331,41 @@ void start_mux_analog(void const * argument)
/* Infinite loop */
for (;;)
{
//编程输出过程,放在此处实时性更好
if(progout_data.process == PROGOUT_RUNNING)
//开机动画结束后再执行
if(menu_data.scr_init_flag == 1)
{
switch (progout_data.output_mode)
//编程输出过程,放在此处实时性更好
if(progout_data.process == PROGOUT_RUNNING)
{
case PROG_OUT_STEP:
switch (progout_data.output_mode)
{
running_process_step();
}
break;
case PROG_OUT_STEP:
{
running_process_step();
}
break;
case PROG_OUT_TRIANGLE:
{
running_process_triangle();
}
break;
case PROG_OUT_TRIANGLE:
{
running_process_triangle();
}
break;
default:
break;
default:
break;
}
}
//按键扫描
tm1650_read_key(&hi2c1, &kp_flag, COMMAND_READ_KEY_DATA, &key);
//输出&输入通道切换
mux_signal_switch(&mux_signal);
//处理校准事件
deal_calibrate_affair();
}
//按键扫描
tm1650_read_key(&hi2c1, &kp_flag, COMMAND_READ_KEY_DATA, &key);
//输出&输入通道切换
mux_signal_switch(&mux_signal);
//处理校准事件
deal_calibrate_affair();
//内存、内存碎片、CPU占用监控
my_monitor_cnt++;
if( my_monitor_cnt * MUX_TASK_PERIOD >= 200)

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff