如何改进 Nios 2 的临时巡航控制系统?
How can I improve my ad hoc cruise control system for Nios 2?
我用 Nios 2 写了一个 ad hoc cruise control system 用于学校作业。我用 github 对其进行了版本控制。我们希望巡航控制在速度 >= 25 m/s 时最多相差 2 m/s。我能做的最新改进是检查确实改善控制的条件下的速度。在尝试更改之前我无法证明更改会产生影响,因此这是一种不太好的临时试错方法。现在,巡航控制系统在激活时实际上将速度保持在 2 m/s 以内。改进了一次还能做什么?我可以使用控制理论中的某些东西来改进行为吗?
/*
* The task 'ControlTask' is the main task of the application. It reacts
* on sensors and generates responses.
*/
void ControlTask(void* pdata)
{
INT8U err;
INT8U throttle = 40; /* Value between 0 and 80, which is interpreted as between 0.0V and 8.0V */
void* msg;
INT16S* current_velocity;
int btn_reg;
INT16S* current_output;
printf("Control Task created!\n");
while (1)
{
OSSemPend(aSemaphore, 1, &err); // Trying to access the key
msg = OSMboxPend(Mbox_Velocity, 0, &err);
current_velocity = (INT16S*) msg;
printf("Control Task!\n");
ButtonIO(current_velocity, throttle);
btn_reg = IORD_ALTERA_AVALON_PIO_DATA(DE2_PIO_KEYS4_BASE);
printf("btn_reg %d\n", btn_reg);
if (btn_reg == 7) {
++throttle;
} else if (cruise_control_increase_velocity == 1) {
printf("increase velocity \n");
if (*current_velocity <= cruise_velocity) {
throttle = throttle + 15;
}
cruise_control_increase_velocity = 0;
}
else if (btn_reg == 11) {
if (throttle > 0) {
--throttle;
}
} else if (cruise_control_decrease_velocity == 1) {
printf("decrease_velocity \n");
if (throttle >= 15 && current_velocity >= cruise_velocity) {
throttle = throttle -15;
}
cruise_control_decrease_velocity = 0;
}
if (btn_reg== 13) {
printf("do cruise control\n" );
cruise_velocity = *current_velocity;
}
Button1IO(current_velocity);
SwitchIO(current_velocity, getGlobalPosition());
err = OSMboxPost(Mbox_Throttle, (void *) &throttle);
}
}
将控制任务与I/O明确分开。它们有不同的实时要求,在同一个任务循环中执行两者可能不利于控制稳定性;尽管对于机动车辆等响应缓慢的系统,它可能并不重要,但将这些活动分开仍然具有良好的设计意义。
使用经典的 PID 控制回路,其中 error 输入为 实际速度 - 目标速度,输出为节气门位置。 I(积分)增益确保足够的油门以在稳态条件下保持速度,P(比例)增益控制加速的积极性。而 D(导数)增益阻尼响应以最小化 overshoot/undershoot,并提高对突然变化(例如山丘)的响应。对于具有大量滞后的非对称非线性系统,调整控制回路可能并不简单,您需要避免对系数过于激进。然而,过阻尼响应可能有利于乘客的舒适度和燃料消耗。 I 项可能应该被限制以防止 "wind-up",例如,如果无法密切跟踪目标速度,这可能会导致在爬上陡峭的山坡时突然加速。
Avoid global variables。代码按24个全局变量的顺序发布到本站外部。
我用 Nios 2 写了一个 ad hoc cruise control system 用于学校作业。我用 github 对其进行了版本控制。我们希望巡航控制在速度 >= 25 m/s 时最多相差 2 m/s。我能做的最新改进是检查确实改善控制的条件下的速度。在尝试更改之前我无法证明更改会产生影响,因此这是一种不太好的临时试错方法。现在,巡航控制系统在激活时实际上将速度保持在 2 m/s 以内。改进了一次还能做什么?我可以使用控制理论中的某些东西来改进行为吗?
/*
* The task 'ControlTask' is the main task of the application. It reacts
* on sensors and generates responses.
*/
void ControlTask(void* pdata)
{
INT8U err;
INT8U throttle = 40; /* Value between 0 and 80, which is interpreted as between 0.0V and 8.0V */
void* msg;
INT16S* current_velocity;
int btn_reg;
INT16S* current_output;
printf("Control Task created!\n");
while (1)
{
OSSemPend(aSemaphore, 1, &err); // Trying to access the key
msg = OSMboxPend(Mbox_Velocity, 0, &err);
current_velocity = (INT16S*) msg;
printf("Control Task!\n");
ButtonIO(current_velocity, throttle);
btn_reg = IORD_ALTERA_AVALON_PIO_DATA(DE2_PIO_KEYS4_BASE);
printf("btn_reg %d\n", btn_reg);
if (btn_reg == 7) {
++throttle;
} else if (cruise_control_increase_velocity == 1) {
printf("increase velocity \n");
if (*current_velocity <= cruise_velocity) {
throttle = throttle + 15;
}
cruise_control_increase_velocity = 0;
}
else if (btn_reg == 11) {
if (throttle > 0) {
--throttle;
}
} else if (cruise_control_decrease_velocity == 1) {
printf("decrease_velocity \n");
if (throttle >= 15 && current_velocity >= cruise_velocity) {
throttle = throttle -15;
}
cruise_control_decrease_velocity = 0;
}
if (btn_reg== 13) {
printf("do cruise control\n" );
cruise_velocity = *current_velocity;
}
Button1IO(current_velocity);
SwitchIO(current_velocity, getGlobalPosition());
err = OSMboxPost(Mbox_Throttle, (void *) &throttle);
}
}
将控制任务与I/O明确分开。它们有不同的实时要求,在同一个任务循环中执行两者可能不利于控制稳定性;尽管对于机动车辆等响应缓慢的系统,它可能并不重要,但将这些活动分开仍然具有良好的设计意义。
使用经典的 PID 控制回路,其中 error 输入为 实际速度 - 目标速度,输出为节气门位置。 I(积分)增益确保足够的油门以在稳态条件下保持速度,P(比例)增益控制加速的积极性。而 D(导数)增益阻尼响应以最小化 overshoot/undershoot,并提高对突然变化(例如山丘)的响应。对于具有大量滞后的非对称非线性系统,调整控制回路可能并不简单,您需要避免对系数过于激进。然而,过阻尼响应可能有利于乘客的舒适度和燃料消耗。 I 项可能应该被限制以防止 "wind-up",例如,如果无法密切跟踪目标速度,这可能会导致在爬上陡峭的山坡时突然加速。
Avoid global variables。代码按24个全局变量的顺序发布到本站外部。