没有库的Arduino伺服器

Pla*_*GAS 5 arduino servo

作为发送数字信号的教育练习,我试图在不使用伺服.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()");
}
Run Code Online (Sandbox Code Playgroud)

Dia*_*ake 2

使用模拟伺服系统时,平均脉冲宽度必须间隔 1.5ms,并且占空比根据所需位置而变化。为了让舵机保持在你想要的位置,你必须不断刷新舵机数据。这不是一个超级简单的任务,并且伺服库已经非常优化。没有什么理由不使用它。

它创建硬件计时器并使用它们来刷新伺服系统。这使得您的常规代码看起来会定期继续,即使它被伺服库中断以服务伺服系统。占空比、pwm 频率和刷新率都会发挥作用。您必须查看您所使用的伺服器的数据表才能获得完整的详细信息。但它并不像您想象的那么简单,并且您使用的那些延迟/延迟微函数并不总是足够精确。这就是为什么要使用时间和溢出中断。尽管大多数伺服系统都不太挑剔,但您可以避免大量的溢出。