Hallo Christian,
darf ich meine Frage 3) wiederholen?
und ergänzend noch gleich weitere stellen:
-hast du dir die Datenblätter der Sensoren angesehen?
-kannst du mit den Datenblattangeben etwas anfangen?
-verfügst du über Grundkenntnisse zu Mikrokontrollern?
-hast du dir das Datenblatt des ATmega328 schon einmal angesehen und ist dir klar wie der ADC funktioniert?
-wie kommst du zu dem Eindruck, dass die Werte "passen"?
Ich habe mich noch nie genauer mit der Geschwindigkeitsmessung mit Staudruckrohren beschäftigt und meine Bastelprojekte mit Fokus auf Höhenmessung und Variometerfunktion sind schon etwas länger her. Dennoch hätte ich gesagt (ohne den Authoren der Codeschnippsel zu nahe treten zu wollen) - wirf das Zeug weg, und schreib es neu.
Soweit ich das sehe ist in Pressure::GetAirSpeed() schlicht die Bernoulli Gleichung für die Prandtlsonde [1],[2] implementiert.
In der von dir angesprochenen Zeile 36 scheint die Umrechnung von ADC-Wert auf Drucksensorwert zu erfolgen und der Offset "PRESSURE_SEA_LEVEL" addiert. Das macht jetzt aber wenig Sinn, denn laut Bernoulli interessiert uns für die Geschwindigkeitsberechung der Differenzdruck und die Dichte. Den Differenzdruck ermitteltst du aber nicht durch Messung und Differenzbildung von zwei Absolutdrücken (wäre aber auch möglich) sondern durch einen Differenzdrucksensor. In Zeile 40 wird dieser Offset ja dann auch wieder abgezogen #)
Die Dichte wiederum wird in Zeile 39 "berechnet", obwohl in der vorliegenden Implementierung nur Konstanten verwendet werden. Hier würde es Sinn machen, sich genauer mit dem Thema zu beschäftigen und eine Fehlerrechnung auszuarbeiten, ob die korrekte Dichte relevant ist oder nicht. Genauso, ob es reicht die Werte ev. beim Start zu konfigurieren (Startplatzhöhe vs. Seehöhe), oder weitere Sensoren notwendig sind (Lufttemperatur). Ich denke dabei an den Unterschied zw. Überflügen am Platz oder einem Segler der GPS-Triangle oder OLC fliegt und ev. merkliche Höhenunterschiede einkalkulieren möchte. Ich habe leider keine Zeit mich in diese Thematik einzuarbeiten, gehe aber eigentlich davon aus, dass das schon oft ausgearbeitet wurde...
Welche Differenzdrücke liegen in einem typischen Staudrucksensor denn vor?
Entsprechend könnte und sollte man da -wie gesagt - noch einmal aufräumen.
Unter der Annahme, dass die typische Datenblattangabe stimmt und sich der Sensorwert um 1V/kPa ändert, sowie der ADC 5.0V in 1024 Schritte auflöst stimmt alles. Eigentlich geht es um die Transferfunktion das Drucksensors ([3], Page6, Figure 4: Vout = VS× (0.2 × P(kPa)+0.5) ± 6.25% VFSS ) und die Umrechung unter Berücksichtigung der Referenzspannung und Auflösung des ADC. Bei einem symetrischen Drucksensor wie der MPXV7xxx Serie schaut es ein wenig anders aus, als bei der MPXV5xxx Serie bzw. in deinem Fall mit [4] und Vout = VSx (0.09 x P + 0.04) ± 5.0% VFSS.
Du musst dir die Frage stellen, welcher ADC-Wert entspricht welchem Druckwert. Dafür hast du zwei Kennlinien zur Umrechnungen zu beachten. Einmal die vom Sensor und einmal die vom ADC.
Der Offsetabgleich in Pressure::Init() ist für beide Arten nutzbar und kompensiert bis zu einem gewissen Grad auch die systematischen Offsets des ADC. Allerdings musst du beim MPXV5010 nicht nur mit den typischen 0.45V/kPa kalkulieren, sondern solltest auch den Offset der Kennlinie beachten und die 0.2V bzw. ca. 39-41 LSB die als ref_pressure ermittelt werden abziehen. Das wird dann aber eben nicht nur mit 5.0[V]/1024[LSB]/1.0[V/kPa] verrechnet ( was in Zeile 36 gekürzt wurde), sondern müsste für den MPXV5010DP etwa so ausschauen:
p[kPa] = (air_pressure[LSB] - ref_pressure[LSB]) * (Vref[V] / ADC-Auflösung[LSB]) / Sensitivität[V/kPa]
Dann sollte die Einheitengleichung hoffentlich stimmen, und weitestgehend plausible Ergebnisse herauskommen (ist aber auch gut möglich, dass ich da jetzt in der Eile genauso einen Fehler gemacht habe). Deine empirisch ermittelten 11000/1024 sind mit ca. 10.74 ja ganz gut am eigentlichen Umrechnungsfaktor für die andere Sensorkennlinie drann 5000/1024/0.45 = 10.85; Der Unterschied zwischen den beiden Sensoren ist aber 1.0 / 0.450 = 2.2222; es sollten also eher 11111.11 sein, wenn du bei dem Hack bleiben willst. Ich denke, dass da noch irgendwo ein 10^3 als Umrechnungsfaktor von [kPa] auf [Pa] mitverwurstet wurde.
[1]
https://de.wikipedia.org/wiki/Anemometer
[2]
https://de.wikipedia.org/wiki/Datei:Pitot_tube_with_Bernoullis_law_german.png
[3]
https://www.nxp.com/docs/en/data-sheet/MPXV7002.pdf
[4]
https://www.nxp.com/docs/en/data-sheet/MPX5010.pdf