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.
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.
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.
Hi Hast du Pull-Up-Widerstände an den Ausgängen der Optokoppler? MfG Spess
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?
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
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
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^^
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.