Hallo Nachdem ich meinen Differenzdrucksensor mit einen Instrumentenverstärker zum laufen gebracht habe sollen die Werte auf dem Display erscheinen. Das tun sie auch. Nur folgendes will ich erreichen. Es soll später mal die Fluggeschwindigkeit eines Flugzeugs gemessen werden TRUE Airspeed. Die Anschlüsse kommen einmal an das Staurohr und eines an den Statischen Druck.(Fahrtmesser). Nun will ich ereichen das die anzeige nicht wackelt sondern so schön ruhig ist wie im richtigen Flugzeug oder im Auto. wie kann ich eine Lineare beschreibung der Werte hinbekommen so das die anzeige bei gleicher geschwindigkeit nicht immer ca +- 5km/h anzeigt. Danke
Ich denke was du machen willst, ist eine künstliche Trägheit einzubauen. Zunächst solltest du immer aus mehreren Messungen einen Mittelwert bilden um um das Rumgezappel des (der) letzten Bits zu minimieren (ich denke das wirst du schon gemacht haben, also z.B. 10 mal abtasten und daraus den Mittelwert). Um die Trägheit zu erreichen würde ich immer den aktuellen Wert speichern und gucken wie die Änderung zum neuen Wert ist. Nun kannst du selbst bestimmen wie schnell das ganze System reagieren soll. Angenommen du willst max. 5 km/s Anstieg haben. Du speicherst also z.B. 200 km/h als letzten Wert. Solange die Geschwindigkeit zunimmt (Delta-v = positiv) addierst du also 1 km/h jede 200ms dazu. Wird er negativ ziehst du wieder 1 km/h alle 200ms wieder ab, bis eben das delta-v Null ist (hier sollte man eine kleine Toleranz einbauen, damit auch hier nicht hin un hergesprungen wird. So zumindest jetzt meine Idee.
> Um die Trägheit zu erreichen würde ich immer den aktuellen Wert > speichern und gucken wie die Änderung zum neuen Wert ist. Nun kannst du > selbst bestimmen wie schnell das ganze System reagieren soll. > Angenommen du willst max. 5 km/s Anstieg haben... Und was haben die angezeigten Werte dann mit der Geschwindigkeit zu tun? Wozu soll diese künstliche Verschlechterung des Sensors gut sein?
>Wozu soll diese künstliche Verschlechterung des Sensors gut sein?
Das ist keine Verschlechterung sondern nur eine Trägheit. Damit siehts
halt toller aus als wenn er hüpft. Die Genauigkeit bleibt ja gleich.
Wenn du z.B. nur jede Sekunde bei einem Auto die Geschwindigkeit
abtastest würde dein Tacho (sofern es nicht träge wäre) immer z.B in 10
km/h Schritten springen, sähe doch ein wenig seltsam aus, oder findest
du nicht?
Im übrigen sollte es auch 5 (km/h)/s Anstieg heißen, aber ich denke das
geht aus dem Zusammenhang hervor.
Bilde den Mittelwert aus den Messwerten der letzten Sekunde und aktualisiere die Geschwindigkeitsanzeige nur einmal pro Sekunde.
Für die True Airspeed musst Du aber noch die Lufttemperatur messen... Ein Differenzdrucksensor gibt Dir nur den Staudruck (indicated Airspeed). Gruss, Thorsten
> Wenn du z.B. nur jede Sekunde bei einem Auto die Geschwindigkeit > abtastest würde dein Tacho (sofern es nicht träge wäre) immer z.B in 10 > km/h Schritten springen, sähe doch ein wenig seltsam aus, oder findest > du nicht? Du beschreibst hier leider das genaue Gegenteil :) Wenn man mehr "Mess"-werte haben will als man wirklich misst kann man interpolieren, damit die Änderungen zwischen zwei Messungen schön glatt verläuft. In deinem Beispiel würde ich also nur alle paar Sekunden die Geschwindigkeit messen und die Tachonadel gedämpft hinterherzuckeln lassen. In gewisser Weise muss man also den aktuellen "wahren" Wert aus bereits gemessenen Werten aus der Vergangenheit schätzen! Unser OP kann aber offenbar sogar öfter als er die Messwerte anzeigen muss messen. Da seine Werte offenbar stark rauschen, kann er sie verbessern in dem er nur alle paar Mal den letzten Mittelwert ausgibt. Und das ist dann nicht geraten, das ist tatsächlich näher am "tatsächlichen" Wert. > Im übrigen sollte es auch 5 (km/h)/s Anstieg heißen, aber ich denke das > geht aus dem Zusammenhang hervor. Haben wir glaub ich alle verstanden :)
>Unser OP kann aber offenbar sogar öfter als er die Messwerte anzeigen >muss messen. Da seine Werte offenbar stark rauschen, kann er sie >verbessern in dem er nur alle paar Mal den letzten Mittelwert ausgibt. Das hatte ich ja am Anfang schon geschrieben, bloß da er (der Fragesteller) als Beispiel ein Auto genannt hat, habe ich das als Trägheit interpretiert (ich war ja auch nicht der einzige). Zudem verhindert eine Mittelwertbildung nicht unbedingt das Springen, wenn z.B. durch den ADC nur 5 km/h aufgelöst werden können. Denn dann würde würde es auch springen. Wenn man eine Trägheit einbaut springt er nicht sondern singt oder steigt langsam anstatt zu springen. Finde ich für solche Anzeigen wo man ständig rauguckt angenehmer (so wirds bei den digitalen Autotachos auch gemacht. Und ich glaube auch kaum, dass sein Fluggerät so extrem an Geschwindigkeit pro Sekunde zunimmt, und das mit 5 (km/h)/s war ja auch nur ein beispiel. Wenn das ding mit 3g beschleunigt dann macht man eben 90 (km/h)/s Anstieg, das reicht dann auch aus um nicht veraltete Werte zu haben und dennoch eine "softe" Anzeige.
Danke für eure Antworten. Ich versuche es heute mal umzusetzten. Danke
Da weder Controllertyp noch favorisierte Programmiersprache genannt wurde (oder ich es übersehen habe) gehe ich mal von AVR und ASM aus. Ich verwende gerne den gleitenden Mittelwert über 256 Messungen, was recht gut dazu geeignet ist, Messwert-Ausreißer zu eliminieren und den Messwert zu "beruhigen". Messgenauigkeit geht dabei nicht verloren. Es wird neben den zwei Registern für das Ergebnis (adwl, adwh) nur noch ein Register für die Nachkommastellen (adwn) gebraucht. Hier wurden zwei Temp-Register (xl, xh) verwendet, weil ich einen Offset im Messwert brauchte, normal reicht da ein Temp-Register. Die Wertigkeit "1/256" wird durch Byteshifting erreicht.
1 | ADCC: ;ISR ADC-Wandlung fertig |
2 | in srsk,sreg ;SREG sichern (Exklusivregister) |
3 | push xh |
4 | push xl |
5 | sub adwn,adwl ;1/256 des |
6 | sbc adwl,adwh ;ADC-Wertes |
7 | sbc adwh,null ;mit Übertrag rausnehmen |
8 | lds xl,adcl ;ADC-Wert L einlesen |
9 | lds xh,adch ;ADC-Wert H einlesen |
10 | adiw xh:xl,messoffset ;Messwertverschiebung |
11 | add adcn,xl ;1/256 des neuen ADC-Wertes |
12 | adc adwl,xh ;1/256 des neuen ADC-Wertes |
13 | adc adwh,null ;mit Übertrag addieren |
14 | pop xl |
15 | pop xh |
16 | out sreg,srsk ;SREG wiederherstellen |
17 | reti ;fertig... |
...
Hannes Lux wrote:
Hi Hannes
>
1 | > ADCC: ;ISR ADC-Wandlung fertig |
2 | > in srsk,sreg ;SREG sichern (Exklusivregister) |
3 | > push xh |
4 | > push xl |
5 | > sub adwn,adwl ;1/256 des |
6 | > sbc adwl,adwh ;ADC-Wertes |
7 | > sbc adwh,null ;mit Übertrag rausnehmen |
8 | > lds xl,adcl ;ADC-Wert L einlesen |
9 | > lds xh,adch ;ADC-Wert H einlesen |
10 | > adiw xh:xl,messoffset ;Messwertverschiebung |
11 | > add adcn,xl ;1/256 des neuen ADC-Wertes |
12 | > |
Müsste es hier nicht add adwn,xl lauten?
Karl heinz Buchegger wrote:
>>
1 | >> add adcn,xl ;1/256 des neuen ADC-Wertes |
2 | >> |
> > Müsste es hier nicht > > add adwn,xl > > lauten? Genau!!!!!! Das kommt davon, wenn man "Kosmetik" betreibt, wenn man schnell mal einen Namen ändert, den man beim Programmieren nicht optimal vergeben hat, und dabei eine Zeile übersieht... 8-( Im Original sieht es sooooooo aus:
1 | ADCC: ;ISR ADC-Wandlung fertig |
2 | in srsk,sreg ;SREG sichern (Exklusivregister) |
3 | push xh |
4 | push xl |
5 | sub adcn,adwl ;1/256 des |
6 | sbc adwl,adwh ;ADC-Wertes |
7 | sbc adwh,null ;mit Übertrag rausnehmen |
8 | lds xl,adcl ;ADC-Wert L einlesen |
9 | lds xh,adch ;ADC-Wert H einlesen |
10 | adiw xh:xl,messoffset ;Messwertverschiebung |
11 | add adcn,xl ;1/256 des neuen ADC-Wertes |
12 | adc adwl,xh ;1/256 des neuen ADC-Wertes |
13 | adc adwh,null ;mit Übertrag addieren |
14 | pop xl |
15 | pop xh |
16 | out sreg,srsk ;SREG wiederherstellen |
17 | reti ;fertig... |
Ist übrigens aus der Laminator-Temperatur-Regelung... Danke für Deine genaue Analyse und Deinen Hinweis auf den Fehler, denn Müll sollte nicht unwidersprochen stehen bleiben. Gruß aus dem sonnigen Flachland, Hannes
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.