没有库的Arduino伺服

时间:2018-03-01 18:38:07

标签: arduino servo

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

2 个答案:

答案 0 :(得分:2)

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

它创建硬件计时器并使用它们刷新伺服器。这使得您的常规代码看起来会定期继续,即使它被伺服库中断以维修伺服系统。占空比,pwm频率和刷新率都发挥作用。您必须查看正在使用的伺服数据表才能获得完整的详细信息。但它并不像你想象的那么简单,而你所使用的那些延迟/延迟微观函数并不总是足够精确。这就是你使用时间和溢出中断的原因。虽然大多数舵机都不太挑剔,但你可以侥幸逃脱。

答案 1 :(得分:0)

servo.h不断发送脉冲,这意味着伺服咆哮=电池消耗

我将您的功能更改为仅在没有计时器的情况下将伺服器从0旋转到180度。

del = (7 * x) +500;-对于我的500至1260us的伺服脉冲(计算得出,未测量)

void movePulse(int x){
    int del=(7*x)+500;
    for (int pulseCounter=0; pulseCounter<=50; pulseCounter++){
        digitalWrite(pinServo,HIGH);
        delayMicroseconds(del);
        digitalWrite(pinServo,LOW);
        delay(20); // between pulses
    }
}