Arduino 编译器从float转换为double时的奇怪行为
我有一个数组:Arduino 编译器从float转换为double时的奇怪行为,arduino,Arduino,我有一个数组: 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
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])代码>没有任何成功
编辑:
我必须补充一点,foo位于自定义库中。这太奇怪了。有人对此有线索吗?
- 首先,所有AVR双打都是浮点数作为或。这使得双打与Arduino Mega 2560上的浮动相同。您可以通过比较
sizeof(double)来验证这一点代码>和sizeof(浮动)代码>两者都将返回4
- 其次,如果您想将一种类型强制转换为另一种类型,语法是
(targetType)sourceType
,因此如果您执行这种操作,您的赋值应该如下所示
input =(double)foo[2];
或
但是,在这种情况下,这是不相关的,因为double和float是相同的
我认为最有可能的问题是,PID控制器不喜欢给定参数设置的foo[2]
中的任何值。在分配input=foo[2]之前,您是否尝试过foo[2]=-1.2
代码>?多一点代码会有所帮助。foo[2]是否已初始化?我不确定它是零,就像它是C或C++一样。如果一开始是一个NAN,并用它进行计算,结果应该是一个NAN。您使用的是哪个PID库?Arduino PID库-Brett Beauregard的1.0.1版您是对的。设置foo[2]=val可以正常工作。val是来自foo[2]的相同浮点。这对我来说毫无意义。我更新了问题,请看你是否有时间。我通过将foo重新创建为double来修复它。这不应该发生。如果您没有foo[2]=-9.2上面代码中的code>然后PID.Compute()
失败?你的float foo[3]在哪里代码>准确声明?
input =(double)foo[2];
input =(double)(foo[2]);