Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Messung und Beschleunigungssensor
Hallo,
ich habe mir ein Accelerometer von robotikhardware besorgt. Angeschlossen ist dieser mit x an ADC2, y an ADC1 und z an ADC 0, alle anderen ADC sind nicht angeschlossen. Hierzu steht auch in der Anleitung ein Beispielprogramm. Nun komme ich damit aber allgemein hinten und vorne nicht zurecht. Da mich die Ergebnisse immer verwundert haben, habe ich einfach mal alle ADC des ATMEGA32 ausgelesen mit folgendem code (Vorsicht lang, aber wenig Inhalt:)
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Enable Interrupts
Config Adc = Single , Prescaler = Auto , Reference = Internal
Declare Sub _betriebsspannung().
Const Ref =(488 * 5.0) / 1024
Dim Xwert As Single
Dim Ywert As Single
Dim Zwert As Single
Dim Awert As Single
Dim Bwert As Single
Dim Cwert As Single
Dim Dwert As Single
Dim Ewert As Single
Dim Beschlx As Single
Dim Beschly As Single
Dim Beschlz As Single
Dim Beschla As Single
Dim Beschlb As Single
Dim Beschlc As Single
Dim Beschld As Single
Dim Beschle As Single
Main:
Do
Cls
Call _betriebsspannung()
Print Xwert ; " X " ; Beschlx
Print Ywert ; " Y " ; Beschly
Print Zwert ; " Z " ; Beschlz
Print Zwert ; " A " ; Beschla
Print Zwert ; " B " ; Beschlb
Print Zwert ; " C " ; Beschlc
Print Zwert ; " D " ; Beschld
Print Zwert ; " E " ; Beschle
Print ""
Print ""
Waitms 2000
Loop
End
Sub _betriebsspannung().
Local X As Word
Local Y As Word
Local Z As Word
Local A As Word
Local B As Word
Local C As Word
Local D As Word
Local E As Word
Start Adc
Z = Getadc(0)
Y = Getadc(1)
X = Getadc(2)
A = Getadc(3)
B = Getadc(4)
C = Getadc(5)
D = Getadc(6)
E = Getadc(7)
Stop Adc
Xwert = X * Ref
Ywert = Y * Ref
Zwert = Z * Ref
Awert = A * Ref
Bwert = B * Ref
Cwert = C * Ref
Dwert = D * Ref
Ewert = E * Ref
Beschlx = X
Beschly = Y
Beschlz = Z
Beschla = A
Beschlb = B
Beschlc = C
Beschld = D
Beschle = E
End Sub
Das Ergebniss ist folgendes:
462.265625 X 194.0
617.1484375 Y 259.0
903.0859375 Z 379.0
903.0859375 A 224.0
903.0859375 B 241.0
903.0859375 C 250.0
903.0859375 D 285.0
903.0859375 E 491.0
Das Problem ist:
Die Vorderen zahlen Variieren immer wie sie lustig sind. Das dürfte dann aber maximal an einer nicht stabilen Spannung liegen oder?
Aber warum zeigen mir die direkten Werte der ADC alle Unterschiedliche Zahlen an, obwohl doch von A-E garnichts angeschlossen ist. Da müsste doch überall garnichts ankommen.
Auserdem müssten doch der Sensor in X und Y richtung jeweils die Erdbeschleunigung anzeigen, aber diese Variieren ja auch total.
Wie kriege ich das bitte hin das ich vernünftige Ergebnisse da raus krieg, und warum gibt der ADC immer so komisches Zeug aus?
Grüße[/code]
Hubert.G
17.08.2009, 18:41
An offenen Eingängen ist nicht nichts, sondern irgenwas, das bekommst du ja auch angezeigt. Leg die Eingänge auf GND und du wirst 0 bekommen.
Ok vielen Dank.
Bleibt nur noch die Frage wie ich jetzt Ergebnisse des Sensors bekomme.
Grüße
An offenen Eingängen ist nicht nichts, sondern irgenwas, das bekommst du ja auch angezeigt. Leg die Eingänge auf GND und du wirst 0 bekommen.
Richtig. Statt die Oins auf GND zu löten würde ich aber lieber einfach die Pullups aktivieren. Dann liegen sie zwar auf 1 (1023), flattern aber auch nicht.
462.265625 X 194.0
617.1484375 Y 259.0
903.0859375 Z 379.0
903.0859375 A 224.0
903.0859375 B 241.0
903.0859375 C 250.0
903.0859375 D 285.0
903.0859375 E 491.0
Wie sollen denn die Zahlen vor dem Buchstaben mit denen dahinter zusammenhängen?
Ich vermute mal du willst aus den Werten an den AD-Eingängen die Spannung errechnen.
Dann ist es allerdings etwas seltsam, dass bei den unteren Zeilen vor dem Buschstaben überall dieselbe Zahl steht und dahinter unterschiedliche.
Irgendwas passt da in deinem Programm nicht.
Hatte nen Fehler im Programm. Die Berichtigten Zahlen sind:
1522.6171875 X 639.0
2282.734375 Y 958.0
1822.8515625 Z 765.0
1281.953125 A 538.0
1108.0078125 B 465.0
988.8671875 C 415.0
967.421875 D 406.0
1398.7109375 E 587.0
Also die anderen Benutzte ich ja nicht, das war ja nur so rien interesse halber was die ausgeben.
Die Erste Zahl ist die Spannung in Millivolt, der Buchstabe ist die Bezeichnung, und die 2. Zahl ist der Wert den mir der ADC zurück gibt. Somit wundert es mich das die alle unterschiedliche Werte zurück geben. Auch wenn ich mit nem Multimeter die Spannung an den eingängen Mess welche der Beschleunigungsmesser ausgibt fängt er bei 320 Millivolt an, und fällt dan ganz langsam bis auf 0 ab O_o.
Auserdem verändert sich die Spannung laut ADC vom ATMEGA laufend bei den ersten 3 Pins, welche aber immer gleich sien sollten da ich den Beschleunigungsmesser nicht bewege. Diese werden Teils utopisch hoch.
Grüße
Besserwessi
17.08.2009, 20:24
Bei den meisten Beschleunigungssensoren ist es üblich, dass man als Nullwert etwa die halbe Versorgungsspnnung zurükbekommt.
Mit dem 3.3 V Regler wären das hier 1.65 V. Das käme etwa hin für x und Z. Bei einer Achse muß ja auch noch die Erdbeschleunigung wirken, hier vermutlich Y.
Die Werte sehen deutlich besser aus als 320 mV und fallend auf 0. Das spricht mehr für eine Fehlbedienung oder fehlende Versorgungsspannung.
Wenn man keinen geschirmenten Aufbau hat, und eventuell noch eine Trafo in der Nähe können die Werte schon ziehmlich schwanken.
Das komische ist halt das wenn ich den Beschleunigungssensor Drehe, alle Werte gleich bleiben, und sich keiner verändert. Dabei müsste sich ja mindestens 2 Achsen ändern, weil g woanders hin wirkt.
Besserwessi
17.08.2009, 23:28
Es kommt auf die Richtung der Drehung an. Aber wenn einen andere Seite nach unten kommt dann sollte sich schon was ändern. Nicht unbedingt gleich 2, aber immerhin.
Wie sieht denn das mit der Versorgungsspannung aus ? Stimmen da die Werte ? (Vcc, Avcc, 3.3 V vom Accelerometer)
Aref sind 5,05 V beim Atmega avcc auch, (Hab grade überprüft, dieser misst auch richtig). vin sind 5,05 v beim accerlometer und bei der extra 3,3v versorgung des accelerometers kommen auch 3,3 v raus. Das komische ist auch das er die Spannung ändert wenn garnichts passiert und er ruhig da liegt.
Ist das Modul vielleicht defekt?
Besserwessi
18.08.2009, 00:14
Aref = 5 V ist nicht ganz das ideale, aber nicht so schlimm, das damit gar nichts geht. Besser wären da z.B. die 3.3 V. Nur das kann oach nicht das Problem sein.
Wie sind denn die Übrogen Eingänge des Moduls beschaltet ? Ist da nicht so was wie ein Enable Eingang ?
Stimmt denn die masseverbindung ?
Ganz auszuschließen ist ein defektes Modul nie, aber so etwas ist eher die Ausnahmen.
Die Masseverbindung stimmt.
Es gibt 10 Pins, 1 = Vin, 2 = Gnd, 3 = 3,3 Vin, 4 = Z, 5 = y, 6 = x, 7-10 = Jumper für Genauigkeit. Masse passt. Das einzige was noch zusätzlich drin ist ist sleep, aber was ich damit Anfangen soll ka.
http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=71&products_id=204
Laut Datasheet sollte es bei 0 1,65 V anliegen haben an einem Ausgang. Hier liegt aber eigentlich nichts an, und an x ständig 0,5 v oder mal 0,3 v.
schau doch einfach ins datenblatt, da steht WAS man mit sleep anzustellen hat, wenn der rumfloatet, kanns gut sein, dass dein gyro die ganze zeit pennt und wieder anläuft wie er grad lustig iss! den reset am controller lässte ja schließlich auch nciht unbeschaltet ;)
EDIT:
hab jetzt mal reingesehen, offensichtlich hat der nen eigenen pullup, daran kanns nich liegen ... versuchs mal mit 5V als eingang, laut datenblatt hat der nen spannungsregler drauf, vielleicht fällt da zu viel spannung ab und er arbeitet nicht richtig!
Hab ihn mal beschaltet nach Englischem Datenblatt, im Deutschen steht garnichts davon.
Passiert dadurch aber auch nicht mehr, selbe Ergebnisse wie vorher.
Die Werte springen immer noch obwohl es ruhig auf dem Tisch liegt zwischen 0 Volt und 3 Volt hin und her
hast du eventuell ein oszilloskop verfügbar, oder könntest du versuchen die ermittelten messwerte der zeitnach zu ordnen und darzustellen, vielleicht hast du eine regelmäßigkeit drin, die auf eine äußere störung schliessen lassen würde
Suggarman
18.08.2009, 11:13
Ich glaube, die Berechnungen gehen in die Hose. Ich bin da auch schon mehrfach reingefallen.
Xwert = X * Ref
single=word*const
Ich glaube, das geht nicht.
tempsingle1=x
tempsingle2=ref
single=tempsingle1*tempsingle2
mfg
Stefan
Im Datenblatt des Mega32 steht, dass unter bestimmten Umständen (weiss nicht mehr welche...) die ersten Werte der AD Konvertierung Müll sind. Also: Ganz oben an den Anfang deines Programms sollte ein "Start ADC" und nirgends ein Stop ADC.
Vielleicht klappt es dann.
Also an dem Single Word usw kann es nicht liegen, weil die normale Ausgabe ja auch schon nicht stimmt, ohne die Multiplikation.
Auch wenn ich ganz oben ein Start ADC hinschreibe und kein Stop ADC ändert sich nichts.
Osziloskop ist leider nicht vorhanden, aber ich schau mal ob ich Zeitwerte dazu generieren kann.
Für was steht der Dateityp Word eigentlich genau, weil getadc() erwartet den ja. Und was passiert wenn ich getadc(.2) also den Punk davor mache?
Grüße
Besserwessi
18.08.2009, 17:27
Word steht für eine 16 Bit Zahl ohne Vorzeichen.
Bei getadc(.2) könnte es einen Fehler beim Compilieren geben oder es sollte als getadc(0) interpretiert werden, wenn der Compiler keinen Fehler hat.
Vielleicht empfiehlt sich folgendes Vorgehen um den Fehler zu finden...:
Klemm doch mal einen Spannungswandler (vorzugsweise mit einem Poti) an deinen ADC. Dann kannst du verschiedene Spannungen einstellen und gucken ob was sinnvolles bei der Konvertierung rauskommt. Falls ja: Dann stimmt was mit dem ACC nicht. Falls nein: Dann ist vielleciht dein ADC zerschossen.
Hast du den ACC denn schonmal mit einem Multimeter gemessen?
Hallo,
also ich hab den ADC mit dem Multimeter nachgemessen, er zeigt das richtige an. Blos das Modul scheint zu spinnen.
Und zu dem Punkt von (.2): Er zeigt irgend was an, und lässt sich auch normal compilen. In dem Buch Roboter selbst bauen wird es halt im Beispielprogramm so angegeben : getadc(6.
Grüße
Blos das Modul scheint zu spinnen.
Hängt alles am gleichen GND? Sollte so sein. Sonst vielleicht einen Schaltplan von deinem Setup aufmalen. Da wir nicht wissen wie viel Erfahrung du mit Elektronik hast, kann da ja alles mögliche falsch sein...
Ich hänge übrigens seit 2 Stunden an genau dem gleichen Problem :-D Mein ACC hat höchstwahrscheinlich den Geist aufgegeben (eigenartig, dachte die Dinger sind ziemlich robust und gehen nicht so einfach kaputt). Er bekommt die richtige Spannung, gibt aber nichts aus. Da kaufe ich mir jetzt einen schönen ADXL322 bei watterott.com! Dann kann ich auch die extra Spannungsregler und den Opamp und die ganzen Widerstände endlich von der Platine schmeissen...
Wenn du nicht weiterkommst bei der Fehlersuche ist das evtl. auch die letzte Lösung für dich...
Besserwessi
18.08.2009, 22:40
Wenn der bei dem Modul angegebene Schaltplan stimmt, könnte das Modul ein Problem mit der Stabilität des Reglers haben. Beim Plan sind als Kondensatoren hinter den Regler 1 µF +100 nF Keramik angegeben. Im Datenbaltt zum Regler steht aber dass man bei 3.3 V besser 4,7 µF Keramik nehmen soll. Und auch dann soll es teils Probleme mit zu wenig ESR geben. Nach der Grafik besonders bei wenig Belastung, so wie hier.
Eine mögliche Abhilfe wäre es an die Pins vom Modul zusätzlich noch einen ELKO mit etwa 10 µF and die 3.3 V und GND anzulöten. Das gibt dann genug Kapazität und sollte auch für etwas ESR, bzw. Dämpfung sorgen.
Leider ist ja kein Oszilloskop vorhanden um die Spannung man zu kontrollieren. Einfach die 3.3 V mal den den AD des ARS zu geben könnte auch schon was ergeben.
also habe leider keine direkte 3,3 v versorgung. Aber auf der fertigen Platine wo der Beschleunigungsmesser bereits engelötet ist ist ja ein Spannungswandler von 5V drauf. Ich habe jetzt zwischen GND und Vcc einen 10 µF Kondensator gelötet. Es bringt leider keine Besserung. Ich habe mit dem Multimeter nachgemessen, und die Spannung stimmt, das heißt der Atmega32 misst richtig per ADC.
Ich vermute langsam mal wirklich dass der Beschleunigungsmesser nicht richtig funktioniert.
Grüße und Danke bisher :)
Also ich hab jetzt mal einen Kreisel von Murata angeschlossen, und dieser Liefert mir einwandfrei ergebnisse an dem ADC.
Also doch Beschl. Sensor defekt?
Suggarman
20.08.2009, 11:51
Hast du mal gemessen, ob "sleep" auch wirklich auf 3V liegt?
Auf Sleep liegen 2,76 Volt
Suggarman
20.08.2009, 14:54
Auf Sleep liegen 2,76 Volt
Da ist doch etwas faul.
Dort müssten exakt 3,3V anliegen. Vielleicht hat der Spannungsregler eine Macke. Könntest du das Modul mal extern mit 3V versorgen?
mfg
Stefan
Hab nun 3,3 v von extern dort angelegt. Die X und y werte bleiben jetzt stabil, jetzt springt aber immer noch z rum wie verrückt. Auch bei drehen oder beschleunigen der Platine verändern sich x und y nicht, und z springt weiter rum.
Auserdem geben diese 0,16 V aus, und z zwischen 0,1 und 0,5 v. Also weiterhin nichts :/
Aber danke für den Versuch :)
Suggarman
20.08.2009, 15:49
Hm....
Also wenn du nur GND und 3,3V (An Pin 3,3V nicht an Vin) schliesst und die Platine so auf den Tisch legst, dass der Sonsor auf der Oberseite ist, müsste an Sleep 3,3V sein, X und Y=1,65V und Z=2,45V. Wenn nicht, dann isser wohl kaputt :-(
mfg
Stefan
Genau das ist es eben. Ich schließe das alles an, und raus kommt: X = 0,16 V Y = 0,16 V , Z = zwischen 0,1 und 0,5 V
Suggarman
20.08.2009, 16:30
Also ärgern und umtauschen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.