伺服库,了解PWM写入。

时间:2015-01-10 22:05:37

标签: arduino pwm

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

在第一种情况下,我们使用短信号宽度,这将接近电机保持静止状态。在这种情况下,可以看出,短脉冲相互跟随,代码也是如此。

motor1.writeMicroseconds(shortWidth);
motor2.writeMicroseconds(shortWidth);
motor3.writeMicroseconds(shortWidth);
motor4.writeMicroseconds(shortWidth);

当motor4结束输出时,motor1再次启动脉冲,导致无故障的脉冲。

在第二个(2)情况下,脉冲较宽,这对应于将电动机速度设置为接近最大值。在motor1完成生成宽度后,是motor2生成一个宽度的时间。但是当它发生时,motor1的周期结束并且它必须再次开始产生宽度,但是arduino正在忙着产生motor2的脉冲。

在这种情况下,PWM如何工作?

1 个答案:

答案 0 :(得分:1)

您可能希望直接查看Servo.hServo.cpp的代码。但有两件事可以帮助理解:

  1. 伺服不响应PWM(脉冲宽度调制 - 脉冲 持续时间与周期持续时间,但PDM(脉冲持续时间 调制 - 绝对时间值)。这意味着伺服不会去 脉冲持续0时为0,脉冲时为中间范围(90°) 为1.5毫秒时,它朝向最小位置(0°) 脉冲为1 ms,脉冲持续时间为最大位置(180°) 到2毫秒。总周期始终约为20 ms。更确切地说,它一般 没有完全达到0°和180°,最小时间是0.5 ms和最大时间 大概是2.5毫秒,但这超出了大多数伺服系统的规格。
  2. 多个伺服器由一个定时器控制(通常是timer_1 在Arduino)。执行Servo.write(值)时,计时器被编程, 然后硬件在合适的时间生成引脚更改。
  3. 您可以尝试以下代码:

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