Der Mikrokopter besitzt zur Höhenmessung einen Luftdrucksensor MPX4115A von Motorola/Freescale. Dieser ist in der Lage Luftdrücke von 15-115 kPa, das entspricht 150-1150 mBar zu messen und eine zum Luftdruck proportionale Spannung auszugeben. Laut Datenblatt liefert der Luftdrucksensor eine Spannung von
\(U(p) = p \cdot 46 \frac{\mathrm{mV}}{\mathrm{kPa}} = p \cdot 4.6 \frac{\mathrm{mV}}{\mathrm{mBar}}\)
Um die Spannung auszuwerten ist der Luftdrucksensor mit einem der A/D-Wandler Eingänge des Atmel Mikroprozessors verbunden. Da nur relativ kleine Druckänderungen erwartet werden ist der Luftdrucksensor über einen nichtinvertierenden Operationsverstärker verbunden, dessen Nullpunkt so verschoben werden kann, dass die zu messende Spannung in den Messbereich des A/D-Wandlers fällt der dank externe Referenzspannung einen Messbereich von 0-3 V besitzt. Der Verstärker hat einen Verstärkungsfaktor von
\(g_\mathrm{HW} = 1 + 18000 \cdot \frac{1}{6800 +\frac{1}{680}} \approx 30.12\)
Der A/D-Wandler wandelt die Spannungen zwischen 0 V und 3 V in Digitalwerte zwischen 0 und 1023 um (10 Bit Auflösung). Wir erhalten also
\(ADC(U) = \frac{1024}{3000} \frac{\mathrm{Schritte}}{\mathrm{mV}}\)
Die Software der Flight-Ctrl liest diese Werte regelmäßig aus und mittelt darüber. Die Routine funktioniert schematisch (Die genaue Routine findet sich z.B. hier. Vielen Dank an killagreg für die Erklärungen.)
tmp_pressure = 0; count = 0; while (true) { tmp_pressure += ADC; if (++count >= 5) { tmp_pressure /= 2; pressure = tmp_pressure; tmp_pressure /= 2; } }
Bei ersten Mal wird also der Wert des A/D-Wandlers fünfmal aufsummiert und anschließend durch 2 geteilt. Nun wird immer der neue Druck mit Hilfe des alten berechnet in der Form
\(\left(\frac{p}{2}\right)_{i+1} =\left(\frac{p}{2}\right)_i + \frac{5}{4} \cdot ADC\)
Die Folge konvergiert im Grenzfall gegen
\(g_\mathrm{SW} = \frac{2}{ADC} \cdot \lim_{i \to \infty} \left(\frac{p}{2}\right)_i = \frac{2}{ADC} \cdot \frac{5}{3} ADC = \frac{10}{3}\)
Die Software verstärkt also den eingelesen Wert nochmals um den Faktor 10/3. Also erhalten wir insgesamt einen Wert von
\(ADC(g_\mathrm{HW} \cdot U(p)) \cdot g_{SW} \approx \frac{10}{3} \cdot 30.12 \cdot p \cdot 4.6 \frac{\mathrm{mV}}{\mathrm{mBar}} \cdot \frac{1024}{3000} \frac{\mathrm{Schritte}}{\mathrm{mV}} = 157.64 \frac{\mathrm{Schritte}}{\mathrm{mBar}}\)
Machen wir nun eine kleine Testmessung bei der wird den ADC Wert auf dem Boden auf 0 setzen und heben nun den Mikrokopter bis zur Decke und wieder herunter so erhalten wir mit Umrechnung folgendes Diagramm:
Die barometrische Höhenformel gibt eine Beziehnung zwischen Druck und Höhe an:
\(p(h) = 1013.25 \cdot \left( 1 - \frac{0.0065 \cdot h}{288.15\, \mathrm{m}} \right)^{5.255} \mathrm{mBar}\)
Bestimmt man die Inverse so läßt sie aus Druck die Höhe bestimmen:
\(h(p) = \frac{288.15}{0.0065} \cdot \left( 1 - \left( \frac{p}{1013.25\, \mathrm{mBar}} \right)^{\frac{1}{5.255}} \right) \mathrm{m}\)
Gehen wir jetzt idealerweise von aus, das unser Kopter am Anfang bei 0 m Höhe stand so erhalten wir als Zimmerhöhe:
\(h(p(0\,\mathrm{m})-0.33\, \mathrm{mBar}) = 2.75 \mathrm{m}\)
Das ist zwar etwas zuviel, aber wir befinden uns ja auch nicht direkt auf Meereshöhe. Trotzdem ist es erstaunlich, dass der Luftdrucksensor Druckänderungen in dieser Größenordnung messen kann.