我试图在不使用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);
}
我想念的地方在哪里?有人可以告诉我一些实施建议吗?
最佳答案
您误解了伺服器的工作方式。首先,它们必须具有〜700〜2300us的高脉冲。 1500us长的高脉冲将使伺服器居中。使用毫秒为单位的延迟将不起作用。您必须使用delayMicroseconds。此外,即使是脉冲中最短的时间抖动,也会导致伺服器抖动。因此,重新编写您的代码,然后重新发布,如果有时间,我会为您提供帮助。您可以使它与delayMicroseconds一起工作(我已经做到了),但效果不佳。我建议您编写代码以使一个方向上的“满”脉冲为1000us,另一个方向上的“满”脉冲为2000us。一旦工作,您就可以调整这些值,以查看伺服器在一个方向或另一个方向上将完全接受的命令。另外,如果您要始终保持20ms的持续时间,请务必在每个脉冲结束后调整等待时间。例如:如果您的高脉冲是1000us,那么您的低时间应该是19000us,以保持稳定的50Hz输出信号,这被认为是标准的。也考虑使用map()函数。我强烈建议您使用伺服库。您为什么不想使用它?
PS。编写适当的伺服代码需要花费大量精力,并且必须使用低级计时器和中断服务程序来完成。
如果有帮助,请标记为答案。