作为关于发送数字信号的教学事件,我试图在不使用Serve.h库的情况下为伺服系统编码脉冲序列。

伺服是9g微型伺服。硬件是正确的,因为使用Servo.h的许多示例都能正常工作。

我有以下代码。问题在于,伺服器会摇动3秒钟,而不是静止不动。

void loop() {
    movePulse_1000();
    delay(3000);
}

void movePulse_1000(){
    Serial.print("Start movePulse_1000()\t\t");
    for (int pulseCounter=0; pulseCounter<=150; pulseCounter++){
        digitalWrite(pinServo,LOW);
        delay(20); // between pulses
        digitalWrite(pinServo,HIGH);
        delayMicroseconds(1000);
    }
    Serial.println("End movePulse_1000()");
}

最佳答案

使用模拟伺服器时,平均脉冲宽度必须相隔1.5ms,并且占空比根据所需位置而变化。为了将伺服器保持在所需位置,必须不断刷新伺服数据。这不是一个 super 简单的任务,并且伺服库已经过优化。没有理由不使用它。

它创建硬件计时器,并使用它们刷新伺服。即使您的常规代码被伺服库中断以服务于伺服器,它也可以使常规代码看起来有规律地继续。占空比,pwm频率和刷新率均会发挥作用。您必须查看要使用的伺服器的数据表,以获取全部详细信息。但是它并不像您想的那么简单,并且您使用的那些delay/delaymicros函数并不总是足够精确。这就是为什么要使用时间和溢出中断的原因。尽管大多数伺服器都不太挑剔,但您还是可以轻松应对。

关于没有库的Arduino伺服器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49056510/

10-11 10:40