diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..b4250d8 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,20 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "compilerPath": "C:\\MinGW\\bin\\gcc.exe", + "cStandard": "c11", + "cppStandard": "gnu++14", + "intelliSenseMode": "windows-gcc-x86" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..43b4234 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "C_Cpp.errorSquiggles": "disabled" +} diff --git a/MDK-ARM/RTE/_controller-v2/RTE_Components.h b/MDK-ARM/RTE/_controller-v2/RTE_Components.h index 391636b..481bf87 100644 --- a/MDK-ARM/RTE/_controller-v2/RTE_Components.h +++ b/MDK-ARM/RTE/_controller-v2/RTE_Components.h @@ -1,6 +1,6 @@ /* - * Auto generated Run-Time-Environment Configuration File + * Auto generated Run-Time-Environment Component Configuration File * *** Do not modify ! *** * * Project: 'controller-v2' @@ -17,5 +17,4 @@ #define CMSIS_device_header "stm32l4xx.h" - #endif /* RTE_COMPONENTS_H */ diff --git a/MDK-ARM/controller-v2.uvoptx b/MDK-ARM/controller-v2.uvoptx index feb3eed..f31b880 100644 --- a/MDK-ARM/controller-v2.uvoptx +++ b/MDK-ARM/controller-v2.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 6 + 11 @@ -117,10 +117,15 @@ STLink\ST-LINKIII-KEIL_SWO.dll + + 0 + PWSTATINFO + 200,50,700 + 0 JL2CM3 - -U601012352 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0STM32L4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32L476VGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + -U601012352 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC8000 -FN1 -FF0STM32L4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32L476VGTx$CMSIS\Flash\STM32L4xx_1024.FLM) 0 @@ -140,7 +145,7 @@ 0 ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC8000 -FN1 -FF0STM32L4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32L476VGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + -U73002200150000504A51544E -O206 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC8000 -FN1 -FF0STM32L4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32L476VGTx$CMSIS\Flash\STM32L4xx_1024.FLM) 0 @@ -163,27 +168,27 @@ 1 1 - mode_control,0x0A + pdctrl_data,0x0A 2 1 - mode_control_adjust,0x0A + _pid,0x0A 3 1 - pdctrl_data,0x0A + calib_param 4 1 - _pid + show_loop 5 1 - calib_param + adc2_raw,0x0A 6 @@ -193,22 +198,47 @@ 7 1 - adc2_raw,0x0A + show_actual 8 1 - show_loop + show_target 9 1 - show_actual + mode_pwmp_hd,0x0A 10 1 - show_target + mode_pwmp_hd_adjust,0x0A + + + 11 + 1 + mode_pwmp_hd_test,0x0A + + + 12 + 1 + pid_autotune_hd,0x0A + + + 13 + 1 + pid_target + + + 14 + 1 + raw_adc + + + 15 + 1 + adc_raw,0x0A @@ -263,7 +293,6 @@ 1 - 0 0 2 10000000 diff --git a/MDK-ARM/controller-v2.uvprojx b/MDK-ARM/controller-v2.uvprojx index 6e5ce3e..c806e9a 100644 --- a/MDK-ARM/controller-v2.uvprojx +++ b/MDK-ARM/controller-v2.uvprojx @@ -10,14 +10,14 @@ controller-v2 0x4 ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC + 5060061::V5.06 update 1 (build 61)::ARMCC 0 STM32L476VGTx STMicroelectronics - Keil.STM32L4xx_DFP.2.6.2 - https://www.keil.com/pack/ + Keil.STM32L4xx_DFP.2.1.0 + http://www.keil.com/pack IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 DSP CLOCK(12000000) ELITTLE @@ -184,8 +184,6 @@ 0 0 1 - 0 - 0 1 0 8 @@ -352,7 +350,7 @@ 0 0 0 - 1 + 0 @@ -1257,7 +1255,7 @@ 2 2 2 - 0 + 2 @@ -1341,7 +1339,7 @@ 2 2 2 - 1 + 2 @@ -1398,13 +1396,4 @@ - - - - controller-v2 - 1 - - - - diff --git a/User/application/mode/说明/智能阀门定位器DAC输出控制模块软件说明.docx b/User/application/mode/README/智能阀门定位器DAC输出控制模块软件说明.docx similarity index 100% rename from User/application/mode/说明/智能阀门定位器DAC输出控制模块软件说明.docx rename to User/application/mode/README/智能阀门定位器DAC输出控制模块软件说明.docx diff --git a/User/application/mode/说明/智能阀门定位器pwm定频输出软件说明.docx b/User/application/mode/README/智能阀门定位器pwm定频输出软件说明.docx similarity index 100% rename from User/application/mode/说明/智能阀门定位器pwm定频输出软件说明.docx rename to User/application/mode/README/智能阀门定位器pwm定频输出软件说明.docx diff --git a/User/application/mode/mode_pwmp_hd.c b/User/application/mode/mode_pwmp_hd.c index 0b72d9b..e08662c 100644 --- a/User/application/mode/mode_pwmp_hd.c +++ b/User/application/mode/mode_pwmp_hd.c @@ -23,6 +23,7 @@ pwmp_hd_adjust_t *mode_pwmp_hd_adjust; pid_autotune_hd_t *pid_autotune_hd; pwmp_hd_test_t *mode_pwmp_hd_test; execute_rsp_hd_t rsp; // 执行结果 +mode_pwmp_hd_valve_type_e valve_type_hd = ANGULAR_TRAVEL; static execute_rsp_hd_t *execute_dac_plan1(void); // 执行方案1 static execute_rsp_hd_t *execute_dac_plan2(void); // 执行方案2 @@ -177,14 +178,28 @@ static float32 get_pwmp_hd_control_kp(void) static float32 get_pwmp_hd_control_ki(void) { - return mode_pwmp_hd->pwmp_save->storage.ki < 0.001 ? mode_pwmp_hd->pwmp_save->storage.ki * 10 : 0.01; - // return mode_pwmp_hd->pwmp_save->storage.ki; + return mode_pwmp_hd->pwmp_save->storage.ki < 0.001 ? mode_pwmp_hd->pwmp_save->storage.ki * 20 : 0.01; } static float32 get_pwmp_hd_control_kd(void) { // return mode_pwmp_hd->pwmp_save->storage.kd < 0.01 ? mode_pwmp_hd->pwmp_save->storage.kd : 0.001; - return mode_pwmp_hd->pwmp_save->storage.kd; + if (valve_type_hd == LINEAR_TRAVEL) + { + return mode_pwmp_hd->pwmp_save->storage.kd = 0; + } + else + { + + if (mode_pwmp_hd->pwmp_save->storage.kd <= 20) + { + return mode_pwmp_hd->pwmp_save->storage.kd; + } + else + { + return mode_pwmp_hd->pwmp_save->storage.kd = 20; + } + } } /*将自己结构体变量中的参数保存到公共参数中*/ @@ -267,8 +282,6 @@ execute_rsp_hd_t *execute_dac(execute_plan_hd_e plan) } static execute_rsp_hd_t *execute_dac_plan1() { - static float32 index_min = 0.4; // 加权系数 - static float32 index_max = 0.8; static float32 Control_diff; // uint8_t flag_stable = 0; Control_diff = mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin - mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin; @@ -276,91 +289,65 @@ static execute_rsp_hd_t *execute_dac_plan1() // 杭电:输出限幅的参数设置 _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); - out = out / 100; // 对PID输出结果进行归一化处理 - out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin + Control_diff * index_max) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min); // 映射实际控制器的范围 - out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min; // 对输出结果进行偏移处理 + out = out / 100; + if (valve_type_hd == LINEAR_TRAVEL) + { + /* 一阶段加权系数*/ + static float32 index_min_first = 0.5; + static float32 index_max_first = 0.5; + /*二阶段加权系数*/ + static float32 index_min_second = 0.3; + 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; + } + 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 if (valve_type_hd == ANGULAR_TRAVEL) + { + /* 一阶段加权系数*/ + static float32 index_min_first = 1.2; + static float32 index_max_first = 1.2; + /*二阶段加权系数*/ + static float32 index_min_second = 0.8; + static float32 index_max_second = 0.8; + /*三阶段加权系数*/ + static float32 index_min_third = 0; + static float32 index_max_third = 0; + 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 - Control_diff * index_max_third) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin + Control_diff * index_min_third); // 映射实际控制器的范围 + out += (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin + Control_diff * index_min_third); + } + } rsp.code = EXECUTE_HD_OUT; rsp.dac = (uint32_t)out; - /* - /// 在执行了十次之后若系统认为稳定进入以下程序进行微调(非线性补偿器) - if (execute_run_count >= 10) - { - if ( rt_data.actual_travel < target_travel) - { - if (fabs(mode_pwmp_hd->control.real_error) <= 0.5) - { - if (flag_stable == 1) - { - rsp.dac -= 0; - flag_stable = 0; - } - execute_run_count = 0; - } - else - { - if (fabs(mode_pwmp_hd->control.real_error) < 1) - { - // rsp.dac += (fabs(mode_pwmp_hd->control.real_error) * 40); - rsp.dac += (fabs(mode_pwmp_hd->control.real_error) * 0); - flag_stable = 1; - } - else if (fabs(mode_pwmp_hd->control.real_error) < 5) - { - // rsp.dac += (fabs(mode_pwmp_hd->control.real_error) * 30); - rsp.dac += (fabs(mode_pwmp_hd->control.real_error) * 0); - } - else - { - execute_run_count = 0; - } - } - } - if (target_travel <= rt_data.actual_travel) - { - // 若进入死区范围,那么停止计数,停止微调 - if (fabs(mode_pwmp_hd->control.real_error) <= 0.5) - { - if (flag_stable == 1) - { - rsp.dac += 0; - flag_stable = 0; - } - execute_run_count = 0; - } - else - { - if (fabs(mode_pwmp_hd->control.real_error) < 1) - { - rsp.dac += -(fabs(mode_pwmp_hd->control.real_error) * 0); - // rsp.dac += -(fabs(mode_pwmp_hd->control.real_error) * 40); - flag_stable = 1; - } - else if (fabs(mode_pwmp_hd->control.real_error) < 5) - { - // rsp.dac += -(fabs(mode_pwmp_hd->control.real_error) * 30); - rsp.dac += (fabs(mode_pwmp_hd->control.real_error) * 0); - } - else - { - execute_run_count = 0; - } - // execute_run_count = 2; - } - } - } - else - { - execute_run_count++; - } - */ - return &rsp; } - /// /// /// @@ -777,7 +764,6 @@ static void pwmp_adjust_hd_rough_position100(uint8_t *state, mode_pwmp_hd_adjust return; } - sys_millis_reset(); mode_pwmp_hd_adjust->all_open_time_full = sys_millis(); // 记录全开起始时间 mode_pwmp_hd_adjust->tmp_time = 0; @@ -906,7 +892,6 @@ static void pwmp_adjust_hd_all_close_time(uint8_t *state, mode_pwmp_hd_adjust_st mode_pwmp_hd_adjust->arr_current = mode_pwmp_hd_adjust->arr_record_0 - 100; // 此处的输入信号大小根据实际控制的最小值来设定 /*记录起始的全开时间*/ - sys_millis_reset(); mode_pwmp_hd_adjust->all_close_time = sys_millis(); mode_pwmp_hd_adjust->tmp_time = 0; @@ -941,7 +926,6 @@ static void pwmp_adjust_hd_all_open_time(uint8_t *state, mode_pwmp_hd_adjust_sta mode_pwmp_hd_adjust->arr_current = mode_pwmp_hd_adjust->arr_record_2 + 100; // 此处的输入信号大小根据实际控制的最大值来设定 /*记录起始的全开时间*/ - sys_millis_reset(); mode_pwmp_hd_adjust->all_open_time = sys_millis(); mode_pwmp_hd_adjust->tmp_time = 0; diff --git a/User/application/mode/mode_pwmp_hd.h b/User/application/mode/mode_pwmp_hd.h index c4c30c9..31a5d5d 100644 --- a/User/application/mode/mode_pwmp_hd.h +++ b/User/application/mode/mode_pwmp_hd.h @@ -20,6 +20,11 @@ /*----------------------------------------*/ typedef enum +{ + ANGULAR_TRAVEL, + LINEAR_TRAVEL, +} mode_pwmp_hd_valve_type_e; // 阀门类型 +typedef enum { PWMP_HD_PROCESS_CONTROL, PWMP_HD_PROCESS_ADJUST, diff --git a/User/application/src/params.c b/User/application/src/params.c index 81bc3a6..50f9fcc 100644 --- a/User/application/src/params.c +++ b/User/application/src/params.c @@ -144,7 +144,7 @@ void params_restart(void) // 执行机构行程类型:直行程/角行程 TRAVEL_TYPE_STRAIGHT/TRAVEL_TYPE_ANGULAR udevice.value_travel_type = TRAVEL_TYPE_STRAIGHT; // 执行机构气动类型:气开/气关 ATO/ATC - udevice.value_action_type = ATO; + udevice.value_action_type = ATC; // 执行机构作用类型:单作用/双作用 udevice.value_relay_type = VALVE_ACTING_SINGLE; @@ -335,6 +335,9 @@ void params_restart(void) // 回路电流 calib_param[CALIBPARA_LOOP].value[0] = 0.611153543; calib_param[CALIBPARA_LOOP].value[1] = 2.1390624; + // // 回路电流 + // calib_param[CALIBPARA_LOOP].value[0] = 0.609059751; + // calib_param[CALIBPARA_LOOP].value[1] = -0.761328101; // 4~20ma PWM输出校准 set_pwm_calib_current(); diff --git a/User/lib/control/custom/pid_hd.c b/User/lib/control/custom/pid_hd.c index d151da6..fb4a709 100644 --- a/User/lib/control/custom/pid_hd.c +++ b/User/lib/control/custom/pid_hd.c @@ -3,11 +3,6 @@ #include "sys.h" #include "app.h" -float32 out_pos; // 位置式pid输出 -float32 Kp_watch; // 观测Kp的大小 -float32 Ki_watch; // 观测Kp的大小 -float32 Kd_watch; // 观测Kp的大小 - #if INCOMPLETE_DIFFEREN_HD == 1 // 积分分离 /*计算微分项,使用追随误差微分项*/ static float32 td_derivative(struct PID_HD *self, float32 current_err, float32 pre_err, float32 dt) @@ -27,9 +22,6 @@ static void _set_ctrl_prm_position(struct PID_HD *self, float32 kp, float32 ki, osel_memset((uint8_t *)pri, 0, sizeof(pid_hd_position_t)); /*观测传进来的Kp、Ki、Kd*/ - Kp_watch = kp; - Ki_watch = ki; - Kd_watch = kd; pri->kp = kp; pri->ki = ki; @@ -50,12 +42,11 @@ static void _set_out_prm_position(struct PID_HD *self, float32 maximum, float32 self->pri_u.position.out_min = minimum; } -float32 out_pos_watch; /*杭电:位置式PID控制算法*/ static float32 _pid_position(struct PID_HD *self, float32 err) { /*计算控制的运行时间*/ - sys_millis_reset(); + // sys_millis_reset(); self->pri_u.position.control_time = sys_millis(); self->pri_u.position.tmp_time = 0; @@ -127,9 +118,7 @@ static float32 _pid_position(struct PID_HD *self, float32 err) // self->pri_u.position.out = self->pri_u.position.pre_out; x[0] = self->pri_u.position.err; x[1] = self->pri_u.position.ki_error; - out_pos = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2]; - out_pos_watch = out_pos; - self->pri_u.position.out = out_pos; + self->pri_u.position.out = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2]; } else { @@ -147,9 +136,7 @@ static float32 _pid_position(struct PID_HD *self, float32 err) x[2] = self->pri_u.position.err - self->pri_u.position.pre_error; #endif - out_pos = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2]; - out_pos_watch = out_pos; - self->pri_u.position.out = out_pos; + self->pri_u.position.out = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2]; } /*输出限幅*/ @@ -167,7 +154,6 @@ static float32 _pid_position(struct PID_HD *self, float32 err) // 更新输出历史 self->pri_u.position.pre_out = self->pri_u.position.out; /*上一次输出值*/ - out_pos = self->pri_u.position.out; return self->pri_u.position.out; }