上一次我们学习了开环控制与反馈控制之间的区别,并建立了最简单的反馈控制类型,称为开/关控制。当我们运行这种控制算法时,我们发现我们的控制是不稳定的。今天我们将学习两种方法来提高我们控制的稳定性。第一种方法是继续使用开/关控制,但调整速度(Speed)、稳定性(Stability)和准确性(Accuracy)之间的权衡。
当我们实现控制算法时,这三者是我们控制好坏的主要衡量标准。以一个滑块控制为例,速度指的是滑块从起始位置移动到结束位置的速度。稳定性与运动的平滑性有关,我们希望滑块在最终位置附近不要有太多的抖动。当关节超过其目标点然后又返回时,这被称为超调(overshoot),通常这是不受欢迎的。如果关节在其目标位置附近无限期地振荡,那被称为不稳定( instability),这真的很糟糕,最终会对运动机构造成破坏。
运动控制好坏的第三个衡量标准是准确性,它指的是定位中的误差有多小。例如,如果我们试图移动齿轮到1000位置,是否刚好顶在1000位置,还是停在其他诸如1010位置停止。
现在,为了帮助我们观察这三个控制好坏的衡量标准,让我们首先人为地使我们的控制比实际情况更糟,改变我们在循环末尾等待的时间延迟,从100毫秒改为10毫秒。
void loop() {
// Read the current encoder position
currentPosition = myEncoder.read();
// Print positions for debugging
Serial.print("Current Position: ");
Serial.print(currentPosition);
Serial.print(" | Target Position: ");
Serial.println(targetPosition);
// Check if the motor needs to move to reach the target position
if (currentPosition < targetPosition) {
// Rotate forward
digitalWrite(IN1, HIGH); // Forward direction
digitalWrite(IN2, LOW);
analogWrite(ENABLE1, 50); // Adjust speed (20 out of 255)
} else if (currentPosition > targetPosition) {
// Rotate backward
digitalWrite(IN1, LOW); // Backward direction
digitalWrite(IN2, HIGH);
analogWrite(ENABLE1, 50); // Adjust speed
} else {
// Stop the motor when the target position is reached
analogWrite(ENABLE1, 0); // Stop motor by setting speed to 0
}
delay(10); // Small delay for stability
}

如果我们想保持同一种类型的控制,在这种情况下是开/关,我们想提高三个目标中的一个:速度、稳定性或准确性,我们将需要在其他两个目标中的一个或两个上做出一点牺牲。例如,我们可以通过牺牲一些准确性来提高这种控制的稳定性。
现在我们的代码说,我们只有在位置完全等于目标位置时才会停止电机。让我们在这里增加一点允许的误差。这里我们将允许电机在目标位置的正负18计数内停止,而不是只在电机正好在目标位置时才关闭。
// Check if the motor needs to move to reach the target position
if (currentPosition < targetPosition - 18) {
// Rotate forward
digitalWrite(IN1, HIGH); // Forward direction
digitalWrite(IN2, LOW);
analogWrite(ENABLE1, 50); // Adjust speed (200 out of 255)
} else if (currentPosition > targetPosition + 18) {
// Rotate backward
digitalWrite(IN1, LOW); // Backward direction
digitalWrite(IN2, HIGH);
analogWrite(ENABLE1, 50); // Adjust speed
} else {
// Stop the motor when the target position is reached
analogWrite(ENABLE1, 0); // Stop motor by setting speed to 0
}
这次运动是稳定的,但它仍然有超调,滑块振荡了一会儿,然后停止了。这是稳定的运动,但仍然不是理想的。

除了降低运动的准确性外,还有另一种方法可以提高稳定性,那就是在速度上妥协。回到代码中,让我们将50比较值改为20,这将降低运动的速度。这次运动非常稳定,几乎没有振荡。

现在回到代码中,让我们提高准确性。现在我们已经通过使用较少的准确性和较少的速度稳定了运动,让我们看看当我们使运动更准确时会发生什么。让我们将准确性改回5。如果我们提高准确性,你认为会发生什么?你认为稳定性会发生什么变化?

精度改为5,震荡重新出现
每当我们在速度、稳定性或准确性这三个目标中的一个上取得进展时,我们就会在另一个目标上做出一点牺牲。所以当我们提高准确性时,我们牺牲了更多的稳定性。
在这个讲座中,我们学习了提高我们控制响应的两种可能方法之一,那就是调整速度、稳定性和准确性之间的权衡。在下一个讲座中,我们将学习第二种方法来提高我们的控制响应,那就是尝试使用不同的控制算法。在下一篇讲座中,我们将看一种称为比例控制的线性控制算法。