PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD-Wandler läuft nicht korrekt...



DanielSan
03.01.2012, 19:53
Hi,

ich habe ein Arduino Nano. Daran habe ich einen alten Joystick per Gameport angeschlossen. Die Potis in dem Joystick sind 100kOhm groß.

Ich frage 30 mal pro Sekunde die AD´s[2,3,5,6,7] ab. Die Werte springen wie verrückt von 0-255. Erst nachdem ich einen 4,7kOhm Widerstand von AD[2] nach GND angeschlossen habe, wurden die Werte deutlich ruhiger. Wenn der Widerstand an einen der hinteren AD´s ist, springen die Werte wieder.
Das lässt mich vermuten, das die Spannung am AD nicht schnell genug abfällt. Denn der AD wird ja gemultiplext.

Sind die Potis zu hochohmig? Ich habe irgendwo im Internet gelesen, das man unter 10kOhm bleiben sollte.
Muss ich den AD noch zusätzlich beschalten?

Danke
Gruß Daniel

BMS
03.01.2012, 20:27
Hallo,
die Potis sind relativ hochohmig. Das Datenblatt eines Atmega32 verrät zu den analogen Eingängen:

The ADC is optimized for analog signals with an output impedance of approximately
10 kΩ or less. If such a source is used, the sampling time will be negligible. If a source
with higher impedance is used, the sampling time will depend on how long time the
source needs to charge the S/H capacitor, with can vary widely. The user is recommended
to only use low impedant sources with slowly varying signals, since this
minimizes the required charge transfer to the S/H capacitor.
Also 10kOhm oder niedriger wären ideal für die Potis. Ansonsten musst du dem AD-Wandler mehr Zeit geben, den internen Kondensator aufzuladen. Hat der nicht genug Zeit, werden die Werte beeinflusst von den vorherigen Messungen. Das dürfte der Effekt sein, den du beobachtest.

Also ich sehe da prinzipiell 3 Möglichkeiten:
- das Poti niederohmiger wählen, z.B. die genannten 10kOhm oder weniger
- dem ADC mehr Zeit geben, d.h. nach dem internen multiplexen mehr Zeit einplanen bevor dann endgültig gemessen wird, oder mehrere Messungen an ein und demselben Eingang durchführen und dann entweder nur den letzten Wert verarbeiten oder einen Durchschnitt ausrechnen
- die Potis im Joystick lassen sich vielleicht nicht auswechseln, damit das Signal für den ADC dennoch niederohmiger wird, könnte man einen Operationsverstärker dazwischen schalten (als Spannungsfolger bzw. Impedanzwandler)

Grüße,
Bernhard

DanielSan
03.01.2012, 20:36
Danke für die schnelle Antwort!

Potis tauschen fällt leider raus.
Die Lösung mit den OP´s ist auch nicht so mein ding, weil erhöhter beschaltungsaufwand.
Also werde ich einfach mehrmals (reicht da 10mal?) messen und nur den letzten Wert nehmen. (Weiss einer in welchem Register steht, das die AD-Wandlung fertig ist? Dann würde ich darauf warten.)
Ein bekannter meinte, ich könnte auch versuchen 100nF kondensator nach GND zu schalten. Das werde ich morgen auch noch ausprobieren.

Gruß Daniel

Kampi
03.01.2012, 20:47
Wenn das ADSC Bit auf 1 gesetzt wird startet der A/D-Wandler eine Messung. Wenn diese Messung abgeschlossen ist setzt der Controller das Bit automatisch wieder auf 0. Wenn du dieses Bit auf 0 abfragst kannst du sehen wann er fertig ist.
Und 10 Messungen Zeit sollte ausreichen.

Besserwessi
03.01.2012, 21:00
Das mit dem Kondensator am AD Eingang funktioniert auch, und kann zusätzlich auch gegen kapazitiv eingekoppelte Störungen (z.B. 50 Hz) helfen. Auch der 100 K Poti hat als Spannungsteiler maximal eine Impedanz für den Ausgang von 25 KOhm - nämlich in der Mittelstelung, und da sind dann 2 mal 50 K dran, die für eine Last am Poti wie eine Parallelschaltung wirken. Das spricht dafür, dass der etwas zu hohe Widerstand nicht die alleinige Ursache für die Probleme ist.

Wie sieht das denn mit der Frequenz für den AD Wandler aus, stimmt die ?

radbruch
03.01.2012, 21:05
Potis in alten PC-Joysticks sind nicht mit GND verbunden:

https://www.roboternetz.de/community/attachment.php?attachmentid=19214
(Bild aus https://www.roboternetz.de/community/threads/51544-Joystick-mit-Potentiometer-und-0-Stellung?p=516619&viewfull=1#post516619)

DanielSan
03.01.2012, 22:19
@Besserwessi: Das...

Wie sieht das denn mit der Frequenz für den AD Wandler aus, stimmt die ?
verstehe ich nicht. Was genau meinst du damit?

@radbruch: Das die Potis (evtl.) nicht mit GND sondern mit 5V verbunden sind, bedeutet doch im Prinzip nur das die Messerte "invertiert" sind oder nicht?

Gruß Daniel

radbruch
03.01.2012, 22:29
Es bedeutet, das Poti im Joystick ist kein Spannungsteiler (http://www.google.de/search?q=poti+als+spannungsteiler).

Besserwessi
03.01.2012, 23:26
Damit man die Variablen Widerstände mit dem AD Wandler auslesen kann braucht man noch einen Widerstand gegen GND dazu - das ganze wird aber nichtlinear.

Beim ADwandler kann man die Geschwindigkeit über einen Vorteiler einstellen, und da gibt es gewisse Grenzen zu beachten, sonst arbeitet der ADC nicht gut. Ich weiss aber nicht in wieweit das beim Arduino schon gemacht wird.

BMS
04.01.2012, 16:23
Damit man die Variablen Widerstände mit dem AD Wandler auslesen kann braucht man noch einen Widerstand gegen GND dazu - das ganze wird aber nichtlinear.
Oder man verwendet eine Konstantstromquelle, dann ist die daran abfallende Spannung in dem Fall linear.

Einfacher wäre es, im Joystick umzulöten, sodass es ein Spannungsteiler wird. Das wäre auf jeden Fall die beste Lösung! :)

Und noch eine Alternative: Den Joystick so lassen, einen Kondensator zwischen Pin und Masse und dann mittels RC-Zeitkonstante messen.
D.h. der Rest ist Software: Den Pin als Ausgang schalten und auf Low, dann auf Eingang und viele Messungen machen.
Nach t=R*C sind 63% der Spannung erreicht. Dann kann man ausrechnen, welchen Widerstandswert das Poti gerade hatte.
Die Messung dauert dann eben länger, fraglich ist auch wie genau man dann messen kann. :-k

Grüße,
Bernhard

Kampi
04.01.2012, 16:27
Naja Kondensatoren haben doch eine nicht ganz unerhebliche Toleranz oder?
Stört diese denn dann nicht?
Das Problem könnte auch sein, dass wenn der Konensator noch nicht ganz entladen ist und man den Joystick bewegt. Das würde das Ergebniss verfälschen. Man muss also dafür sorgen das der Kondensator immer ganz leer ist.
Ich würde auch vermuten das der Spannungsteiler doch leichter ist ;)

radbruch
04.01.2012, 16:31
In der Gamekarte ist auch nur ein Kondensator drin. Unter anderem deshalb musste man die Joysticks ja auch kalibrieren.

Besserwessi
04.01.2012, 17:02
Die Zeit für die Messung kann recht kurz sein. Mit z.B. 10 nF als Kondensator liegt die Zeit bei maximal 1 ms. In der Zeit bewegt man den Poti nicht viel. Es dauert dann auch nicht so lange bis der Kondensator ganz leer ist, die Entladung geht über einen kleineren Extra Widerstand zwischen IO Pin und dem Kondensator - da reicht dann auch schon deutlich weniger als 1 ms zum entladen - also die Zeit in der der andere Kanal gemessen wird.
So schlecht muss das von der Genauigkeit auch nicht sein, das Problem wird vermutlich eher die Einkopplung von Störungen sein, als die Fehler des Messprinzips.

Kampi
04.01.2012, 17:04
Ah ok. Danke für die Info :)

DanielSan
04.01.2012, 18:38
Hi,

so jetzt habe ich meinen Joystick umgelötet. Es ist nun ein Spannungsteiler. Danke für die Hilfe soweit!!!


Jetzt tritt aber ein anderer Effekt auf...

Wenn ich die serielle Schnittstelle über den USB-Port des Arduinos auslese, dann kommen die Werte so an:

255 62 62
Das ist auch richtig! Die 255 sagt mir das eine neue "Zeile" kommt. Die 62 steht für die Mittelstellung der Achsen des Joysticks. Wenn ich den Joystick bewege, ändern sich die Zahlen der Achsen passend. Alles ist wie es soll! Das die Mittelstellung bei 62 ist liegt an meiner Berechnung. Ich teile den AD-Wert durch 10. Die Auflösung ist nicht so wichtig und so kann ich mir pro Achse ein Byte sparen. Also lasst euch davon nicht beirren.

Das Witzige ist jetzt, wenn ich die serielle Schnittstelle über meinen USBtoSeriell Adapter auslese kommt nur blödsinn dabei raus.

048 098 000 001
048 098 000 001
048 098 000 001
So wiederholen sich die Daten. Das Problem ist das es auch mit anderen USBtoSeriell adaptern nicht klappt.
Habt ihr ne Idee woran das liegt?

Danke!
Gruß Daniel

BMS
04.01.2012, 20:23
so jetzt habe ich meinen Joystick umgelötet. Es ist nun ein Spannungsteiler. sehr gut =D>

Hab' mir grad den Arduino Nano angeschaut. Für USB hat der ja einen entsprechenden Chip auf der Unterseite drauf, für RS232 braucht man dagegen z.B. einen MAX232. Hast du da noch einen zusätzlich angeschlossen? Weil die Pegel bei RS232 ja völlig andere sind als die von UART am Rx/Tx - Pin. Ich glaube, dass wird mit dem Pegelwandler auch noch invertiert. (Logisch 1 ist dann negative Spannung)
Die Baudrate muss natürlich auch stimmen, aber ich gehe mal davon aus, dass du das beachtet hast.
Grüße,
Bernhard

DanielSan
05.01.2012, 13:48
Alles klar! Es fehlte noch ein Pegelwandler! Ich dachte das mein USBtoSeriell bereits auf TTL läuft.

Danke an alle für die -wie immmer- tolle Hilfe!
Gruß Daniel