-1

我在 Nios 2 中为学校作业编写了一个临时巡航控制系统。我用 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);
    }
}
4

1 回答 1

1
  • 将控制任务与 I/O 明确分离。它们具有不同的实时性要求,并且在同一任务循环中执行两者可能不利于控制稳定性;尽管对于像机动车辆这样响应缓慢的系统,这可能并不重要,但将这些活动分开仍然具有很好的设计意义。

  • 使用经典的PID控制回路,其中误差输入是实际速度-目标速度,输出是油门位置I (积分)增益确保足够的油门以在稳态条件下保持速度,P(比例)增益控制加速的积极性。而D(导数)增益衰减响应以最小化过冲/下冲,并改善对山坡等突然变化的响应。对于具有大量滞后的不对称非线性系统,调整控制回路可能并不简单,您需要避免对系数过于激进。然而,过度阻尼响应可能有利于乘客舒适度和燃料消耗。I项可能应该被限制为防止“上风”,例如,如果无法密切跟踪目标速度,这可能会导致在登顶陡峭的山坡时突然加速。

  • 避免全局变量。该代码按照 24 个全局变量的顺序发布到该站点的外部。

于 2015-03-12T22:47:38.890 回答