存档:

1、三角波和阶跃功能完成,但是显示画面与输出值不同步;
2、输出控制迁移至mux任务中;
This commit is contained in:
吴俊潮 2025-06-05 16:58:43 +08:00
parent 5eb02c4eb1
commit bab58a6493
7 changed files with 11770 additions and 11527 deletions

View File

@ -14,6 +14,9 @@
//最大循环次数 //最大循环次数
#define CIRCULATIONS_MAX 10 #define CIRCULATIONS_MAX 10
//三角波每个周期的间隔数量
#define TRIANLE_PLOT_INTERVAL_MAX 20
//CONFIG1 //CONFIG1
#define CONF1_OUTPUT_UNIT 0 #define CONF1_OUTPUT_UNIT 0
#define CONF1_OUTPUT_MODE 1 #define CONF1_OUTPUT_MODE 1
@ -93,6 +96,12 @@ void program_out_step(void);
//执行编程输出,三角波 //执行编程输出,三角波
void program_out_triangle(void); void program_out_triangle(void);
//置于mux任务内实时性更强
void running_process_step(void);
//置于mux任务内实时性更强
void running_process_triangle(void);
//百分比转化为数值输出, perc:[0, 100] //百分比转化为数值输出, perc:[0, 100]
void percent2val_out(float32 perc); void percent2val_out(float32 perc);

View File

@ -236,11 +236,10 @@ uint8_t init_set_bar(uint8_t start, uint8_t end, uint16_t interval)
return 0; return 0;
} }
void scr_main_run(void) void scr_main_run(void)
{ {
//实时更新设定值 //实时更新设定值
sig_sv_update(); //不做延时,尽快响应 sig_sv_update();
//运行时间显示 //运行时间显示
runtime_show(); //1000ms runtime_show(); //1000ms

View File

@ -250,8 +250,8 @@ void set_item1_value(ITEM_CONTENTS con, int8_t step)
{ {
tabdata.item1_page0_sample_interval += step * 100; tabdata.item1_page0_sample_interval += step * 100;
if( tabdata.item1_page0_sample_interval > 60000 ) tabdata.item1_page0_sample_interval = 60000; if( tabdata.item1_page0_sample_interval > 10000 ) tabdata.item1_page0_sample_interval = 10000;
if( tabdata.item1_page0_sample_interval < 100 ) tabdata.item1_page0_sample_interval = 100; if( tabdata.item1_page0_sample_interval < 500 ) tabdata.item1_page0_sample_interval = 500;
} }
break; break;

View File

@ -595,6 +595,48 @@ void program_out_step(void)
case PROGOUT_RUNNING: case PROGOUT_RUNNING:
{ {
//迁移至mux任务内
}
break;
case PROGOUT_END:
{
step_dir = 0;
cir_times = 0;
menu_data.io_on2off = IO_OFF;
mux_signal.data_sv = 0;
//加载菜单界面
lv_scr_load(guider_ui.screen_setting);
scr_setting_recover();
lv_obj_clear_flag(guider_ui.screen_setting, LV_OBJ_FLAG_HIDDEN);
//隐藏主界面对象
lv_obj_add_flag(guider_ui.screen_main, LV_OBJ_FLAG_HIDDEN);
menu_data.scr_now = SCREEN_SETTING; //当前界面为详细设置菜单
tabdata.item_cursor_prv = ITEM_0;
tabdata.item_cursor = ITEM_2;
setting_items_check(tabdata.item_cursor, tabdata.item_cursor_prv);
//返回config2界面
program_out_config2();
current_operation = PROG_OUT_CONFIG_2;
key_config_update(current_operation);
progout_data.process = PROGOUT_WAITING;
}
break;
default:
break;
}
}
void running_process_step(void)
{
if(progout_tick_flag == 0) if(progout_tick_flag == 0)
{ {
//计时开始 //计时开始
@ -638,6 +680,65 @@ void program_out_step(void)
progout_tick = 0; progout_tick = 0;
} }
} }
}
uint8_t tri_interval = 0; //控制周期,调整输出的时间间隔
uint8_t tri_step_up = 0; //上升阶段每次变化的步长
uint8_t tri_step_down = 0; //下降阶段每次变化的步长
uint8_t tri_up2down = 0; //上升和下降的分界点,第几个间隔
void program_out_triangle(void)
{
switch (progout_data.process)
{
case PROGOUT_START:
{
if( progout_tick_flag == 0 )
{
//计时开始
progout_tick_flag = 1;
progout_tick = 0;
progout_data.out_percent = progout_data.start_percent;
percent2val_out(progout_data.out_percent);
//初始方向、控制间隔、上升&下降的分界点、上升&下降各自的步长
step_dir = 1;
tri_interval = progout_data.period / TRIANLE_PLOT_INTERVAL_MAX;
tri_up2down = ( (float32)progout_data.rising_percent/(float32)100 ) * TRIANLE_PLOT_INTERVAL_MAX;
if( tri_up2down == 0 )
{
tri_step_up = progout_data.end_percent - progout_data.start_percent;
tri_step_down = (progout_data.end_percent - progout_data.start_percent)/TRIANLE_PLOT_INTERVAL_MAX;
}
else if( tri_up2down == TRIANLE_PLOT_INTERVAL_MAX)
{
tri_step_up = (progout_data.end_percent - progout_data.start_percent)/TRIANLE_PLOT_INTERVAL_MAX;
tri_step_down = progout_data.end_percent - progout_data.start_percent;
}
else
{
tri_step_up = (progout_data.end_percent - progout_data.start_percent)/tri_up2down;
tri_step_down = (progout_data.end_percent - progout_data.start_percent)/(TRIANLE_PLOT_INTERVAL_MAX - tri_up2down);
}
}
else
{
//到达起点%后等待一段时间
if(progout_tick >= 5000)
{
//计时结束
progout_tick_flag = 0;
progout_tick = 0;
progout_data.process = PROGOUT_RUNNING;
}
}
}
break;
case PROGOUT_RUNNING:
{
//迁移至mux任务内
} }
break; break;
@ -645,6 +746,8 @@ void program_out_step(void)
{ {
step_dir = 0; step_dir = 0;
cir_times = 0; cir_times = 0;
progout_tick_flag = 0;
progout_tick = 0;
menu_data.io_on2off = IO_OFF; menu_data.io_on2off = IO_OFF;
mux_signal.data_sv = 0; mux_signal.data_sv = 0;
@ -677,7 +780,54 @@ void program_out_step(void)
} }
} }
void program_out_triangle(void) void running_process_triangle(void)
{} {
if( progout_tick_flag == 0 )
{
//计时开始
progout_tick_flag = 1;
progout_tick = 0;
if(step_dir == 1)
{
progout_data.out_percent += tri_step_up;
if(progout_data.out_percent >= progout_data.end_percent)
{
progout_data.out_percent = progout_data.end_percent;
step_dir = -1;
}
}
else if(step_dir == -1)
{
progout_data.out_percent -= tri_step_down;
if( (progout_data.out_percent <= progout_data.start_percent)||(progout_data.out_percent > 101) )
{
progout_data.out_percent = progout_data.start_percent;
cir_times++;
step_dir = 1;
if( progout_data.circulations < 11 )
{
//循环次数达到目标后,跳转至终止步骤
if(cir_times >= progout_data.circulations) progout_data.process = PROGOUT_END;
}
else
{
//无限循环
cir_times = 0;
}
}
}
percent2val_out(progout_data.out_percent);
}
else
{
if(progout_tick >= tri_interval)
{
//计时结束
progout_tick_flag = 0;
progout_tick = 0;
}
}
}

View File

@ -319,6 +319,28 @@ void start_mux_analog(void const * argument)
/* Infinite loop */ /* Infinite loop */
for (;;) for (;;)
{ {
//编程输出过程,放在此处实时性更好
if( progout_data.process == PROGOUT_RUNNING)
{
switch (progout_data.output_mode)
{
case PROG_OUT_STEP:
{
running_process_step();
}
break;
case PROG_OUT_TRIANGLE:
{
running_process_triangle();
}
break;
default:
break;
}
}
//按键扫描 //按键扫描
tm1650_read_key(&hi2c1, &kp_flag, COMMAND_READ_KEY_DATA, &key); tm1650_read_key(&hi2c1, &kp_flag, COMMAND_READ_KEY_DATA, &key);
@ -326,7 +348,7 @@ void start_mux_analog(void const * argument)
mux_signal_switch(&mux_signal); mux_signal_switch(&mux_signal);
my_monitor_cnt++; my_monitor_cnt++;
if(my_monitor_cnt >= 5) if( my_monitor_cnt * MUX_TASK_PERIOD >= 200)
{ {
my_monitor_cnt = 0; my_monitor_cnt = 0;

View File

@ -260,6 +260,31 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>progout_data,0x0A</ItemText> <ItemText>progout_data,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>21</count>
<WinNumber>1</WinNumber>
<ItemText>tri_interval,0x0A</ItemText>
</Ww>
<Ww>
<count>22</count>
<WinNumber>1</WinNumber>
<ItemText>tri_step_up,0x0A</ItemText>
</Ww>
<Ww>
<count>23</count>
<WinNumber>1</WinNumber>
<ItemText>tri_step_down,0x0A</ItemText>
</Ww>
<Ww>
<count>24</count>
<WinNumber>1</WinNumber>
<ItemText>tri_up2down,0x0A</ItemText>
</Ww>
<Ww>
<count>25</count>
<WinNumber>1</WinNumber>
<ItemText>cir_times</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<WatchWindow2> <WatchWindow2>
<Ww> <Ww>

File diff suppressed because it is too large Load Diff