Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 伺服库,了解PWM编写。_Arduino_Pwm - Fatal编程技术网

Arduino 伺服库,了解PWM编写。

Arduino 伺服库,了解PWM编写。,arduino,pwm,Arduino,Pwm,我不明白多个PWM输出应该如何工作。看这张照片。 在第一(1)种情况下,我们使用短信号宽度,接近电机静止。在这种情况下,可以看到,短脉冲彼此跟随,代码也如此 motor1.writeMicroseconds(shortWidth); motor2.writeMicroseconds(shortWidth); motor3.writeMicroseconds(shortWidth); motor4.writeMicroseconds(shortWidth); 当motor4结束输出时,moto

我不明白多个PWM输出应该如何工作。看这张照片。

在第一(1)种情况下,我们使用短信号宽度,接近电机静止。在这种情况下,可以看到,短脉冲彼此跟随,代码也如此

motor1.writeMicroseconds(shortWidth);
motor2.writeMicroseconds(shortWidth);
motor3.writeMicroseconds(shortWidth);
motor4.writeMicroseconds(shortWidth);
当motor4结束输出时,motor1再次启动脉冲,从而产生无问题的后续脉冲

在第二(2)种情况下,脉冲较宽,对应于将电机转速设置为接近最大值。在motor1完成生成宽度后,是motor2生成宽度的时候了。但当它这样做时,马达1的周期结束,它必须再次开始产生宽度,但arduino正忙于产生马达2的脉冲


PWMs在这种情况下是如何工作的?

您可能希望直接查看
伺服.h
伺服.cpp
的代码。但有两件事有助于理解:

  • 伺服不响应PWM(脉宽调制-脉冲 持续时间与循环持续时间,但PDM(脉冲持续时间 调制-绝对时间值)。这意味着伺服不运行 当脉冲持续时间为0时变为0,当脉冲持续时间为0时变为中间范围(90°) 为1.5 ms,当 脉冲为1ms,当脉冲持续时间达到最大位置(180°) 到2毫秒。总周期始终在20毫秒左右。更精确地说,通常 未完全达到0°和180°,最小时间为0.5 ms,最大时间为 大约为2.5毫秒,但这超出了大多数伺服的规格
  • 多个伺服由一个定时器(通常为定时器1)控制 在Arduino上)。定时器在执行伺服时编程。写入(值), 然后,硬件在正确的时间生成管脚更改
  • 您可以尝试以下代码:

    #include <Servo.h>
    
    Servo myServo1;
    Servo myServo2;
    const int servo1Pin = 9;
    const int servo2Pin = 10;
    
    void setup(){
        // attach servo to pin 
        myServo1.attach(servo1Pin);
        myServo2.attach(servo2Pin);
    }
    
    void loop(){
        myServo1.write(15); //set servo to 15°
        myServo2.write(45); //set servo to 45°
        delay(1000); //wait 1 second
        myServo1.write(90); //set servo to 90°
        myServo2.write(90); //set servo to 90°
        delay(1000); //wait 1 second
        myServo1.write(165); //set servo to 165°
        myServo2.write(135); //set servo to 135°
        delay(1000); //wait 1 second
    }
    
    #包括
    伺服myServo1;
    伺服myServo2;
    常数int servo1Pin=9;
    常数int servo2Pin=10;
    无效设置(){
    //将伺服装置连接到销上
    myServo1.连接(伺服1分钟);
    myServo2.连接(伺服2分钟);
    }
    void循环(){
    myServo1.write(15);//将伺服设置为15°
    myServo2.write(45);//将伺服设置为45°
    延迟(1000);//等待1秒
    myServo1.write(90);//将伺服设置为90°
    myServo2.write(90);//将伺服设置为90°
    延迟(1000);//等待1秒
    myServo1.write(165);//将伺服设置为165°
    myServo2.write(135);//将伺服设置为135°
    延迟(1000);//等待1秒
    }
    
    我在写伺服时犯了一个错误。我处理的基本上是一个带有无刷电机的ESC。它也使用PDM吗?@user3081123如果你想要有效控制,无刷电机的ESC要复杂得多。查看这段短视频