自整定程序新增各点位稳定信号(可正常运行)

This commit is contained in:
gaoyuhang 2024-06-25 14:35:54 +08:00
parent a6fe9524cd
commit f60f444fe7
4 changed files with 334 additions and 32 deletions

View File

@ -245,6 +245,11 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>udevice,0x0A</ItemText> <ItemText>udevice,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>17</count>
<WinNumber>1</WinNumber>
<ItemText>mode_pwmp_hd-&gt;process_state,0x0A</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<MemoryWindow1> <MemoryWindow1>
<Mm> <Mm>
@ -1505,14 +1510,6 @@
</File> </File>
</Group> </Group>
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>1</RteFlg>
</Group>
<Group> <Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName> <GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<tvExp>0</tvExp> <tvExp>0</tvExp>
@ -1520,7 +1517,7 @@
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>17</GroupNumber> <GroupNumber>16</GroupNumber>
<FileNumber>91</FileNumber> <FileNumber>91</FileNumber>
<FileType>4</FileType> <FileType>4</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
@ -1533,4 +1530,12 @@
</File> </File>
</Group> </Group>
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>1</RteFlg>
</Group>
</ProjectOpt> </ProjectOpt>

View File

@ -1278,9 +1278,6 @@
</File> </File>
</Files> </Files>
</Group> </Group>
<Group>
<GroupName>::CMSIS</GroupName>
</Group>
<Group> <Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName> <GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<GroupOption> <GroupOption>
@ -1379,6 +1376,9 @@
</File> </File>
</Files> </Files>
</Group> </Group>
<Group>
<GroupName>::CMSIS</GroupName>
</Group>
</Groups> </Groups>
</Target> </Target>
</Targets> </Targets>

View File

@ -134,7 +134,7 @@ static void pwmp_control_update(filter_e type)
if (mode_pwmp_hd->process_state == PWMP_HD_PROCESS_ADJUST) 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) 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->small_trip_current_adc = p->small_trip_current_adc;
mode_pwmp_hd_test->ctrl_feedback = p->ctrl_feedback; mode_pwmp_hd_test->ctrl_feedback = p->ctrl_feedback;
mode_pwmp_hd_test->real_error = p->real_error; 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参数获取*/ /*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)); 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 * @brief
* @param {execute_plan_hd_e} plan * @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; Control_diff = mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin - mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin;
float32 out = 0.0; 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); _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 = _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_min_second = 0.2;
static float32 index_max_second = 0.3; static float32 index_max_second = 0.3;
if (fabs(mode_pwmp_hd->control.real_error) >= 5.7) if (mode_pwmp_hd->process_state == PWMP_HD_PROCESS_ADJUST)
{ // 对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); // 映射实际控制器的范围 if (fabs(mode_pwmp_hd->control.real_error) >= 5.7)
out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first; { // 对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); // 映射实际控制器的范围
else if (fabs(mode_pwmp_hd->control.real_error) < 5.7 && fabs(mode_pwmp_hd->control.real_error) >= 1) out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_first;
{ // 对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); // 映射实际控制器的范围 else if (fabs(mode_pwmp_hd->control.real_error) < 5.7 && fabs(mode_pwmp_hd->control.real_error) >= 1)
out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin - Control_diff * index_min_second; { // 对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 else
{ {
out *= (mode_pwmp_hd->pwmp_save->storage.pwmp_max_origin) - (mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin); // 映射实际控制器的范围 if (fabs(mode_pwmp_hd->control.real_error) >= 5.7)
out += mode_pwmp_hd->pwmp_save->storage.pwmp_min_origin; { // 对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 #else
float32 index = fabs(1 - exp(-(pow(mode_pwmp_hd->control.real_error, 2) - 1))); 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) 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); // 映射实际控制器的范围 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_min_origin); {
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 #endif
} }
@ -383,6 +489,7 @@ static execute_rsp_hd_t *execute_dac_plan1()
return &rsp; return &rsp;
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -561,7 +668,7 @@ static void pwmp_adjust_hd_rough_position0(uint8_t *state, mode_pwmp_hd_adjust_s
else 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->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; 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 else
{ {
/*40mm————3016mm————40*/ /*40mm————3016mm————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->last_adc = mode_pwmp_hd_adjust->psb_adc;
mode_pwmp_hd_adjust->arr_last = mode_pwmp_hd_adjust->arr_current; 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; // 将状态切换 *state = next_state; // 将状态切换
} }
/**/
/*参数保存模式*/ /*参数保存模式*/
static void pwmp_adjust_hd_save(uint8_t *state, mode_pwmp_hd_adjust_state_e 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(); 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*////////////////////////////////////////////////////// //////////////////////////////////*状态机模式END*//////////////////////////////////////////////////////
//////////////////////////////*整定程序入口BEGIN*////////////////////////////////////////////////////// //////////////////////////////*整定程序入口BEGIN*//////////////////////////////////////////////////////
@ -1406,7 +1653,17 @@ void pwmp_adjust(uint8_t *state)
pwmp_adjust_hd_pid_calculate(state, PWMP_HD_ADJUST_SAVE); pwmp_adjust_hd_pid_calculate(state, PWMP_HD_ADJUST_SAVE);
break; break;
case PWMP_HD_ADJUST_SAVE: 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; break;
case PWMP_HD_ADJUST_BLEEDING: case PWMP_HD_ADJUST_BLEEDING:
pwmp_adjust_hd_bleeding(state); pwmp_adjust_hd_bleeding(state);

View File

@ -3,7 +3,7 @@
#include "main.h" #include "main.h"
#define MODE_DEFAULT_AUTOLOAD 99 // 预分频系数 #define MODE_DEFAULT_AUTOLOAD 99 // 预分频系数
#define WAIT_COUNT_MAX 2 // 蓝牙等待最大次数 #define WAIT_COUNT_MAX 2 // 蓝牙等待最大次数
#define VIP_H_EN_HD 1 // 高电压输出开关 #define VIP_H_EN_HD 1 // 高电压输出开关
///////////////////////////////////////*算法整定部分宏定义BEGIN*//////////////////////////////////////// ///////////////////////////////////////*算法整定部分宏定义BEGIN*////////////////////////////////////////
@ -28,6 +28,12 @@ typedef enum
PWMP_HD_PROCESS_STOP, PWMP_HD_PROCESS_STOP,
} mode_pwmp_hd_process_state_e; // 处理状态 } mode_pwmp_hd_process_state_e; // 处理状态
typedef enum
{
INFLATE=0,
DEFLATE,
}mode_pwmp_hd_action_e; // 运动状态(充气/排气)
/*需要存储的变量*/ /*需要存储的变量*/
typedef struct typedef struct
{ {
@ -83,6 +89,22 @@ typedef union
typedef struct 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自整定流程状态 uint8_t lcd_adjust_state; // LCD自整定流程状态
float32 duty_percent; // 占空比 float32 duty_percent; // 占空比
float32 current_electric; // 电流 float32 current_electric; // 电流
@ -96,6 +118,8 @@ typedef struct
uint16_t current_adc; // 当前位置反馈的AD值 uint16_t current_adc; // 当前位置反馈的AD值
uint32_t count; // 计数 uint32_t count; // 计数
float32 valvepos_stable; // 10%-90%阀位之间的稳定控制值
mode_pwmp_hd_control_t control; mode_pwmp_hd_control_t control;
mode_pwmp_hd_filter_t filter; mode_pwmp_hd_filter_t filter;
mode_pwmp_hd_params_u *pwmp_save; mode_pwmp_hd_params_u *pwmp_save;
@ -162,6 +186,9 @@ typedef enum
PWMP_HD_ADJUST_BLEEDING, // 在整定状态中放气 PWMP_HD_ADJUST_BLEEDING, // 在整定状态中放气
PWMP_HD_ADJUST_BLEEDING_POSITION0, // 放气位置0 PWMP_HD_ADJUST_BLEEDING_POSITION0, // 放气位置0
PWMP_HD_ADJUST_INITIATE, // 启动值 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_STOP,
PWMP_HD_ADJUST_FAIL, // 整定失败 PWMP_HD_ADJUST_FAIL, // 整定失败
PWMP_HD_ADJUST_TEST, PWMP_HD_ADJUST_TEST,
@ -181,9 +208,18 @@ typedef enum
PWMP_HD_ADJUST_RESULT_FAIL, PWMP_HD_ADJUST_RESULT_FAIL,
} mode_pwmp_hd_adjust_result_e; // 整定结果 } 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 typedef struct
{ {
mode_pwmp_hd_adjust_state_e adjust_state; mode_pwmp_hd_adjust_state_e adjust_state;
mode_pwmp_hd_adjust_valvepos_t valvepos; // 记录处于每10%阀位的控制信号值
volatile uint16_t wait_count; volatile uint16_t wait_count;
volatile uint16_t psb_adc; volatile uint16_t psb_adc;
@ -216,6 +252,10 @@ typedef struct
uint32_t current_0; // 0位置电流大小 uint32_t current_0; // 0位置电流大小
uint32_t current_100; // 100位置电流大小 uint32_t current_100; // 100位置电流大小
float32 ctrl_target; // 控制目标值
float32 real_error; // 实际误差
float32 ctrl_feedback;// 反馈值
/*输出值*/ /*输出值*/
uint16_t arr_default; // 默认计数器(推动计数值) uint16_t arr_default; // 默认计数器(推动计数值)
volatile uint16_t arr_current; // 当前推动阀门的计数器 volatile uint16_t arr_current; // 当前推动阀门的计数器