Hallo Wie tausende vor mir, versuche ich mich als bastelnder (Modell)-Flieger am Bau eines elektronischen Variometers. Für Nichtflieger: Ein Variometer berechnet aus dem Luftdruckabfall dP/dt die Vertikalgeschwindigkeit des Fliegers/Gleitschirms. Hierzu hat der ELEKTOR vor Jahren die angehängte Schaltung veröffentlicht, die ich auch schon gebaut habe und die im Grunde auch funktioniert. Das Problem an dieser Schaltung ist jedoch, dass sie bei ersten Start ca. 20 Minuten zum "warm werden" benötigt. Nach Elektor-Artikel: "Maximale Sensitivität ergibt sich erst, wenn die Hardware im thermischen Gleichgewicht und C4 entsprechend geladen ist. Dessen Kapazität muss so groß sein, da halbwegs stabile Signale (< 0,1 Hz) noch differenziert werden sollen. Ein Kaltstart braucht deshalb zwecks Temperaturausgleich mindestens 20 Minuten Akklimatisierung. Bei einem „Warmstart“ (Einschalten nach thermischer Stabilität) ist die Schaltung schon nach 3 bis 5 Minuten startklar." Als ich dieses Problem in einem ähnlichen Zusammenhang hier schon mal geposted habe, kamen wir auf die Idee, die Differentation dP/dt doch mit dem uC zu erledigen und so auf die Warmlaufphase verzichten zu können. Ich habe auch schon einen Ansatz versucht (siehe Code), der folgendes macht. 1. Sample einen Sensorwert und schreibe ihn in einen Ringspeicher (16x) 2. bilde den gleitenden Mittelwert aus dem Ringspeicher 3. schreibe 16 gemittelte Messwerte in einen zweiten Ringspeicher 4. subtrahiere immer paarweise die Werte von einander M1-M2, M2-M3,....M15-M16 5. Bilde den Gleitenden Mittelwert aus den 8 Differenzen. Ich hatte mir eingebildet, so eine quasi Differetation dP/dt zu bekommen. Im Simulator hat das (so weit ich das mit "Pseudo-Werten" aus dem EEPROM,simADC,.. testen konnte auch funktioniert. In der Praxis (mit Sensordaten) klappt es leider noch nicht so richtig. Das analoge Filter hat eine Grenzfrequenz von (ELEKTOR) von etwa 0,023 Hz. Leider bin ich bei der Dimensionierung von Digitalen Filtern völlig unerfahren. Dan Ansatz von oben habe ich mir halt mal so ausgedacht. Kann mir jemand mit einem Ansatz helfen ? Danke für Eure Zeit. Torsten
Es gibt DSP-Filter, die sich dem idealen Differentiator nähern. Aber dafür muß man sich schon ziemlich tief in die digitale Filtertheorie einarbeiten. Die Grafik stammt aus ISBN 0471619957 "Handbook for Digital Signal Processing".
Das habe ich befürchtet. :-( Gibt es nicht einen weltlichen Ansatz für das Problem DC-Offset per Software enfernen ? Ist mein Ansatz völlig für den Ar... ?
Hallo Torsten, ich komme nicht so aus der Modell-Flieger-Szene, finde dein Projekt aber interessant. Um das Problem mal einzugrenzen: Du benutzt einen Luftdruckmesser, der von 150 bis 1150 hPa eine Spannung von 4,6 mV / hPa ausgibt. Für das Erfassen von Höhenänderungen ist das natürlich etwas wenig, da dies (in Bodennähe) weniger als ein Bit für 10 m Höhenänderung ist. (Auflösung eines AVR mit 10-Bit-ADC = 4,88 mV / Bit.) So, wie ich die ELEKTOR-Schaltung verstehe, pegelt sie sich durch Aufladung des C4 langsam auf den vorhandenen Luftdruck ein und verstärkt dann Änderungen etwa um das 50-fache. Um die thermische Stabilisierung der Schaltung wird man nicht herumkommen. Mein Ansatz wäre eher, auf IC3A und IC3D zu verzichten, sondern den AVR dahin zu bringen, (z.B. über PWM) eine Spannung an den +Eingang von IC3B zu legen, die der Sensorspannung für den absoluten Luftdruck folgt. Was der AVR dann an Regelung über eine 16-Bit-PWM ändern muss, um das verstärkte Luftdruckmesser-Signal auszuregeln, gibt dann ein höheraufgelöstes Maß für die Höhenänderung...
HI, Ganz simpel würde ich es mal versuchen einen Tiefpass nach diesem Schema zu bauen. y = (a*x(n) + b*(x(n-1))/(a+b) IIR Tiefpass erster Ordnung y: Mittelwert x(n): aktueller Messwert x(n-1): letzter Messwert a,b: Filter Koefizienten. a+b sollte immer eine Potenz von 2 sein also 8, 256, 1024 oder so, sonst kann es passieren das der Filter instabil ist. a und b wählt man so: fg: Grenzfrequenz SysClk: Controller Taktrate SysClk/fg = a/(a+b) Das ist der Tiefpass. Differenziation im Zeitbereich ist eine Subtraktion im Diskreten. Dh. differenzern ist das gleich vie Minus auf dem µC Die Grenz Frequenz des ganzen ergibt sich jetzt aus der Häufigkeit. Da bin ich zwar mit der Filter Theorie auch nicht ganz bewandert aber ich würde sagen. wenn der Differenziator vom OP mit Tau 0,023Hz arbeitet dann würde ich einfach alle Minute (das müsste hinkommen) Den aktuellen Wert vom Neuen Wert abziehen. Normaler weise hätte ich das ganze so gelößt. mit einem Timer eine Zyklusszeit bauen. dh. Immer wenn der Timer einen Overflow hat dann die berechnungs Funktion ausführen. So hast du eine Definierte Zyklusszeit und vernünftige Grenzfrequenzen. bei der Berechnung würde ich mit n € N diff(n)=x(n)-x(n-1) ( Neuer Messwert minus alter Messwert: Das aktuelle Differential) filtered_diff(n) = (1*diff(n)+63*filtered_diff(n-1))/64 Wenn du jetzt den Timer overflow immer jede Sekunde Auslößt und diese Rechnung machst. hättest du den auf 0,023Hz grenzfrequenz gefilterten Wert der Sink bzw Steigrate. Ich würde aber eher auf 1 Hz filtern und bei ca 1ms zyklus die Werte berechnen. Ich hoffe ich konnte dir helfen MfG Tec
Das eigentliche Problem ist nicht der Differenzierer, sondern der Temperaturgang des Drucksensors. Den kann man nur kompensieren, wenn ein Temperatursensor verwendet wird. Ich habe das mal mit einem Valvo-Drucksensor KP100A gemacht, der enthält bereits auf dem Chip einen Temperatursensor: http://www.rfcandy.biz/shop/images/SVIII_dru.pdf auf der letzten Seite ist noch eine Abbildung dieses alten Sensors. (Infineon hat unter derselben Bezeichnung einen SMD-Drucksensor gebaut, der z.B. auf Alldatasheet zu finden ist.) Ich würde den Ausgang des Drucksensors als einen von zwei Spannungsteilern einer Messbrücke benutzen, und einen Spannungsteiler mit NTC oder Halbleiter-Temperatursensor als zweiten Zweig. Ein OP als Differenzverstärker liefert dann eine auf GND bezogene Spannung, die ich wie Elektor mit dem 68µF-Elko differenzieren würde. Den Temperaturgang des Drucksensors müßte man dazu ausmessen, bei Raumtemperatur, im Kühlschrank mit einem Thermometer dazu oder auch beides möglichst gleichstark erhitzen. Aus den Messergebnissen wird der Spannungsteiler bestimmt und so der Temperaturgang wenigstens in erster Näherung herauskompensiert. Mein KP100A hat so noch Höhenänderungen von 10 cm deutlich angezeigt.
Hallo zusammen. Danke, dass sich doch ein paar Mitstreiter finden: @Ralli: Deine Idee mit der PWM-Regelung ist mir auch gestern noch gekommen. Ich hab das mal gerade in Eagle aufgerissen. Könnte das so funktionieren ? ADC0 misst den (ungefähren) absoluten Luftdruck. Ungefähr, da mit 10 Bit 4V aufzulösen nur ungefähr sein kann ;-) OC1A formt per PWM einen proportionalen Spannungswert (mit ADC2 gemessen), der dann gefiltert an einen Subtrahierverstärker kommt und somit für den Augenblick der Messung den DC Offset vom Sensorsignal abzieht. ADC1 kann sich dann mit den 10 Bit auf die Luftdruckdifferenz dP/dt stürzen und diese hoch auflösen (mit interner 1,1V Ref.) Nach einer Messreihe, wird die PWM der neuen absoluten Höhe angepasst und das Spiel geht dann von vorne los. Alternativ kann auf ADC2 verzichtet werden und man könnte mit der PWM den Wert an ADC1 auf Null regeln, bevor der erste Messwert genommen wird. Kurz: M1 vor der PWM-Regelung, M2 nach der PWM-Regelung --> dP/dt = M1-M2/Timer_Intervall (zB 0,5 Sec) Das sollte doch dann eine quasi Differentation sein, oder ? @Tec: Dein Ansatz ist bestimmt gut, wenn man einen Tiefpass braucht. Um an die Höhenänderung zu kommen, brauch ich aber einen Hochpass. Hast Du auch einen Vorschlag für einen einfachen dig Hochpass ? Deinen Ansatz filtered_diff(n) = (1*diff(n)+63*filtered_diff(n-1))/64 Habe ich schon mal probiert, mich aber wohl mit zu vielen Mittelwerten verzettelt. Werde ich aber auf jeden Fall noch einmal probieren. @ Christoph: Der MPX6115 ist auch bereits temperaturcompensiert. Zumindest behauptet das Datenblatt so. Mache ich mir eigentlich Probleme, wenn ich hier mal den gesamten ELEKTOR Artikel als PDF poste ? NUr damit alle die gleichen Infos haben. Immerhin kostet der im Download was. Danke Torsten
Im Augenblick scheint mir der Ansatz im Schaltplan der beste zu sein, da ich dann die vollen 10 Bit für die tatsächliche Änderung zur Verfügung habe und nicht die meisten Bits für das Messen eines DC Offsets opfern muss, der sich eh nicht ändern wird. Was meint Ihr ?
http://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega da steht, wie ein IIR-Hochpass auf dem ATmega berechnet wird. Die ATtiny haben keinen Multiplizierer, das dürfte zu langsam werden.
Hallo Torsten, ... so ähnlich ... Habe heute leider nicht die Zeit, eine tolle Skizze mit EAGLE zu machen. Ich würde eine Tiny24 nehmen und mit seinem 16-Bit-Counter eine PWM mit hoher Auflösung realisieren, die (nach Filterung, aber die hattest du auch schon vorgesehen) an den +Eingang eines Op-Amp geht. Den Drucksensor über 10 kOhm an den -Eingang, dazu 100 kOhm Gegenkopplung vom Ausgang zum -Eingang. Der Op-Amp liefert nun ein das 10-fach verstärkte Drucksignal an einen ADC-Eingang. Mit Hilfe der PWM regelt man jetzt dahin, dass der ADC immer möglichst den mittleren Wert eines 10-Bit-ADC liefert, also 512. Mit einem OP347 (rail-to-rail) sollte es gut bei 5 V Versorgung funktionieren. Weitere Anschlüsse an den Tiny24 sind nicht nötig, die software-mäßig ermittelte PWM-Vorgabe entspricht dann dem Luftdruck, die nötigen Änderungen der PWM-Vorgabe entsprechen der Änderung des Luftdrucks, also der Höhenänderung! Falls noch eine Temperaturkompensation nötig ist, läßt diese sich vielleicht schon durch den internen Temperatursensor des Tiny24 machen. Ich denke aber, dass die nur für eine möglichst genaue Druckmessung nötig ist, nicht für die Erfassung von Änderungen... Gruß Ralli
Der Differenzierer hat eine Zeitkonstante von 10k*68µF=680ms. das ist nach wenigen Sekunden eingeschwungen. Auch der KP100 war laut Datenblatt mit seinem Temperatursensor thermisch kompensiert. Das reicht aber nicht für die gewünschte Auflösung, was da minutenlang driftet ist nur der Drucksensor. Meine Schaltung habe ich damals 1990 nach einer älteren Elektor-Veröffentlichung (Sept.1981) gebaut. Die hatten einen Sensor LX0503A mit gleichem inneren Aufbau wie der KP100, eine Widerstandsbrücke, deren Zweige beide herausgeführt sind und darüber einen Temperatur-Kompensator. Die Brückenspannung wurde mit einem Differenzverstärker gemessen, die Temperaturspannung unabhängig davon mit einem OP verstärkt und beides in einem Addierer zusammengebracht, man konnte noch die Polarität der T-Komp-Spannung auswählen. Auch hier wird eine Kalibration durch Erwärmen mit einem Fön beschrieben.
@Ralli: Danke für Deinen Vorschlag. Den AVR im Layout habe ich nur genommen, weil ich gerade keine passende Eagle-LBR für einen der ATTiny X4 hatte. Zu Deiner OP Schaltung: Wenn ich das richtig verstehe, subtrahiert die Schaltung doch auch nur den "DC-Offset" vor der eigentlichen Messung, oder ? Was ist der Unterschied zu dem Subtrahierverstärker, den ich vorgesehen habe. Will Deine Lösung gar nicht in Frage stellen. Ich will nur verstehen, was der Unterschied ist. Das mit dem Rail2Rail OP ist auch klar, ich hatte die erten Versuche nur mit dem lm324 gemacht, weil der halt gerade in der Kiste gelegen hatte. Bei dem Rest stimme ich Dir auch zu und werde es mal so aufbauen. Ach eine Frage noch ... werde ich für das Ausregeln mit der PWM einen speziellen Regelalgorythmus (P, PI, PID) brauchen, oder reicht es hier noch, mich einfach per inc,dec dem Sollwert anzuhähern ? @Christoph: Du hast bestimmt Recht mit Deiner Anmerkung. Ich hoffe aber einfach mal darauf, dass sich in den verg. 10 Jahren etwas an den T Kopmensationen der Sensoren getan hat. Auf eine separate Kompensation werde ich vorerst verzichten. Für meine Anwendung ist es auch nicht wichtig, ob die absoluten Werte stimmen. Es soll vorrangig eine akustische Information über das Steigverhalten sein. Dabei ist es egal, ob ich mit 2,3 oder 2,5 m/sec steige ;-) Grüße Torsten
Hallo Torsten, kein Problem, dass du nachfragst. - Wollte nur die Schaltung und das zu erstellende Programm auf das Notwendige reduzieren. Der Tiny24 war für mich die erste Wahl, da er eine 16-Bit PWM bietet. Gibt es auch einen 8-beinigen AVR mit ADC und je einem 8- und 16-Bit Timer? Dann nimm diesen. Wenn die Kompensation des Gleichspannungsanteils erfolgt ist, ist der Vorgabewert für die PWM direkt proportional zum Gleichspannungsanteil. (Und liegt, durch die Verstärkung mit höherer Auflösung vor!) Damit erübrigt sich der direkte Anschluss des Wandlers an den ADC0-Eingang. Auch für das Erfassen des Ausgangssignals vom Tiefpasses (über ADC2) sehe ich keine Notwendigkeit. Die Luftdruck- oder Höhenänderung kann aus dem Verlauf der Vorgabewerte für die PWM ermittelt werden. Hier käme deine Ringspeicheridee wieder zum Zuge. Ojeh, der erforderliche Reglertyp... Da muss ich zugeben, dass dies nicht 100% mein Fachgebiet ist. Allerdings kann ich so viel dazu beisteuern: Der Tiefpass in deiner Schaltung hat 0,2 Hz Grenzfrequenz - also müsstest du (3 tau) 15 Sekunden warten, bis du EINEN Regelschritt auf seine Wirkung prüfen kannst. Nimmt man eine Regelstrategie, die immer versucht, den halben Fehler zu kompensieren, braucht man im Extremfall 10 Schritte, um sich dem Zielwert auf 0,1% zu nähern - das sind 150 Sekunden oder 2,5 Minuten... Eigentlich muss dieser Tiefpass aber nur die PWM-Frequenz gut unterdrücken. Wählt man bei 8 MHz Prozessortakt die PWM-Auflösung zu 4096 Steps, ist eine PWM-Frequenz von 2 kHz möglich. Mit einem Tiefpass 2. Ordnung für Fg = 20 Hz ist die PWM-Frequenz (theoretisch) um 80 dB unterdrückt. Das Einstellen auf einen neuen Wert dauert im Extremfall (Druckänderung von Weltraum auf Bodennähe) nur noch 1,5 Sekunden. Kleinere Änderungen des Sensorsignals (+/- einige 100 m) können natürlich schneller bearbeitet werden.
Hi Ralli Hast schon Recht, es gibt leider keine 8Beiner, die mit 16 Bit Timer ausgestattet sind. Werde wahrscheinlich den tn44 nehmen, da der ein wenig mehr Raum für Software und Daten bietet (kostet bei Reichelt auch nicht mehr). Wenn man länger darüber nachdenkt, wird ADC0 und ADC2 (aus meiner Schaltung) in der Tat zum Luxus und bestenfalls für kontrollzwecke gut. Ich versuche es mal ohne. Die Teile sind bestellt. Warum hat Reichelt eigentlich keinen OPA4347 im Programm ??? Die Zeitkonstante aus meinem Tiefpass stammt noch aus einem anderen Ansatz, bei dem die PWM nur alle 5 Sekunden geändert worden wäre. Hierfür ist sie natürlich viel zu groß. Deine ist besser. Was hat es mit der Rückkopplung vom Ausgang (IC4) auf C9 auf sich ? Ich hätte C9 jetzt auf Masse gelegt. Gibt das so bessere Ergebnisse ? Für die Genaue Dimensionierung kann ich mir den Ripple auf dem PWM Signal mal am Oszi ansehen... Ralli schrieb: > Kleinere Änderungen des Sensorsignals (+/- einige 100 m) können > natürlich schneller bearbeitet werden. Ich sehe als praxisnahe Werte nur Änderungen bis max. 10m/sec. an. Un auch die nur am Gleitschirm. Segelflugzeuge steigen in der Regel (zumindest hier in der Gegend um Köln) nur bis max 3-4m/sec. Für Modellfluganwendungen möchte ich es jedoch sehr empfindlich haben, weshalb ich auch 10cm/sec auflösen möchte. Die Verstärkung von IC3 werde ich dann wohl am besten so bestimmen, dass ich mit einem max "dP/dt" von 10m/sec in etwa den Dynamikbereich des ADC ausreize. Ich werde am WE mal anfangen den 2. Versuch zusammenzubauen und werde dann berichten, wie es klappt. Danke vorerst. Wenn Du noch Fragen oder Tips hast, gerne. Grüße Torsten
Hallo Torsten, 10 m / sec halte ich auf den ersten Blick für sehr ehrgeizig! Wünsche dir viel Erfolg - lass hören, wie es weitergeht oder woran es vielleicht hakelt! Die Software mit PWM, ADC, Zeitablauf und Auswertung auszutüfteln, ist ja auch nicht ganz ohne. Gruß Ralli
Hi Ralli Hab nochmal ein wenig gerechnet .. Wenn ich einen Höhenunterschied von 10cm messen möchte, ist das bei: Sensorempfindlichkeit: 45mV/kPa --> 56uV/m = 5,6uV/10cm !!! (in Bodennähe 8m/hPa) Das bedeutet jedoch, dass auf der PWM Spannung kein Ripple in dieser Größenordnung sein darf. Ein Ripple mit einer Amplitude von 5uV würde ja schon verstärkt werden und eine Höhenänderung vorgaukeln. Wahrscheinlich könnte man noch ein wenig mit Software (Plausibilitätsprüfung) am ADC7 erreichen, aber ... Schafft es Dein Sallen-Key-Filter die PWM so glatt zu bekommen ? Was habe ich für alternativen ? Grüße Torsten
Hallo Torsten, ich hatte geschrieben: "10 m / sec halte ich auf den ersten Blick für sehr ehrgeizig!" (Da habe ich wohl übersehen, dass du 10 cm / sec meintest.) Nachdem ich mal nachgerechnet habe, erscheint mir 1 m/sec noch für möglich, wenn etwa 5 Sekunden Erfassungszeit nicht stören. Oder 0,1 m/sec wenn man eine Verzögerung von > 50 sec, also knapp einer Minute zulässt. Mein Ansatz war, die Erfassung zeitlich zu optimieren: Bei 8 MHz Systemtakt arbeitet eine PWM mit 4096 Schritten zwangsläufig mit max. 1953 Hz. Ein 2-poliger MAKELLOSER Tiefpass für 20 Hz (f / 100) verringert die 5 Vpp auf 500 µVpp (Upp / 10000). Bei sauberem Schaltungsaufbau und dem gleichen Tiefpass nochmal dahinter, könnte man theoretisch die 5 µVpp unterschreiten, wobei dann eher mit 10 Hz Grenzfrequenz zu rechnen ist. Alternativ müsste man zusehen, innerhalb einer 1953 Hz-PWM-Periode 8 oder mehr ADC-Samples zu gewinnen. Bei gutem Timing kann der Mittelwert daraus den Ripple-Einfluss auch auf 1/100 (5 µV) minimieren. 4096 PWM-Schritte bieten eine Auflösung von 5 V / 4096 = 1,22 mV. 1,22 mV / 45 mV/kPa = 0,027 kPa. Dies entspricht in Bodennähe einer Auflösung von 2,16 m. 65536 PWM-Schritte bieten eine Auflösung von 5 V / 65536 = 76,3 µV. Allerdings ist die PWM-Frequenz dann max. 122 Hz. Um dieses Signal ausreichend zu filtern, ist eine Grenzfrequenz von 1,25 Hz (500 µVpp) oder 0,6 Hz (2 Filter, 5 µVpp) erforderlich. (Die Werte von C8 und C9 sind dafür auf das 16-fache zu erhöhen.) Damit kämen wir zu einer Auflösung von 13,5 cm bei 16-fach verlängerter Messzeit. Das sind alles nur theoretische Werte - ich kenne den Sensor überhaupt nicht. Aber wie du siehst gibt es einige "Stellschrauben", an denen man sich betätigen kann. Übrigens: Würdest du den Sensor gleich an einen externen 16-Bit-ADC anschließen, hättest du idealerweise eine Auflösung von 76,3 µV. Auch hier müsstest du etwa 15 Sekunden warten, um gerade die Änderung um ein Bit, also die Höhenänderungsrate von 0,1 m/sec (in Bodennähe) festzustellen. Nicht verzagen! Bauen, Tüfteln, Rechnen und Probieren ist doch DER Spaß, Ralli
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.