有没有办法阻止伺服系统“摇晃”?

电器工程 Arduino 伺服
2022-01-21 03:34:41

很简单,我根据从其他地方读取的一些数据来控制伺服系统(9g 微型伺服系统)。一切正常,只是伺服系统会不断“摇晃”。也就是说,它们会以非常细微的运动(间歇性运动 1/2 -> 1cm 左右)向后振动。

我尝试通过执行以下操作在软件中纠正此问题:

  do{
    delay(DTIME);
    positionServo();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("X position: ");
    lcd.print(xRead);
    lcd.setCursor(0,1);
    lcd.print("Y position: ");
    lcd.print(yRead);
  }while( readChange() ); //while there has been change

在需要执行的情况下,初始化存储映射伺服值的变量(使用 arduino 伺服库。)

readChange() 函数定义为:

int readChange(){
  int x_Temp, y_Temp;

  x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
  y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);

  if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change 
  else return 1; //change
}

其中 xRead 是初始化的值(第一个映射的伺服输出。)

这确实不是一个好方法。它要求两个值都不能改变 DEG 系数(在我的情况下约为 10 度,或 ~0.28V。)如果我编写函数使得 OR 小于 DEG,那么如果我只改变一个呢一次伺服?所以有一个界限。

这仅仅是伺服系统的属性(也许是便宜的?)还是有解决方法?


包含一个粘贴链接会简单得多。这是完整的代码。

我已经将两个伺服系统与一个激光指示器连接在一起,以允许两个自由度(X,Y)。根据几个按钮的状态,可以选择以各种方式控制伺服系统。第一个是“运动”,我有两个光敏电阻,根据曝光量,影响伺服系统的位置。我还没有实现通过 Xbox 控制器控制伺服系统的代码。第三种选择只是随机运动。

在此处输入图像描述

4个回答

在 Arduino 上使用伺服库时,伺服嗡嗡声的常见来源是中断驱动的伺服程序实际上并没有提供非常稳定的输出脉冲。因为 AVR 在 Arduino 运行时为毫秒()时钟和其他东西提供服务时需要中断,所以伺服库中的抖动大约为几微秒,这转化为伺服中的大量运动。

解决此问题的方法是编写自己的脉搏。像这样的东西:

cli();
long start = micros();
digitalWrite(PIN, HIGH);
while (micros() - start < duration)
  ;
digitalWrite(PIN, LOW);
sei();

这将关闭其他中断,并生成更清晰的 PWM 脉冲。但是,它会使“millis() 计时器错过一些时钟滴答。(“micros()”函数可能被称为其他东西——我忘记了具体是什么。)

一般来说,对于时序关键代码,您希望完全摆脱 Arduino 运行时,并使用支持 Arduino 环境的 avr-gcc 编译器和 avr-libc 库编写自己的运行时。然后,您可以设置一个计时器,使其每微秒滴答 4 次,甚至每微秒 16 次,并在您的 PWM 中获得更好的分辨率。

伺服系统嗡嗡声的另一个原因是带有廉价传感器的廉价伺服系统,其中传感器有噪音,或者当传感器实际上无法对脉冲请求的确切位置进行编码时。伺服器将看到“移动到位置 1822”并尝试执行此操作,但最终传感器读数为 1823。然后伺服器将说“向后移动一点”,并以传感器读数 1821 结束。重复!解决此问题的方法是使用高质量的伺服系统。理想情况下,根本不是爱好伺服器,而是带有光学或磁性绝对编码器的真正伺服器。

最后,如果伺服系统没有获得足够的电力,或者如果您尝试从 Arduino 上的 5V 导轨驱动它们的电力,这将在伺服系统中产生电压暂降引起的嗡嗡声,如上所述。您可能可以使用大型电解电容器来修复它(无论如何这对于一般滤波来说都是一个好主意),但您更可能希望确保您的伺服电源实际上可以在伺服电压下提供几安培的电流。

这被称为“嗡嗡声”。

有几件事会导致它。伺服电源不稳定是常见原因。R/C 伺服系统在首次启动电机时会产生一些大尖峰。

很多年前,我玩过 Tower Hobbies Royal Titan Standard 伺服,通过 555 和单晶体管逆变器控制它。非常简单的控制电路。我了解到伺服电机在连续运动时从 5V 电源中汲取 250 mA 电流。嗡嗡声,它很容易吸引半安培尖峰。(也许更多:我只是在监控我的台式电源上的电流表,而不是确定电流感应分流器的范围。)

我的伺服系统直接用了 220 uF 来驯服它。

尝试将至少 100 uF 的电解电容器直接连接到伺服的电源,尽可能靠近伺服,看看是否有帮助。

基于这些实验,我永远不会考虑在不添加电容器的情况下使用 R/C 伺服系统。这包括无线电控制模型。

这也可能是由伺服内部伺服锅中的污垢引起的。先试试电容。

您的嗡嗡声/震动是否仅在达到或接近伺服限制(0 度或 180 度)时发生?如果是这样,可能会有一个简单的解决方法。我发现便宜的舵机不知道如何很好地保持在它们的运动极限,这可能会导致你提到的嗡嗡声/震动。但是,如果您只是将它们的范围限制在 10~170 度,问题就会得到解决。

如果这对您来说还不够好,您可以遵循其他答案中提到的更复杂的修复,例如更好的功率、更好的伺服传感器等。

在我移动它后,我通过“关闭伺服”解决了我的问题。例子:

pinMode(PIN, OUTPUT);
myservo.write(degree);
//give servo time to move
delay(5000);
pinMode(PIN, INPUT);

PIN是连接到伺服器的 PWM 引脚。通过将其切换到输入模式,我能够关闭振动。这不是最佳解决方案,我建议先尝试其他解决方案。