伺服驱动器代码使伺服行为奇怪

时间:2015-03-05 20:31:45

标签: c++ arduino

我试图在不使用Arduino库的情况下实现伺服驱动程序。但我实现的是奇怪的伺服行为,它向右移动但不想返回到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);
}

我失踪的地方?有人可以告诉我一些建议如何实现吗?

1 个答案:

答案 0 :(得分:4)

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

PS。编写适当的伺服代码需要付出很多努力,必须使用低级定时器和中断服务程序。

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