Forum: Mikrocontroller und Digitale Elektronik Atmega32 ADC- Probleme


von Christian P. (peterfrosta)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen.

Ich möchte mit zwei ADC Eingängen des Atmega32, jeweils einen 
Reflexkoppler (SFH9202) Auswerten.

Ausgangsituation:
Ansteuerung einens Uhrwerks. Zeigerpositonserkennung mittels 
Reflexkoppler und weißer Makierung auf den schwarzen Zahnrädern soll 
verwirklicht werden.
Das sollt die automatische Uhreinstellung ermöglichen.

Bisher ist alles experimentell aufgbaut. Der Aufbau besteht aus:
-Pollin Funk-AVR-Evaluations-Board mit Atmega32
-Uhrwerk inklusive der Reflexkoppler.

Siehe Anhang 1 und 2!



Problem:
Mit einem ADC-Eingang ging es auf Anhieb. es zeigte sich immer 1023 und 
sobald was weißes vorgehalten wurde zeigte die Anzeige auf dem Terminal 
irgendwas unter 100 an. Soweit so gut^^

Dann habe ich Versucht im Hauptprogramm zwei Eingänge nacheinander 
abzufragen. Das klappte nicht.
Verschiedene Fehlerbilder zeigtn sich beim experimentieren.
Entweder reagierten beide Eingänge zugleich auf nur einen Koppler und 
auf den anderen Koppler garnicht.
Oder es reagierten beide garnicht und die Werte "rauschten so zwischen 
300 und 900.

Die Funktionsfähigeit der Reflexkoppler habe ich mit dem Oszilloskop 
stets verfolgt. Sie funktionieren. bei Schwarz sind stehts 5 Volt und 
sobal der weißes vorgehalten wird fällt die Spannung auf ca 0,1 Volt.

Dann habe ich nächtelang meinen Code kaputtgebastelt, so dass ich 
einfach garnicht mehr durchblicke.

Worauf ist zu achten wenn zwei ADC-Eingänge benutzt werden sollen?

ich hab es mit dem kaputtgebasteltem auch nicht mehr geschafft soweit zu 
reduzieren, dass es wieder mit einen ADC-Eingang ging. Daher hab ich mir 
aus der Dropbox alte Versionen von den Datei geladen, und da ging ein 
ADC-Eingang wieder.

Ich pack mal die main.c und adc.h in den Anhang.
Ja ich weiß das meine Header eigentlich in eine .h und .c-Datei gehört. 
Das hat mir aber bisher immer Schwierigkeiten beschert.

Ist in meiner ADC-Anwendung sonst irgendwas schlecht oder falsch? was 
ist zu endern, wenn ich zwei ADC-Eingänge nutzen will? hab ja zwei 
Reflexkoppler(Stunden- und Minutenzeiger).

ich danke euch vielmals!

EDIT: Der Kondensator an ARef und GND ist direkt am uC angelötet.

von Christian P. (peterfrosta)


Lesenswert?

Christian Peskov schrieb:
> Entweder reagierten beide Eingänge zugleich auf nur einen Koppler und
> auf den anderen Koppler garnicht.

zugleich heiß hier gleichzeitig, und nicht das Sie identsiche Werte 
anzeigten.

von Uwe (de0508)


Lesenswert?

Hallo Christian,

ich verstehe deinen Ansatz nicht.

"0" und "1" erkenne ich immer mit einem TTL Eingang. evtl. schaltet man 
noch einen Schmitt Trigger davor.

Was soll das mit dem ADC.

Zu den .C und .H sollte Du dich richtig informieren, das zeigte ist 
mist.

von spess53 (Gast)


Lesenswert?

Hi

Hast du Pull-Up-Widerstände an den Ausgängen der Optokoppler?

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Christian Peskov schrieb:

> Worauf ist zu achten wenn zwei ADC-Eingänge benutzt werden sollen?

Das du beim UMstellen des ADC-MUltiplexers nicht die restliche 
Konfiguration in diesem Register zerschiesst.

> Mit einem ADC-Eingang ging es auf Anhieb. es zeigte sich immer 1023
> und sobald was weißes vorgehalten wurde zeigte die Anzeige auf dem
> Terminal irgendwas unter 100 an. Soweit so gut^^

Also de facto ARef und GND.
Da schliesse ich mich Uwe an: Wozu der ganze Häckmäck mit dem ADC?

von Christian P. (peterfrosta)


Angehängte Dateien:

Lesenswert?

Jo Uwe...
das ist eine super Idee!! Das haette mir auch einfallen können. Bei dem 
Stundenzeiger ist der übergang von 5 Volt zu fast 0Volt jedoch 
langsamer, meherere Minuten, so das es hier vllt zu Problemen kommen 
kann. Aber die eine Option wäre das schon!

also ich hab viel aus dem Code gelöscht um es euch pübersichtlicher zu 
machen... die Porteinstellung in der adc.h hab ich bspw. auch nur hinein 
kopiert damit ich nicht alle möglich header hochladen muss.
Aber voll kommen richtig ist, das meine Headergeschichten Mist sind! ^^
Aber bisher funktioniuert noch alles!

@spess:
Ja hab ich ... hab ich leider vergessen einzuzeichnen.
Laut Datenblatt sollten/können das 1kOhm sein. Da war die Empfindichkeit 
jedoch nicht optimal und ich hatte Sorge das zuviel Strom fließt. Ich 
habe an PA2  bzw. PA3 jeweils einen 56kOhm Widerstand als Pull-Up 
verbaut.
Gemäß dem Datenblatt der Optokoppler - siehe Anhang3

von Peter D. (peda)


Lesenswert?

Christian Peskov schrieb:
> Ist in meiner ADC-Anwendung sonst irgendwas schlecht oder falsch?

Ja, Du schaltest nirgends ADMUX um!
Wenn Du 2 Eingänge messen willst, mußt Du sie auch auswählen.

Ich benutze gerade den AT90CAN128:
1
uint16_t adc_int_conv( uint8_t channel )
2
{
3
  ADMUX = channel | 0<<REFS1 | 1<<REFS0;            // Ref = VCC
4
  ADCSRA = 1<<ADEN | 1<<ADSC | 0<<ADATE | 0<<ADIF | 0<<ADIE | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;
5
                                                    // Start, 16MHz / 128 = 125kHz
6
  while( ADCSRA & 1<<ADSC );                        // until conversion finished
7
  return ADC;
8
}


Peter

von Christian P. (peterfrosta)


Lesenswert?

Peter Dannegger schrieb:
> Ja, Du schaltest nirgends ADMUX um!
> Wenn Du 2 Eingänge messen willst, mußt Du sie auch auswählen.

^Ja richtig, weil das eine alte Version ist, in der es mit einem Eingang 
ging. Also bevor ich es mit zweien versuchte.

das mit dem Mux hatte ich natürlich versucht.

Wenn ich dass jetzt auf die schnelle richtig sehe, initialisierst du den 
ADC gleich in der Funktion. Machst also alles in einer Funktion. 
Funktioniert das bei dir gut?
Weil ich gelesen hatte, das beim umstellen von ADMUX Zeit abgewartet 
werden muss?!
Dummyreads machst oder Durchschnittsberechnung machst du auch nicht 
oder?
Danke für den Code! Werde ich auf jedenfalls später mal in einem 
Jungfräulichen Projekt ausprobieren. cool.
wäre ja dann wie erwartet easy... abwarten^^

von Peter D. (peda)


Lesenswert?

Christian Peskov schrieb:
> Funktioniert das bei dir gut?

Ja, auf 10Bit.

Christian Peskov schrieb:
> Weil ich gelesen hatte, das beim umstellen von ADMUX Zeit abgewartet
> werden muss?!

Das macht der ADC automatisch.
Nur beim Einschalten, Referenz umschalten, oder Bandgap messen, muß man 
zusätzlich warten.
Sind die Quellen sehr hochohmig (>10k), schaltet man 100nF als Puffer an 
jeden Eingang. Der hat dann genügend Ladung für den S&H-Kondensator.

Christian Peskov schrieb:
> Dummyreads machst oder Durchschnittsberechnung machst du auch nicht
> oder?

Nein.
Mittelwert nur bei stark verbrummten Eingangsspannungen.


Peter

von Christian P. (peterfrosta)


Lesenswert?

klingt sehr gut^^
teste ich heute abend spätestens.
das wäre ja dann echt kompakt.

Als Eingang ohne Pull-up definierst du die Ports der entsprechenden 
Kanäle dann zu Beginn einmal?
Ich weiß, eine doofe Frage ...

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.