Hallo Zusammen,
ich betreibe wie im angehängten Schaltplan dargestellt 2 Potis am ADC
eines ATMega32.
Da ich keine absolute Spannung messen will, habe ich die 1M Potis direkt
auf Vref gelegt.
Leider habe ich das Problem, dass die Spannung an ADC0 von der
Potistellung an ADC1 leicht beeinflusst wird und umgekehrt, wohl durch
die Stromänderung.
Hat jemand eine einfach Idee wie ich das verhindern kann?
Ich denke das Problem ist recht trivial, aber analoge Schaltungstechnik
ist definitiv nicht meine Stärke ;)
Vielen Dank schonmal,
Alex
Du verwendest kein Interrupt gesteuertes auslesen. Also lass das ADIF
Flag in Ruhe.
Du setzt das ADSC Flag um den ADC das Signal zum loslegen zu geben. Der
ADC löscht das Flag wieder, wenn er fertig ist
1
while(ADCSRA&(1<<ADSC))
2
;
Das ADIF Flag müsstest du selbst löschen. Es wird nur duch den Aufruf
einer Interrupt Funktion oder indem du es aus dem Code heraus löscht
(durch Schreiben eines 1 Bits) zurückgesetzt.
Das ist in den Datenblättern etwas unglücklich ausgedrückt. Einfacher
ist es, sich an das ADSC Bit zu klemmen um festzustellen, ob eine
Konvertierung beendet ist.
Alex schrieb:> Da ich keine absolute Spannung messen will, habe ich die 1M Potis direkt> auf Vref gelegt.
Das ist zu hochohmig, nimm mal 10k Potis.
Alternativ kannst Du auch einige Dummy-Messungen nach MUX-Wechsel
machen, damit sich der ADC umladen kann.
Peter
Karl heinz Buchegger schrieb:> Du verwendest kein Interrupt gesteuertes auslesen. Also lass das ADIF> Flag in Ruhe.
Kann er ruhig nehmen, er löscht es ja wieder:
Peter Dannegger schrieb:> Das ist zu hochohmig, nimm mal 10k Potis.> Alternativ kannst Du auch einige Dummy-Messungen nach MUX-Wechsel> machen, damit sich der ADC umladen kann.
Kannst du mir kurz erklären warum die 1M Potis hier Probleme machen?
Ich würde es gerne verstehen
Ooops. Du hast recht.
Ich würde trotzdem nicht tun. Das wär mir ehrlich gesagt zu implizit und
zu versteckt. Zumindest hätte es sich einen Kommentar verdient, dass
hier als Nebeneffekt das ADIF gelöscht wird.
Mein Fehler.
Alex schrieb:> Kannst du mir kurz erklären warum die 1M Potis hier Probleme machen?> Ich würde es gerne verstehen
Dein ADC hat eine Sample und Hold und ein Kapazitives Netzwerk im
Eingang.
Diese Kapazitaeten muessen erstmal umgeladen werden und das braucht
Zeit.
Alex schrieb:> Peter Dannegger schrieb:>> Das ist zu hochohmig, nimm mal 10k Potis.>> Alternativ kannst Du auch einige Dummy-Messungen nach MUX-Wechsel>> machen, damit sich der ADC umladen kann.>> Kannst du mir kurz erklären warum die 1M Potis hier Probleme machen?> Ich würde es gerne verstehen
Kurz und vereinfacht gesagt:
Im ADC sitzt ein kleiner Kondensator, der die Spannung konstant halten
soll, solange der ADC arbeitet.
Dieser Kondensator muss auf die anliegende Spannung aufgeladen werden.
Dazu braucht er aber Strom. Nicht viel, aber doch.
Strom, der über 1MOhm (bzw. den jeweiligen Anteil) nicht mehr fliessen
kann, damit er sich in der kurzen Zeit die du ihm gibst, auf den
Spannungswert aufladen kann.
Ich glaube auch, daß deine Potis viel zu hochohmig sind. Da misst du ja
eher das kosmische Rauschen mit :) ...
Nimm 10k-Potis, mach Dummy-Messungen und schau vielleicht nochmal in den
Code aus dem Tutorial (wg. Abfrage des ADCs und so).
Außerdem finden die kleinen AVRs das Rechnen mit floats total doof :( .
So einfach Kram wie bei dir kann man eigentlich problemlos mit
Festkommaarithmetik erschlagen...
http://www.mikrocontroller.net/articles/Festkommaarithmetik
Gruß
Ok, vielen Dank euch.
Leider habe ich nur noch ein 10k Poti hier rumfliegen, werde mir
Nachmittags noch eins besorgen und dann kurz berichten obs geklappt hat.
Alex schrieb:> Leider habe ich das Problem, dass die Spannung an ADC0 von der> Potistellung an ADC1 leicht beeinflusst wird und umgekehrt
Was heißt "leicht"?
Der 1MOhm Widerstand ist relativ hoch. Schalt da mal noch einen
100nF-Kondensator zwischen den Schleiferanschluss und GND.
Alex schrieb:> Kannst du mir kurz erklären warum die 1M Potis hier Probleme machen?> Ich würde es gerne verstehen
Der AD Wandler hat eine Sample and Hold Stufe. Das heisst ein kleiner
Kondensator wird auf die zu messende Spannung aufgeladen und dann der
Eingang während der eigentlichen Messung vom Messsystem getrennt. So
vermeidet man Fehlmessungen, die auftreten können wenn sich die
Messspannung während der Messung ändert.
Zum Aufladen des S/H Kondensators muss aber ein bestimmter Strom
fliessen, und zwar umso mehr, je weniger Zeit Du dem Kondensator
zwischen 2 Messungen lässt.
Das müsste auch im Datenblatt des µCs stehen (maximale Eingangsimpedanz
evt. in Abhängigkeit von der Zeit zwischen dem Umschalten auf einen ADC
Kanal und der Messung.
Die Potis sind viel zu hochohmig, daß sich der S&H C schnell genug
umladen kann.
tmp=(float)ADC/1023;//ADC: Wert von 0 ... 1023 // 0->1000us, 1023-2000us, 512->1500us
2
ServoPos2=(uint16_t)(tmp*250)+250;// 250 ... 500 mitte 375
Wenn du nicht durch 1023 sondern durch 1024 dividierst (was sowieso
richtiger ist), dann gibt es eine völlig naheliegende 'Optimierung', die
deinem µC das Leben wesentlich erleichtert.
Ich hatte da wohl zu lange gewartet... ;-)
U.R. Schmitt schrieb:> Die Potis sind viel zu hochohmig, daß sich der S&H C schnell genug> umladen kann.
Wie gesagt: probier da mit den Kondensatoren mal. Damit wird der
dynamische Widerstand des Potis reduziert.
Und das solltest du dir noch mal anschauen:
1
tmp=(float)ADC/1023;//ADC: Wert von 0 ... 1023 // 0->1000us, 1023->2000us, 512->1500us
2
ServoPos2=(uint16_t)(tmp*250)+250;// 250 ... 500 mitte 375
Das geht garantiert ohne Fließkommazahlen.
EDIT:
> Wenn du nicht durch 1023 sondern durch 1024 dividierst
Und zudem ist es erst dann auch mathematisch richtig.... :-o
Denn der ADC macht ja 1024 Schritte: 0...1023
Festkommaaritmetik hab ich jetzt drin, scheint zu funktionieren.
Der 100n C vom Schleifer zur Masse war wohl der richtige Tipp !
Jetzt kann ich keine Beeinflussung mehr messen.
Vielen Vielen Dank euch allen!
Alex schrieb:> Der 100n C vom Schleifer zur Masse war wohl der richtige Tipp !
Du musst Dir nur im klaren sein, daß die Spannung am Poiausgang ggf.
etwas verzögert ändert. Wenn man eine Worstcase Rechnung aufmacht (5*tau
und fast max. Widerstand kommt man auf knapp 0,5Sekunden bei Mittelwert
(500KOhm und 5Tau) auf 0,25 Sekunden.
Das heisst als Joystickeingang kann man das nicht benutzen. Für einen
Poti der moderat langsam verstellt wird ist das OK.
Gruß
U.R. Schmitt schrieb:> 5*tau
Nach 5Tau hat die Spannung erst 99,3% des Endwerts erreicht.
Das reicht für einen 10-Bit-Wandler eigentlich noch nicht ganz... ;-)