From 97b81a197d7c2659bc3ac295082f8a3d69dfe4f9 Mon Sep 17 00:00:00 2001 From: xqq27 <834160466@qq.com> Date: Mon, 11 May 2026 10:11:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=8F=90=E9=80=9F=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E7=9A=84=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/middleware/DehyTest/dehy_test.c | 13 +++-- Document/逻辑备份/洗烘一体机-提速逻辑.c | 76 ++++++++++++++++++------- Project/Output/TianyunV1.map | 8 +-- 3 files changed, 67 insertions(+), 30 deletions(-) diff --git a/Code/middleware/DehyTest/dehy_test.c b/Code/middleware/DehyTest/dehy_test.c index a3686e8..888c09c 100644 --- a/Code/middleware/DehyTest/dehy_test.c +++ b/Code/middleware/DehyTest/dehy_test.c @@ -1,12 +1,17 @@ #include "dehy_test.h" #include "mw_soft_timer.h" -#define DEHY_SPEED_MIN (0u) -#define DEHY_SPEED_MAX (800u) -#define DEHY_SPEED_UPDATE_MS (1000u) -#define SPEEDUP_INIT_CMD (0x5AA5) +/* +当前速度current_speed取值范围为0至800, 目标速度target_speed为0、400、500、600、700、800这几种数值。这个函数的作用是下设速度(算出预定速度result_speed后,下设这个预定速度给speed_set_val)。外部的电机会根据speed_set_val来让current_speed达到speed_set_val的速度,但也有可能会因为自身过流等故障,current_speed会掉下去。有以下要求: +1. result_speed的初值设为此时的current_speed,然后每秒根据加速度acc_val的值往上加。如果加速度为acc_val,预定速度为result_speed,那么1秒后,预定速度为 result_speed = result_speed+acc_val,再过一秒后result_speed继续加acc_val,若result_speed超过了target_speed,则result_speed改为目标速度,然后result_speed一直保持在target_speed; +2. 若target_speed突然变小,如果current_speed大于新的target_speed,则需要获取当前速度,result_speed一直保持在当前速度不改变;否则若当前速度小于等于新的目标速度,那不用管,result_speed继续根据加速度a来加; +3. 若target_speed突然变大,则result_speed继续根据加速度acc_val来增加,直到到达target_speed。 +4. 无论什么情况,如果target_speed为0,那么result_speed就要变成0. +5. 外部可以留个接口,初始化这个状态机。 +6. 除非停机,否则result_speed不要下降,只能不变或者上升。 +*/ /* 脱水速度设置 枚举变量 */ diff --git a/Document/逻辑备份/洗烘一体机-提速逻辑.c b/Document/逻辑备份/洗烘一体机-提速逻辑.c index 15da23e..1bc9779 100644 --- a/Document/逻辑备份/洗烘一体机-提速逻辑.c +++ b/Document/逻辑备份/洗烘一体机-提速逻辑.c @@ -10,23 +10,54 @@ 6. 除非停机,否则result_speed不要下降,只能不变或者上升。 */ -void dehy_speed_set(uint16_t init_cmd, uint16_t acc_val, uint16_t current_speed, uint16_t target_speed) +/* 脱水速度设置 枚举变量 */ +typedef enum +{ + DEHY_SPEEDSET_INIT, // 初始化 + DEHY_SPEEDSET_SPEED_UP, // 加速 + DEHY_SPEEDSET_SPEED_KEEP, // 稳速 + DEHY_SPEEDSET_SPEED_STOP, // 超震停机 + + DEHY_SPEEDSET_NUM +}SPEEDUP_ENUM_T; + +/* 外部调用 速度设置值 */ +static uint16_t speed_set_val = 0u; + +/************************************************************************************* + * @brief 下设速度 + * @param[in/out] val + * + * @warning + * @note + *************************************************************************************/ +void motor_speed_set(uint16_t val) +{ + speed_set_val = val; +} + + +void dehy_speed_up(LOGIC_STATE_ENUM_T init_cmd, uint16_t acc_val, uint16_t current_speed, uint16_t target_speed) { static uint32_t timetick = 0; // 时间戳 - static uint16_t add_speed_state = 0; // 本函数的状态机 + static SPEEDUP_ENUM_T add_speed_state = DEHY_SPEEDSET_INIT; // 本函数的状态机 static uint16_t result_speed = 0; // 预设速度 static uint16_t target_speed_cache = 0; // 缓存目标速度 // static uint16_t current_speed_cache = 0; // 缓存当前速度 - if(init_cmd == 0x5AA5) + if(init_cmd == LOGIC_INIT) { - add_speed_state = 0; + add_speed_state = DEHY_SPEEDSET_INIT; + } + else + { + ; } switch(add_speed_state) { // init - case 0: + case DEHY_SPEEDSET_INIT: // 时间戳 初始化 timetick = get_systick_ms(); // 预设速度 初始化 @@ -36,14 +67,14 @@ void dehy_speed_set(uint16_t init_cmd, uint16_t acc_val, uint16_t current_speed, // // 刷新 当前速度缓存 // current_speed_cache = current_speed; // 进入下一阶段 - add_speed_state = 1; + add_speed_state = DEHY_SPEEDSET_SPEED_UP; break; // 加速 - case 1: + case DEHY_SPEEDSET_SPEED_UP: // 当前 触发超震 if(target_speed == 0) { - add_speed_state = 3; + add_speed_state = DEHY_SPEEDSET_SPEED_STOP; result_speed = 0; } // 周期到 @@ -70,7 +101,7 @@ void dehy_speed_set(uint16_t init_cmd, uint16_t acc_val, uint16_t current_speed, // 记录当前速度 result_speed = current_speed; // 切到速度保持 - add_speed_state = 2; + add_speed_state = DEHY_SPEEDSET_SPEED_KEEP; } } else @@ -85,44 +116,45 @@ void dehy_speed_set(uint16_t init_cmd, uint16_t acc_val, uint16_t current_speed, if(result_speed >= target_speed) { result_speed = target_speed; - add_speed_state = 2; + add_speed_state = DEHY_SPEEDSET_SPEED_KEEP; } } // 刷新 目标速度缓存 target_speed_cache = target_speed; - /* 设置速度 */ - speed_set_val = result_speed; } break; // 速度保持 - case 2: + case DEHY_SPEEDSET_SPEED_KEEP: // 超震停机 if(target_speed == 0) { result_speed = 0; - add_speed_state = 3; + add_speed_state = DEHY_SPEEDSET_SPEED_STOP; } // 目标速度变好了 外面超震小了 else if(target_speed > target_speed_cache) { + // 若预定速度 小于 新的目标速度,则回去加速 + if(result_speed < target_speed) + { + // 回加速 + add_speed_state = DEHY_SPEEDSET_SPEED_UP; + } + target_speed_cache = target_speed; // // 刷新 当前速度缓存 // current_speed_cache = current_speed; - // 回第一步 - add_speed_state = 1; } - - /* 设置速度 */ - speed_set_val = result_speed; break; // 超震停机 - case 3: + case DEHY_SPEEDSET_SPEED_STOP: result_speed = 0; - /* 设置速度 */ - speed_set_val = result_speed; break; default: break; } + + /* 设置速度 */ + motor_speed_set(result_speed); } \ No newline at end of file diff --git a/Project/Output/TianyunV1.map b/Project/Output/TianyunV1.map index a54b33b..b08a7b6 100644 --- a/Project/Output/TianyunV1.map +++ b/Project/Output/TianyunV1.map @@ -2022,7 +2022,7 @@ Image component sizes 672 134 48 32 36 44105 bsp_timer.o 478 36 0 4 2088 6070 bsp_usart.o 0 0 0 0 0 32 core_cm3.o - 264 22 0 14 0 2470 dehy_test.o + 264 22 0 14 0 2366 dehy_test.o 60 4 0 0 0 572 interrupt_handler.o 204 120 0 0 0 220839 main.o 20 10 0 0 0 675 misc.o @@ -2036,7 +2036,7 @@ Image component sizes 328 28 0 20 0 3161 system_stm32f10x.o ---------------------------------------------------------------------- - 5900 770 318 136 3248 602755 Object Totals + 5900 770 318 136 3248 602651 Object Totals 0 0 32 0 0 0 (incl. Generated) 10 0 2 4 4 0 (incl. Padding) @@ -2079,8 +2079,8 @@ Image component sizes Code (inc. data) RO Data RW Data ZI Data Debug - 6542 800 318 136 3248 599251 Grand Totals - 6542 800 318 136 3248 599251 ELF Image Totals + 6542 800 318 136 3248 599147 Grand Totals + 6542 800 318 136 3248 599147 ELF Image Totals 6542 800 318 136 0 0 ROM Totals ==============================================================================