1

我有一个数组:

float foo[3];

在 ino 文件中,我必须将其中一个作为输入发送到 PID。

double output;
PID myPID(&input, &output, &target, 1, 0.0, 1.1, DIRECT);
...
void loop(){
  input =foo[2];   
  myPID.Compute();
  Serial.print(output); //output: "nan"
...
}

PID如下:

PID::PID(double* Input, double* Output, double* Setpoint,
        double Kp, double Ki, double Kd, int ControllerDirection)

它可以编译,但 PID outvalue 的输出是 nan。

但是,如果我将输入设置为 -1.2,那么它可以工作。

void loop(){
      input =foo[2];  
      input = -1.2;
      myPID.Compute();
      Serial.print(output); //output: "1200"
    ...
    }

我怎样才能解决这个问题?编译器应该自动转换双倍浮点数。就像在 Mega 2560 中一样。我也尝试过:input =double(foo[2]);没有任何成功。


编辑:

  Serial.print(foo[2]);  //Prints -9.2
  foo[2] = -9.2;         // I manually set foo[2] to -9.2  
  xAngle = foo[2];
  xPID.Compute();        //Computes perfectly.

我必须添加 foo 在自定义库中。这太奇怪了。有人对此有所了解吗?

4

1 回答 1

2
  • 首先,所有 AVR 双精度都是浮点数,如此此处所述。这使得双精度数与 Arduino Mega 2560 上的浮点数相同。您可以通过比较来验证这一点sizeof(double);sizeof(float);两者都会返回4
  • 其次,如果你想将一种类型转换为另一种类型,语法是(targetType)sourceType,所以如果你做那种事情,你的分配应该是这样的

    input =(double)foo[2];
    

或者

    input =(double)(foo[2]);

但是,在这种情况下这无关紧要,因为双精度和浮点数是相同的。

我认为问题很可能来自这样一个事实,即您的 PID 控制器不喜欢您在foo[2]给定参数的情况下所拥有的任何值。你foo[2]=-1.2在分配之前尝试过input = foo[2];吗?

于 2013-04-12T03:22:06.613 回答