3

尝试使用皮托管 MPXV7002DP 计算风速。
我们从传感器获取动态压力,然后应用伯努利方程:

pd = dynamic pressure
air density = 1.225kg/m^3
windspeed = sqrt(2*Pd/air density)

我们正在使用 Arduino UNO。

我们认为从传感器读取压力存在问题。

我们不知道如何获得正确的值。

#include <SoftwareSerial.h>

float Output=0;
void setup() {
  Serial.begin(9600);
}
void loop() {  
   float sensorValue = analogRead(A0); 
   output=sqrt((2*sensorValue)/1.225);
   Serial.println(output);
   Serial.print("m/s");
   delay(100);
}
4

2 回答 2

3

正如一位评论者所指出的,analogRead 的返回值是一个 0-1023 之间的整数。这是引脚 A0 上电压的缩放比例,从 0 到比较电压。(如果您使用的是 5V Arduino,则 1023 为 5V。3V Arduino,1023 为 3V。看起来您正在做任何复杂的事情来改变您用作比较电压的电压,所以这应该是准确的.)

我假设您使用的是 5V,因为这是您的传感器使用的。

您需要做的是查看设备的数据表,以确定压力和电压之间的关系。查看表格,这里有一个复杂的错误,但从第 5 页上的图表来看,您似乎可以假设 0.5V(大约 102 的模拟读数)是 -2kPa 的压力和 4.5V(大约 921 的模拟读数) ) 是 2kPa 的压力。你很幸运,缩放是线性的。

我说“周围”是因为很明显该设备的响应有相当多的偏差 - 至少正负 0.5V 或 0.2kPa!(换句话说,0kPa 可以读取 462 到 562 之间的任何值。)

您应该将模拟读取值从 0-102 映射到 -2kPa,从 921-1023 映射到 2kPa,并且介于两者之间的所有值都应该是 -2 到 2 之间的 lerp。我面前没有 arduino,所以我不能试试看,但它应该是这样的:

result = analogRead(A0);
if (result < 102) {
  kPa = -2.0;
} else {
  if (result > 921) {
    kPa = 2.0;
  } else { 
    kPa = map(result, 102, 921, -2000, 2000)/1000.0;
  }
}

让我知道,在评论中,如果我搞砸了,我会看看修复它。这一切都没有能够实际编译/测试的好处。=]

于 2017-05-16T18:08:47.353 回答
0

当您在伯努利方程中提到动压 pd 时,我想您的意思是总压和静压之间的差值,因为空速 V 等于:V = sqrt(2 * (p_total - p_static) / airdensity),所以你的pd 应该是(p_dynamic - p_static)。

于 2019-04-19T10:43:53.030 回答