Forum: Mikrocontroller und Digitale Elektronik ATMega8 - Problem mit ADU


von Dominik W. (absurdum)


Angehängte Dateien:

Lesenswert?

Habe ein Problem mit dem ADU beim ATMega8.

Habe einen DMX Transceiver gebaut um mit ihm LED Scheinwerfer 
anzusteuern.
Zum Einstellen der Helligkeit und der Geschwindigkeit des Farbwechsels 
habe ich zusätzlich 2 Potis genommen.
Ich will die beiden Spannungswerte der Potis (~0 - 5V) digitalisieren 
(mittels ADU) und zur Steuerung der Helligkeit und der Geschwindigkeit 
des Farbwechsels verwenden.
Wenn ich nur einen der beiden ADU Eingänge verwende, passen die Werte. 
Aber wenn ich beide Eingänge auslese, vermischen sich die Ergebnisse und 
es kommt ein Blödsinn raus.
Hab schon diverse Methoden probiert, aber noch keine Lösung gefunden.
- Hab schon probiert den ADU jedes Mal zuerst zu starten und nach der 
Konvertierung wieder zu beenden
- Hab schon probiert, vor der Konvertierung ein Dummie-Readout zu machen 
und danach den Mittelwert aus 4 Ergebnissen zu bilden

Ich mache die Auswertung mittels Polling, weil ich vermeiden will, dass 
der ADU Interrupt mit dem Interrupt des USART (DMX) konguriert.

Der Code im Anhang ist vereinfacht, habe alle DMX betreffenden Teile 
herausgenommen, da ich hoffe, dass so jemand schneller einen Fehler 
entdeckt.

Wäre sehr sehr dankbar wenn mir bei dem Problem jemand helfen könnte.

von LordZiu (Gast)


Lesenswert?

Hallo Dominik,

Schonmal mit dieser Funktion hier versucht?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Aktivieren_des_ADC

Das benutze ich immer und es hat bisher super geklappt. Ansonste poste 
mal deinen Schaltplan.

von Dominik W. (absurdum)


Lesenswert?

Diese Version hab ich schon probiert.
Es ändert sich nichts.

Schaltplan:
hab zwei 10k Potis am ADC0 und am ADC1 eingang.
Poti liegt an 0 und +5V, Schleifer auf µC

Des komische ist, beide Potis sind angeschlossen, in dem Modus in dem 
nur ein Kanal ausgelesen wird, funktionierts ohne Probleme. Erst wenn 
ich den zweiten Kanal zusätzlich auslesen will kommt nichts gescheites 
raus.

von LordZiu (Gast)


Lesenswert?

Lies hier nochmal nach, wie man das ADC-Register ausliest:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

Auf den ersten Blick sehe ich nur, dass du lediglich den ADCH ausliest. 
Mal davon abgesehen, dass ADCH dir nur die Auflösung / 8 gibt, musst du 
beide Register auslesen.

Von der Beschaltung sollte es so funktionieren. Wo setzt du deine 
Referenzspannung?

von Karl H. (kbuchegg)


Lesenswert?

LordZiu schrieb:

> Auf den ersten Blick sehe ich nur, dass du lediglich den ADCH ausliest.
> Mal davon abgesehen, dass ADCH dir nur die Auflösung / 8 gibt, musst du
> beide Register auslesen.

Nein. Muss er nicht.
ADCH muss auf jeden Fall gelesen werden. ADCL nur dann, wenn man am Wert 
interessiert ist (und wenn das der Fall ist, dann muss ADCL vor ADCH 
ausgelesen werden. ADCL lesen verriegelt den ADC Wert gegen 
Veränderungen, ADCH lesen hebt die Verriegelung wieder auf). Da er ADLAR 
gesetzt hat reicht es nur ADCH zu lesen.

Ich seh im Code allerdings auch nichts.

von Dominik W. (absurdum)


Lesenswert?

Könnte es sein, dass der Interrupt des USARTs die Konvertierung 
beeinträchtigt?
Allerdings wüsste ich dann gern, warum es funktioniert, wenn ich nur 
einen Kanal auslese.

Ein Freund hat gemeint, dass eventuell eine Verknüpfung zwischen den 
beiden Kanälen sein könnte, weiß jemand was dazu?

von spess53 (Gast)


Lesenswert?

Hi

Ich sehe keinen Wert für den Prescaler. Möglicherweise ist dein ADC zu 
schnell.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Gerade gesehen ADC mit 16MHz. Recht sportlich.

MfG Spess

von Dominik W. (absurdum)


Lesenswert?

Was für ein Prescaler wär bei 16 MHz empfehlenswert?

Warum funktionierts dann, wenn ich nur einen auslese?

von Karl H. (kbuchegg)


Lesenswert?

Dominik W. schrieb:
> Was für ein Prescaler wär bei 16 MHz empfehlenswert?

Datenblatt nachsehen.
Da steht drinnen, in welchem Ferquenzbereich der ADC benutzt werden 
soll. Du hast deine Taktfrequenz, weist in welche Frequenzbereiche du 
kommen musst und suchst dir davonausgehend den dafür notwendigen 
Prescaler.

> Warum funktionierts dann, wenn ich nur einen auslese?

Wahrscheinlich deswegen, weil du dann zwischendurch den Kanal nicht 
wechselst. Die Sample&Hold Stufe wird sich dann irgendwann auch so auf 
den richtigen Wert einstellen. Schlimmstenfalls erst nach dem 2.ten oder 
3.ten Ausleseversuch.

von X- R. (x-rocka)


Lesenswert?

Der Multiplexer ist das Problem, vor allem bei der Abtastrate.

Ich nutze den ATmega ADC generell nur per Interrupt, und wenn ich den 
ADMUX umschalte, warte ich erstmal 1 - 4 ADC Werte, bis ich sie nutze.

Funtioniert wunderbar mit allen Kanälen.

ninja'd!

von spess53 (Gast)


Lesenswert?

Hi

>Der Multiplexer ist das Problem, vor allem bei der Abtastrate.

Nein, die Sample&Hold-Stufe. Irgendwann reicht die Zeit nicht mehr, um 
den Kondensator unzuladen.

>Ich nutze den ATmega ADC generell nur per Interrupt, und wenn ich den
>ADMUX umschalte, warte ich erstmal 1 - 4 ADC Werte, bis ich sie nutze.

Dann kannst du den ADC auch gleich langsamer laufen lassen und es klappt 
dann auch bei jeder Messung.

>Was für ein Prescaler wär bei 16 MHz empfehlenswert?

Bei 16MHz: 128

MfG Spess

von X- R. (x-rocka)


Lesenswert?

spess53 schrieb:

>>Der Multiplexer ist das Problem, vor allem bei der Abtastrate.
>
> Nein, die Sample&Hold-Stufe. Irgendwann reicht die Zeit nicht mehr, um
> den Kondensator unzuladen.

stimmt ja, hätte schreiben sollen "das multiplexen der S/H"...
egal, ich nehme lieber höhere Abtastrate und schmeiße die ersten Werte 
weg, betreibe dafür dann oversampling.

von Walter (Gast)


Lesenswert?

also ich nehme jeden Wert, auch nachdem ich den MUX umgeschaltet habe 
und es funktioniert,
ich habe auch im Datenblatt nichts gefunden dass es nicht funktionieren 
sollte, man sollte natürlich das Datenblatt beachten beim Umschalten

von Dominik W. (absurdum)


Lesenswert?

Hab jetzt den Prescaler auf 64 eingestellt und es FUNKTIONIERT!!!
Herzlichen Dank an spess53
Hab alles probiert und an alles gedacht, außer an die Geschwindigkeit!

von Manuel (Gast)


Lesenswert?

Du solltest trotzdem lieber Prescaler 128 nehmen, wie Spess schrieb, 
damit die Frequenz zwischen 50kHz nud 200kHz liegt, siehe Tutorial ADC.

von spess53 (Gast)


Lesenswert?

Hi

>Hab jetzt den Prescaler auf 64 eingestellt und es FUNKTIONIERT!!!

Freut mich.

>Hab alles probiert und an alles gedacht, außer an die Geschwindigkeit!

Wenigstens wirst du das nicht so schnell wieder vergessen.

MfG Spess

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
Noch kein Account? Hier anmelden.