伺服驱动程序代码使伺服行为异常

Servo driver code makes servo behaving oddly

我正在尝试在不使用 Arduino 库的情况下实现伺服驱动程序。但是我正在实现的是奇怪的伺服行为,它向右移动但不希望 return 到 0 度。这是我的代码(它又快又脏):

void setup() {
  // put your setup code here, to run once:
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  for(int i = 0; i < 180; i++)
  {
    setServo(i);
  }
  for(int i = 180; i > 0; i--)
  {
    setServo(i);
  }
}

void setServo(float angle)
{

  float out = (angle * 2) / 180;
  Serial.println(out);
  digitalWrite(9, HIGH);
  delay(out);
  digitalWrite(9, LOW);
  delay(20);
}

我哪里漏掉了?有人可以告诉我一些如何实施的建议吗?

你误解了舵机的工作原理。首先,它们必须有 ~700~2300us 的高脉冲。一个 1500us 长的高脉冲将使伺服居中。使用以毫秒为单位的延迟将不起作用。您必须使用 delayMicroseconds。此外,即使是脉冲中最轻微的时间抖动也会导致伺服抖动。所以,重新编写你的代码并再次发布它,如果我有时间我会帮助你。你可以让它与 delayMicroseconds 一起工作(我已经做到了),但它不会很好地工作。我建议您编写代码以在一个方向上为 "full" 产生 1000us 的高脉冲,在另一个方向上为 "full" 产生 2000us 的高脉冲,以开始。一旦你开始工作,你可以调整这些值来查看伺服在一个方向或另一个方向上真正接受的完整命令。此外,如果您想要一个一致的 20 毫秒完整周期,请务必在每个脉冲结束后调整您的等待时间。例如:如果你的高脉冲是1000us,那么你的低脉冲应该是19000us,以保持稳定的50Hz输出信号,这被认为是标准的。也考虑使用 map() 函数。我强烈建议您使用 Servo 库。你为什么不想用它?

PS。编写正确的伺服代码需要付出很大的努力,并且必须使用低级定时器和中断服务程序来完成。

如果有帮助,请标记为答案。