From f60f444fe75c0c6acda3ca6c2cbf97b69383eaa7 Mon Sep 17 00:00:00 2001 From: gaoyuhang Date: Tue, 25 Jun 2024 14:35:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E6=95=B4=E5=AE=9A=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=90=84=E7=82=B9=E4=BD=8D=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=EF=BC=88=E5=8F=AF=E6=AD=A3=E5=B8=B8=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MDK-ARM/controller-v2.uvoptx | 23 ++- MDK-ARM/controller-v2.uvprojx | 6 +- User/application/mode/mode_pwmp_hd.c | 295 +++++++++++++++++++++++++-- User/application/mode/mode_pwmp_hd.h | 42 +++- 4 files changed, 334 insertions(+), 32 deletions(-) diff --git a/MDK-ARM/controller-v2.uvoptx b/MDK-ARM/controller-v2.uvoptx index 0a28dde..fb8fbe7 100644 --- a/MDK-ARM/controller-v2.uvoptx +++ b/MDK-ARM/controller-v2.uvoptx @@ -245,6 +245,11 @@ 1 udevice,0x0A + + 17 + 1 + mode_pwmp_hd->process_state,0x0A + @@ -1505,14 +1510,6 @@ - - ::CMSIS - 0 - 0 - 0 - 1 - - Middlewares/Library/DSP Library/DSP Library 0 @@ -1520,7 +1517,7 @@ 0 0 - 17 + 16 91 4 0 @@ -1533,4 +1530,12 @@ + + ::CMSIS + 0 + 0 + 0 + 1 + + diff --git a/MDK-ARM/controller-v2.uvprojx b/MDK-ARM/controller-v2.uvprojx index e6b7aa4..0d8ec8e 100644 --- a/MDK-ARM/controller-v2.uvprojx +++ b/MDK-ARM/controller-v2.uvprojx @@ -1278,9 +1278,6 @@ - - ::CMSIS - Middlewares/Library/DSP Library/DSP Library @@ -1379,6 +1376,9 @@ + + ::CMSIS + diff --git a/User/application/mode/mode_pwmp_hd.c b/User/application/mode/mode_pwmp_hd.c index 032a3d5..f35b6cd 100644 --- a/User/application/mode/mode_pwmp_hd.c +++ b/User/application/mode/mode_pwmp_hd.c @@ -134,7 +134,7 @@ static void pwmp_control_update(filter_e type) if (mode_pwmp_hd->process_state == PWMP_HD_PROCESS_ADJUST) { - p->ctrl_target = p->ctrl_target; + p->ctrl_target = mode_pwmp_hd_adjust->ctrl_target; } else if (mode_pwmp_hd->process_state == PWMP_HD_PROCESS_TEST) { @@ -165,6 +165,9 @@ static void pwmp_control_update(filter_e type) mode_pwmp_hd_test->small_trip_current_adc = p->small_trip_current_adc; mode_pwmp_hd_test->ctrl_feedback = p->ctrl_feedback; mode_pwmp_hd_test->real_error = p->real_error; + /*整定模式赋值*/ + mode_pwmp_hd_adjust->ctrl_feedback = p->ctrl_feedback; + mode_pwmp_hd_adjust->real_error = p->real_error; } /*PID参数获取*/ @@ -227,6 +230,72 @@ void mode_pwmp_hd_stop(mode_pwmp_hd_t *handle) osel_memset((uint8_t *)&handle->control, 0, sizeof(mode_pwmp_hd_control_t)); } +// TODO:需要对进气和排气过程进行判定 +/*将10-20、20-30、30-40...等区间进行局部线性化,并将输入的目标变量进行映射处理*/ +static float32_t convert_target_to_controlvalue() +{ // FIXME:将函数补足 + uint16_t i = 0; + float32 tmp = 0; + static float32 control_value = 0; // 此变量要传回,故定义为static类型。 + + i = (uint16_t)(fabs(mode_pwmp_hd->control.ctrl_target) / 10); + + /*此处判断为解决处于10、20、30等整十处的特殊情况*/ + if (((uint16_t)fabs(mode_pwmp_hd->control.ctrl_target) % 10 == 0) && (fabs(mode_pwmp_hd->control.ctrl_target) >= 10)) + { + if (mode_pwmp_hd->action == INFLATE) + { + control_value = mode_pwmp_hd->valvepos.valvepos_in[i - 1]; + } + else if (mode_pwmp_hd->action == DEFLATE) + { + control_value = mode_pwmp_hd->valvepos.valvepos_de[i - 1]; + } + } + else + { /*处于区间内的情况*/ + if (mode_pwmp_hd->action == INFLATE) + { + tmp = ((mode_pwmp_hd->control.ctrl_target - (i * 10)) / (10)); + control_value = tmp * mode_pwmp_hd->valvepos.valvepos_in_k[i - 1] + mode_pwmp_hd->valvepos.valvepos_in_b[i - 1]; + } + else if (mode_pwmp_hd->action == DEFLATE) + { + tmp = ((mode_pwmp_hd->control.ctrl_target - (i * 10)) / (10)); + control_value = tmp * mode_pwmp_hd->valvepos.valvepos_de_k[i - 1] + mode_pwmp_hd->valvepos.valvepos_de_b[i - 1]; + } + } + + return control_value; +} + +/*判断运动状态(充气/排气)*/ +static void inflate_or_deflate() +{ + if (udevice.value_action_type == ATO) + { + if (mode_pwmp_hd->control.real_error < 0) + { + mode_pwmp_hd->action = DEFLATE; + } + else if (mode_pwmp_hd->control.real_error > 0) + { + mode_pwmp_hd->action = INFLATE; + } + } + else if (udevice.value_action_type == ATC) + { + if (mode_pwmp_hd->control.real_error < 0) + { + mode_pwmp_hd->action = INFLATE; + } + else if (mode_pwmp_hd->control.real_error > 0) + { + mode_pwmp_hd->action = DEFLATE; + } + } +} + /** * @brief 算法方案初始化 * @param {execute_plan_hd_e} plan @@ -286,6 +355,11 @@ static execute_rsp_hd_t *execute_dac_plan1() Control_diff = mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin - mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin; float32 out = 0.0; + /*判断此时的充排气状态*/ + inflate_or_deflate(); + /*获取目标值对应的控制值大小*/ + mode_pwmp_hd->valvepos_stable = convert_target_to_controlvalue(); + // 杭电:输出限幅的参数设置 _pid.pid_u.hd.set_out_prm_position(&_pid.pid_u.hd, 100, 0); out = _pid.pid_u.hd.pid_position(&_pid.pid_u.hd, mode_pwmp_hd->control.real_error); @@ -299,20 +373,45 @@ static execute_rsp_hd_t *execute_dac_plan1() /*二阶段加权系数*/ static float32 index_min_second = 0.2; static float32 index_max_second = 0.3; - if (fabs(mode_pwmp_hd->control.real_error) >= 5.7) - { // 对PID输出结果进行归一化处理 - out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max_first) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first); // 映射实际控制器的范围 - out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first; - } - else if (fabs(mode_pwmp_hd->control.real_error) < 5.7 && fabs(mode_pwmp_hd->control.real_error) >= 1) - { // 对PID输出结果进行归一化处理 - out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max_second) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second); // 映射实际控制器的范围 - out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second; + if (mode_pwmp_hd->process_state == PWMP_HD_PROCESS_ADJUST) + { + if (fabs(mode_pwmp_hd->control.real_error) >= 5.7) + { // 对PID输出结果进行归一化处理 + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max_first) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first); // 映射实际控制器的范围 + out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first; + } + else if (fabs(mode_pwmp_hd->control.real_error) < 5.7 && fabs(mode_pwmp_hd->control.real_error) >= 1) + { // 对PID输出结果进行归一化处理 + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max_second) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second); // 映射实际控制器的范围 + out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second; + } + else + { + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); // 映射实际控制器的范围 + out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin; + } } else { - out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); // 映射实际控制器的范围 - out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin; + if (fabs(mode_pwmp_hd->control.real_error) >= 5.7) + { // 对PID输出结果进行归一化处理 + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max_first) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first); // 映射实际控制器的范围 + out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first; + } + else if (fabs(mode_pwmp_hd->control.real_error) < 5.7 && fabs(mode_pwmp_hd->control.real_error) >= 1) + { // 对PID输出结果进行归一化处理 + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max_second) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second); // 映射实际控制器的范围 + out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second; + } + else if (fabs(mode_pwmp_hd->control.real_error) < 1 && fabs(mode_pwmp_hd->control.real_error) > 0.7) + { + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); // 映射实际控制器的范围 + out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin; + } + else + { + out = mode_pwmp_hd->valvepos_stable; + } } #else float32 index = fabs(1 - exp(-(pow(mode_pwmp_hd->control.real_error, 2) - 1))); @@ -372,8 +471,15 @@ static execute_rsp_hd_t *execute_dac_plan1() } else if (fabs(mode_pwmp_hd->control.real_error) <= 0.99) { - out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); // 映射实际控制器的范围 - out += (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); + if (mode_pwmp_hd_adjust->adjust_state == PWMP_HD_ADJUST_STEP_BY_10_TO_100 || mode_pwmp_hd_adjust->adjust_state == PWMP_HD_ADJUST_STEP_BY_10_TO_0) + { + out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); // 映射实际控制器的范围 + out += (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); + } + else + { + out = mode_pwmp_hd->valvepos_stable; + } } #endif } @@ -383,6 +489,7 @@ static execute_rsp_hd_t *execute_dac_plan1() return &rsp; } + /// /// /// @@ -561,7 +668,7 @@ static void pwmp_adjust_hd_rough_position0(uint8_t *state, mode_pwmp_hd_adjust_s else { /*得到一个粗略的,小于启动量的值*/ - mode_pwmp_hd_adjust->arr_record_1 = mode_pwmp_hd_adjust->arr_last > 1000 ? mode_pwmp_hd_adjust->arr_last * 0.9 : mode_pwmp_hd_adjust->arr_last; + mode_pwmp_hd_adjust->arr_record_1 = mode_pwmp_hd_adjust->arr_last > 1000 ? mode_pwmp_hd_adjust->arr_last * 0.97 : mode_pwmp_hd_adjust->arr_last; /*判断位置反馈磁条是正装还是反装*/ mode_pwmp_hd_adjust->adc_0_100_flag = mode_pwmp_hd_adjust->adc_record_0 < current_adc ? TRUE : FALSE; mode_pwmp_hd_adjust->arr_current = mode_pwmp_hd_adjust->arr_record_1; @@ -954,7 +1061,7 @@ static void pwmp_adjust_hd_accurate_position100(uint8_t *state, mode_pwmp_hd_adj else { /*40mm————30;16mm————40*/ - mode_pwmp_hd_adjust->wait_count = mode_pwmp_hd->wait_count_max * 10; + mode_pwmp_hd_adjust->wait_count = mode_pwmp_hd->wait_count_max * 1; // 0.1秒钟加一次 } mode_pwmp_hd_adjust->last_adc = mode_pwmp_hd_adjust->psb_adc; mode_pwmp_hd_adjust->arr_last = mode_pwmp_hd_adjust->arr_current; @@ -1345,8 +1452,6 @@ static void pwmp_adjust_hd_pid_calculate(uint8_t *state, mode_pwmp_hd_adjust_sta *state = next_state; // 将状态切换 } -/**/ - /*参数保存模式*/ static void pwmp_adjust_hd_save(uint8_t *state, mode_pwmp_hd_adjust_state_e next_state) { @@ -1364,6 +1469,148 @@ static void pwmp_adjust_hd_save(uint8_t *state, mode_pwmp_hd_adjust_state_e next mode_pwmp_hd->params_save_cb(); } +// XXX:将0、10、20...90、100处的阀位反馈值记录下来,做小区间的线性化。 +/*以每10%阀位为一步进,由0阀位增加到100阀位*/ +static void pwmp_hd_adjust_step_by_10_to_100(uint8_t *state, mode_pwmp_hd_adjust_state_e next_state) +{ + execute_rsp_hd_t *execute_res; + if (!FSM_IS_WAIT(*state)) + { + + mode_pwmp_hd_adjust->ctrl_target = 10; + mode_pwmp_hd_adjust->adjust_state = (mode_pwmp_hd_adjust_state_e)*state; + FSM_WAIT(mode_pwmp_hd_adjust->adjust_state); // 等放气完毕就可以切入到else里面了 + *state = PWMP_HD_ADJUST_BLEEDING; + } + else + { + static unsigned int i = 0; + /*将模式调整为控制模式*/ + pwmp_control_update(FILTER_MEDIAN); + if (rt_data.loop_current >= 4.0) + { + if (mode_pwmp_hd_adjust->ctrl_target == 0) + { + pdctrl_out(mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin * 0.8); + } + else if (mode_pwmp_hd_adjust->ctrl_target == 100) + { + pdctrl_out(mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin * 1.5); + } + else + { + execute_res = execute_dac(EXECUTE_PLAN); // PID计算结果经过执行器处理 + if (execute_res->code == EXECUTE_HD_OUT) // 执行DAC输出 + { + pdctrl_out(execute_res->dac); + } + } + } + /*当误差大于0.5%时重置等待时间*/ + if (fabs(mode_pwmp_hd_adjust->real_error) > 1) + { + // 此处延时三秒钟 + mode_pwmp_hd_adjust->wait_count = mode_pwmp_hd->wait_count_max * 30; + } + else + { + mode_pwmp_hd_adjust->wait_count--; + if (mode_pwmp_hd_adjust->wait_count == 0) + { + if ((unsigned int)mode_pwmp_hd_adjust->ctrl_target < 100) + { + mode_pwmp_hd_adjust->valvepos.valvepos_in[i] = execute_res->dac; + i++; + } + else + { + *state = next_state; + } + mode_pwmp_hd_adjust->ctrl_target += 10; + } + } + } +} + +/*排气值整定*/ +static void pwmp_hd_adjust_step_by_10_to_0(uint8_t *state, mode_pwmp_hd_adjust_state_e next_state) +{ + execute_rsp_hd_t *execute_res; + if (!FSM_IS_WAIT(*state)) + { + mode_pwmp_hd_adjust->ctrl_target = 90; + mode_pwmp_hd_adjust->adjust_state = (mode_pwmp_hd_adjust_state_e)*state; + FSM_WAIT(*state); // 设置等待状态 + } + else + { + static unsigned int i = 0; + /*将模式调整为控制模式*/ + pwmp_control_update(FILTER_MEDIAN); + if (rt_data.loop_current >= 4.0) + { + if (mode_pwmp_hd_adjust->ctrl_target == 0) + { + pdctrl_out(mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin * 0.8); + } + else if (mode_pwmp_hd_adjust->ctrl_target == 100) + { + pdctrl_out(mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin * 1.5); + } + else + { + execute_res = execute_dac(EXECUTE_PLAN); // PID计算结果经过执行器处理 + if (execute_res->code == EXECUTE_HD_OUT) // 执行DAC输出 + { + pdctrl_out(execute_res->dac); + } + } + } + /*当误差大于0.5%时重置等待时间*/ + if (fabs(mode_pwmp_hd_adjust->real_error) > 1) + { + // 此处延时三秒钟 + mode_pwmp_hd_adjust->wait_count = mode_pwmp_hd->wait_count_max * 30; + } + else + { + mode_pwmp_hd_adjust->wait_count--; + if (mode_pwmp_hd_adjust->wait_count == 0) + { + if ((unsigned int)mode_pwmp_hd_adjust->ctrl_target > 0) + { + mode_pwmp_hd_adjust->valvepos.valvepos_de[i] = execute_res->dac; + i++; + } + else + { + *state = next_state; + } + mode_pwmp_hd_adjust->ctrl_target -= 10; + } + } + } +} + +/*将整定出的参数进行保存*/ +static void pwmp_hd_adjust_valvepos_calculate(uint8_t *state, mode_pwmp_hd_adjust_state_e next_state) +{ + *state = next_state; + for (unsigned int i = 0; i < 9; i++) + { + mode_pwmp_hd->valvepos.valvepos_in[i] = mode_pwmp_hd_adjust->valvepos.valvepos_in[i]; + mode_pwmp_hd->valvepos.valvepos_de[i] = mode_pwmp_hd_adjust->valvepos.valvepos_de[i]; + } + for (unsigned int i = 0; i < 8; i++) + { + mode_pwmp_hd->valvepos.valvepos_in_k[i] = mode_pwmp_hd_adjust->valvepos.valvepos_in[i + 1] - mode_pwmp_hd_adjust->valvepos.valvepos_in[i]; + mode_pwmp_hd->valvepos.valvepos_de_k[i] = mode_pwmp_hd_adjust->valvepos.valvepos_de[i + 1] - mode_pwmp_hd_adjust->valvepos.valvepos_de[i]; + mode_pwmp_hd->valvepos.valvepos_in_b[i] = mode_pwmp_hd_adjust->valvepos.valvepos_in[i]; + mode_pwmp_hd->valvepos.valvepos_de_b[i] = mode_pwmp_hd_adjust->valvepos.valvepos_de[i]; + } + mode_pwmp_hd->params_save_cb(); +} + //////////////////////////////////*状态机模式END*////////////////////////////////////////////////////// //////////////////////////////*整定程序入口BEGIN*////////////////////////////////////////////////////// @@ -1406,7 +1653,17 @@ void pwmp_adjust(uint8_t *state) pwmp_adjust_hd_pid_calculate(state, PWMP_HD_ADJUST_SAVE); break; case PWMP_HD_ADJUST_SAVE: - pwmp_adjust_hd_save(state, PWMP_HD_ADJUST_STOP); + pwmp_adjust_hd_save(state, PWMP_HD_ADJUST_STEP_BY_10_TO_100); + break; + /*GPS2000中特有的整定流程,整定得到充排气过程中每百分之10稳定阀位的控制值,并将控制值每10%区间做线性处理*/ + case PWMP_HD_ADJUST_STEP_BY_10_TO_100: + pwmp_hd_adjust_step_by_10_to_100(state, PWMP_HD_ADJUST_STEP_BY_10_TO_0); + break; + case PWMP_HD_ADJUST_STEP_BY_10_TO_0: + pwmp_hd_adjust_step_by_10_to_0(state, PWMP_HD_ADJUST_VALVEPOS_CALCULATE); + break; + case PWMP_HD_ADJUST_VALVEPOS_CALCULATE: + pwmp_hd_adjust_valvepos_calculate(state, PWMP_HD_ADJUST_STOP); break; case PWMP_HD_ADJUST_BLEEDING: pwmp_adjust_hd_bleeding(state); diff --git a/User/application/mode/mode_pwmp_hd.h b/User/application/mode/mode_pwmp_hd.h index 596cbc5..f829f8e 100644 --- a/User/application/mode/mode_pwmp_hd.h +++ b/User/application/mode/mode_pwmp_hd.h @@ -3,7 +3,7 @@ #include "main.h" #define MODE_DEFAULT_AUTOLOAD 99 // 预分频系数 -#define WAIT_COUNT_MAX 2 // 蓝牙等待最大次数 +#define WAIT_COUNT_MAX 2 // 蓝牙等待最大次数 #define VIP_H_EN_HD 1 // 高电压输出开关 ///////////////////////////////////////*算法整定部分宏定义BEGIN*//////////////////////////////////////// @@ -28,6 +28,12 @@ typedef enum PWMP_HD_PROCESS_STOP, } mode_pwmp_hd_process_state_e; // 处理状态 +typedef enum +{ + INFLATE=0, + DEFLATE, +}mode_pwmp_hd_action_e; // 运动状态(充气/排气) + /*需要存储的变量*/ typedef struct { @@ -83,6 +89,22 @@ typedef union typedef struct { + /*充气过程:各百分之十阀位的控制信号值*/ + uint16_t valvepos_in[9]; // 充气过程中9个不同阀位的控制信号值 + /*排气过程:各百分之十阀位的控制信号值*/ + uint16_t valvepos_de[9]; // 排气过程中9个不同阀位的控制信号值 + + float32_t valvepos_in_k[8]; + float32_t valvepos_de_k[8]; + float32_t valvepos_in_b[8]; + float32_t valvepos_de_b[8]; +} mode_pwmp_hd_valvepos_t; + +typedef struct +{ + mode_pwmp_hd_valvepos_t valvepos; // 各稳定阀位控制信号值 + mode_pwmp_hd_action_e action; // 运动状态(充气/排气) + uint8_t lcd_adjust_state; // LCD自整定流程状态 float32 duty_percent; // 占空比 float32 current_electric; // 电流 @@ -96,6 +118,8 @@ typedef struct uint16_t current_adc; // 当前位置反馈的AD值 uint32_t count; // 计数 + float32 valvepos_stable; // 10%-90%阀位之间的稳定控制值 + mode_pwmp_hd_control_t control; mode_pwmp_hd_filter_t filter; mode_pwmp_hd_params_u *pwmp_save; @@ -162,6 +186,9 @@ typedef enum PWMP_HD_ADJUST_BLEEDING, // 在整定状态中放气 PWMP_HD_ADJUST_BLEEDING_POSITION0, // 放气位置0 PWMP_HD_ADJUST_INITIATE, // 启动值 + PWMP_HD_ADJUST_STEP_BY_10_TO_100, // 由0-100找到控制值 + PWMP_HD_ADJUST_STEP_BY_10_TO_0, // 由100-0找到控制值 + PWMP_HD_ADJUST_VALVEPOS_CALCULATE, // 对各区间阀位控制值进行线性化处理 PWMP_HD_ADJUST_STOP, PWMP_HD_ADJUST_FAIL, // 整定失败 PWMP_HD_ADJUST_TEST, @@ -181,9 +208,18 @@ typedef enum PWMP_HD_ADJUST_RESULT_FAIL, } mode_pwmp_hd_adjust_result_e; // 整定结果 +typedef struct +{ + /*充气过程:各百分之十阀位的控制信号值*/ + uint16_t valvepos_in[9]; // 充气过程中9个不同阀位的控制信号值 + /*排气过程:各百分之十阀位的控制信号值*/ + uint16_t valvepos_de[9]; // 排气过程中9个不同阀位的控制信号值 +} mode_pwmp_hd_adjust_valvepos_t; + typedef struct { mode_pwmp_hd_adjust_state_e adjust_state; + mode_pwmp_hd_adjust_valvepos_t valvepos; // 记录处于每10%阀位的控制信号值 volatile uint16_t wait_count; volatile uint16_t psb_adc; @@ -216,6 +252,10 @@ typedef struct uint32_t current_0; // 0位置电流大小 uint32_t current_100; // 100位置电流大小 + float32 ctrl_target; // 控制目标值 + float32 real_error; // 实际误差 + float32 ctrl_feedback;// 反馈值 + /*输出值*/ uint16_t arr_default; // 默认计数器(推动计数值) volatile uint16_t arr_current; // 当前推动阀门的计数器