【问题标题】:Arduino servo without library没有库的Arduino伺服
【发布时间】:2018-03-01 18:38:06
【问题描述】:

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

【问题讨论】:

    标签: arduino servo


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多