Hallo zusammen,
ich habe ein mir nicht ganz erklärliches Phänomen bei einem Projekt von mir.
Wie der Titel schon vermuten lässt, geht es um die AD-Wandlung auf meinem ATXmega128A1-Breakoutboard.
Ich habe zwei Linearpotentiometer als unbelasteten Spannungsteiler, mit denen ich eine Position ermitteln möchte, was auch vom Prinzip her funktioniert, dank der Hilfe von Kampis Tutorial. Leider tritt an bestimmten Stellungen der Potentiomer das Phänomen auf, dass die AD-Wandlung 10 mal funktioniert und dann wird der maximale Wert, der als Referenz gemessen wurde über USART rausgeschrieben. Ich bilde zusätzlich den Mittelwert der letzten 10 Messwerte, um ein wenig das Flattern bei der 12Bit-Auflösung rauszunehmen.
Die Ausgabe sieht dann zum Beispiel so aus:
Code:
USART up and running.
lower: 745 upper: 812
lower:3644 upper:3645
Correction Lower: 2.899 Correction Upper: 2.833
...
lower: 1014 upper: 6
lower: 1014 upper: 1014
lower: 1014 upper: 7
lower: 1014 upper: 6
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 8
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 1014
lower: 1014 upper: 8
lower: 1014 upper: 4
lower: 1014 upper: 8
lower: 1014 upper: 4
...
An diesem Beispiel ist glaube ich relativ ersichtlich, dass die Messungen mit upper:1014 zwischendrinne ziehmlicher mumpitz sind.
Ein ähnliches Phänomen habe ich in der genau anderen Richtung auch, nur dass da ein negativer Wert auftauch mit -430. Als Ausgabe sieht das dann ungefähr so aus:
Code:
...
lower: 4 upper: 1014
lower: 3 upper: -430
lower: 0 upper: 1014
lower: 1 upper: 1014
lower: 3 upper: 1014
lower: 4 upper: 1014
lower: 3 upper: 1014
lower: 5 upper: 1014
lower: 5 upper: 1014
lower: 4 upper: 1014
lower: 3 upper: 1014
lower: 2 upper: 1014
lower: 5 upper: -430
lower: 3 upper: 1014
lower: 4 upper: 1014
lower: 2 upper: 1014
lower: 3 upper: 1014
...
Jetzt ist vielleicht noch interessant, wie ich auf diese Werte komme und das passiert mit folgender Berechnung:
Position = (Messwert - Offset)/((maximalerMesswert - minimalerMesswert)/anzahlMesspunkte)
AnzahlMesspunkte ist in meinem Fall 1000.
Damit wäre beschrieben, wie ich auf diese lustigen Werte komme.
Da der Beitrag wahrscheinlich schon lang genug ist, packe ich die wichtigsten Auszüge aus meinem Code in den Anhang.
Die ADC ist als 12Bit Singleended unsigned mit einer externen Referenzspannung von 3,3V an Pin0 initalisiert. (näheres im Code)
Um die Frage nochmal zu konkretisieren, die ich habe:
Kennt jemand das Problem und hat evtl. eine Lösung dafür, oder muss ich mit diesen "Ausreißern" leben, die mir evtl das Leben ein wenig schwerer machen könnten. Sprich ich muss eine Plausibilitätsprüfung für die Werte einfügen.
Achja, wer auch eine Idee hat, wie ich die werksseitigen Kalibrierungswerte rausbekomme, so dass ich zum Schluss kein Offset mehr habe von der ADC, der darf sie auch gerne Posten, da wäre ich nicht sauer drüber
Danke und Grüße
Oreas
P.S.: habe versucht so viel wie geht zusammen zu kürzen im Anhang und hoffe alles ausreichend kommentiert zu haben. Sollte dem nicht der Fall sein, so stehe ich gerne Rede und Antwort. Und sry, dass alles in einer Datei gelandet ist ^^
Lesezeichen