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;
}