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

标签 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);
}

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

最佳答案

您误解了 Helm 机的工作原理。首先,它们必须有 ~700~2300us 的高脉冲。一个 1500us 长的高脉冲将使伺服居中。使用以毫秒为单位的延迟将不起作用。您必须使用 delayMicroseconds。此外,即使是脉冲中最轻微的时间抖动也会导致伺服抖动。

因此,重新编写代码并重新发布。您可以让它与 delayMicroseconds 一起工作(我已经做到了),但它不会很好地工作。我建议您编写代码以在一个方向上为“满”产生 1000us 的高脉冲,在另一个方向上为“满”产生 2000us 的高脉冲,开始。一旦开始工作,您可以调整这些值以查看伺服系统在一个方向或另一个方向上真正接受的完整命令。

此外,如果您想要一个一致的 20 毫秒完整周期,请务必调整每个脉冲结束后的等待时间。例如:如果你的高脉冲是1000us,那么你的低脉冲应该是19000us,以保持稳定的50Hz输出信号,这被认为是标准的。也考虑使用 map() 函数。我强烈建议您使用 Servo 库。你为什么不想使用它?

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

关于c++ - 伺服驱动程序代码使伺服行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28887163/

相关文章:

c++ - 使用Arduino的不同大小的多维数组

Arduino 电容式传感器库

c++ - 可以启用 libc++ 调试检查吗?

c++ - Arduino 替换 : with _

c++ - 如何从 'char const*' 中删除常量

c++ - Arduino有平台宏吗?

C++一旦设置就使变量常量

c# - Windows Kinect SDK + OpenNI Primesense

c - 使用指针获取数组的长度

C++ 多个库定义相同的类名