我正在使用Arduino Uno为我的(进行中的)直升机控制ESC。我目前正在使用伺服库来控制ESC,效果很好。 90(停止)和100(全功率电动机)以正确运行我的直升机,我想有更多的速度选择。有任何想法吗?我在使用PWM信号时遇到了麻烦,但是我可能做得不好。

我当前的代码在这里:

#include <Servo.h>

Servo myservo; // create servo object to control a servo
                // a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
  myservo.attach(8); // attaches the servo on pin 8 to the servo object
}

void loop()
{

 int maxspeed=100;
 int minspeed=0;
 int delaytime=5;
 int count;

 for(count=0; count <1; count+=1) {
  for(pos = minspeed; pos < maxspeed; pos += 1) // goes from 0 degrees to 180 degrees
  { // in steps of 1 degree
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(delaytime); // waits 15ms for the servo to reach the position
  }
  for(pos = maxspeed; pos>=minspeed; pos-=1) // goes from 180 degrees to 0 degrees
  {
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(delaytime); // waits 15ms for the servo to reach the position
  }
  if(count>1){
    break;
  }
 }

 myservo.write(92);
 delay(100000);
 myservo.write(90);
 delay(10000000);
}


#1 楼

Servo.write(angle)函数旨在接受从0到180的角度。
(值180明显大于100)。
请告诉我在Servo文档中何处读取“ 100 (电动机处于全功率状态)”,那么我们可以解决该错字吗?

请更改线路

int maxspeed=100; /* wrong */




int maxspeed=180;


另外,请定期运行servo.refresh()来更新伺服器-也许像这样:
,您可以通过

直接设置脉冲宽度(以微秒为单位)来获得更高的精度。 >该技术使以一致的心跳定时读取传感器和更新伺服位置变得更加容易。

评论


$ \ begingroup $
谢谢,我将研究每个建议。回答您的问题:我没有在任何文档中读到伺服计数100是最大功率,而是通过测试电机(hobbyking.com/hobbyking/store / ...)并找到高于伺服计数100的道具来计算得出的。旋转似乎没有加快,给了我很小的工作范围。
$ \ endgroup $
– Toozinger
13年11月25日在17:55

$ \ begingroup $
如果是这种情况,则是您的电池无法提供足够的电流(检查C值),或者推进器太大(电动机上的负载过大),或者esc无法提供足够的电流(在这种情况下,它可能会变热)。请检查以上所有可能性。
$ \ endgroup $
–哈兹卡兹
16年6月24日在7:07

#2 楼

您的代码使用典型的servo.attach(pin),您可以在其中使用servo.attach(pin, min, max)的过载来设置脉冲宽度的最小和最大微秒,以与ESC所需的范围相匹配。另外,为了使使用myservo.write(90);设置角度的位置更加清楚,您可以使用myservo.writeMicroseconds(1500);直接以微秒为单位设置脉冲的持续时间。