Hallo liebe Community, ich habe ein Problem, mit mehreren ADCs an einem atmega1284, der fest in eine Schaltung integriert ist. Die ADC-Kanäle sind ADC5-7. Da ich noch nicht sehr viel Erfahrung mit dem ADC habe, bitte ich hier um Hilfe. Das Problem ist, das die Werte entweder gar nicht stimmen oder die einzelnen Kanäle sich gegenseitig beeinflussen. Hier erstmal der Quell-Code mit dem ich es versucht habe: #define F_CPU 20000000UL #define BaudRate 9600UL #include <avr/io.h> void uart_init (void){ uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU/(16*BaudRate)-1); UBRR0H = (uint8_t)(ubrr >> 8); UBRR0L = (uint8_t)(ubrr); UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); } int main(void) { uart_init(); int x=0; DDRA=0b00000000; //Eingänge setzen ADCSRA=0b10000111;//Register setzen ADMUX=0b01000101;//Register setzen while( 1 ) { while (!(UCSR0A & (1<<RXC0))); x=UDR0; ADMUX=0b01000101; ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten } x=ADC;//Wert auslesen while ( !( UCSR0A & (1<<UDRE0)) );//senden UDR0 = x; ADMUX=0b01000110; ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten } x=ADC;//Wert auslesen while ( !( UCSR0A & (1<<UDRE0)) );//senden UDR0 = x; } } Die Uartverbindung klappt, denn das Programm wartet erstmal auf irgendein Zeichen und wenn ich das gesendet habe, kommen auch zwei Werte zurück. Ich wüsste nun gern, ob mein Programm falsch ist oder ob der AVR kaputt ist oder was es noch sein könnte. Schonmal danke für eure Antworten.
Keine Lösung, aber ein Hinweis: Kaputt ist der AVR sicher nicht. Auch das Programm dürfte stimmen. Ich selbst habe ein ähnliches Problem bei einem atmega8. Beim abwechselnden Messen auf Kanal 7 und 6 kommen falsche Messergebnisse heraus, anscheind hängt das mit dem MUX-Schalter zusammen. Einzelkanalmessungen ohne Schalten des MUX ergeben ein völlig plausibles Resultat. Atmel gibt auch den Hinweis, nach dem Schalten des MUX das jeweils erste Messergebnis zu verwerfen und nur die folgenden zu verwenden. Leider hat das nicht geholfen: Ich lese jetzt abwechselnd mit je einer Folge von 256 Messungen und Mittelwertbildung, wie im Tutorial, und trotzdem bekomme ich das typisch falsche Ergebnis. Eine andre Ursache könnte ein Übersprechen von Nachbarleitungen her sein. Eventuell das Messen im sleep-mode durchführen, wie im Datenblatt beschrieben, könnte da helfen, nur kam ich da noch nicht dazu. (Ich messe derzeit nur per Kanal 6)
Allerdings liefert das Programm auch dann keine plausiblen Messwerte, wenn ich nur einen Kanal benutze. Außerdem weiß ich nicht genau welchen Referenz ich nehmen muss, könntest du mir das anhand des Schaltplans sagen?
>Allerdings liefert das Programm auch dann keine plausiblen Messwerte, >wenn ich nur einen Kanal benutze. Das liegt eventuell daran das du nur das untere Byte vom 10 Bit Wert überträgst.
Hi >Außerdem weiß ich nicht genau welchen Referenz ich nehmen muss, könntest >du mir das anhand des Schaltplans sagen? Welche Spannungen misst du denn an Line_L/C/R? >Allerdings liefert das Programm auch dann keine plausiblen Messwerte, >wenn ich nur einen Kanal benutze. Was ist denn für dich plausibel? MfG Spess
@holger Und wie lese ich den ganzen adc aus? @spess53 Da es sich um Phototransistoren handelt, wären plausible Messwerte z.B. bei weißen Untergrund 255/1024 und bei schwarzem Untergrund 0.
Du schreibst nur das niederwertige Byte des 16-Bit Wertes x auf das serielle Register. MGS:GZ schrieb: > UDR0 = x; Dein ADC Wert mag dagegen ganz in Ordnung sein ....
Hi >Und wie lese ich den ganzen adc aus? Du liest ja den ganzen ADC-Wert aus. Aber UDR0 = x; überträgt nur acht Bit. >wären plausible Messwerte >z.B. bei weißen Untergrund 255/1024 und bei schwarzem Untergrund 0. Aber nicht unter realen Bedingungen. Nochmal: Was misst du an den ADC-Eingängen? MfG Spess
Wie sieht es eigentlich bei deinen Lichtschranken mit dem Schutz vor Fremdlicht aus? Leuchtstofflampen bringen dir 100Hz Brumm drauf. Selbst Glühlampen sind nicht ganz ohne Wechselanteil.
Vielen Dank an alle die etwas geschrieben haben. Es funktioniert nun. Das Hauptproblem war das UDR0 nur 8bit überträgt und nicht 16bit. Auch die beeinflussung der Kanäle ist nun weg. Noch mal Danke an alle!!!
MGS:GZ schrieb: > ich habe ein Problem, mit mehreren ADCs an einem atmega1284, der fest in > eine Schaltung integriert ist. Die ADC-Kanäle sind ADC5-7. > Da ich noch nicht sehr viel Erfahrung mit dem ADC habe, bitte ich hier > um Hilfe. > Das Problem ist, das die Werte entweder gar nicht stimmen oder die > einzelnen Kanäle sich gegenseitig beeinflussen. Es gibt genau drei mögliche Gründe für diese Probleme: 1) Programmierfehler. Abhilfe: selbige beheben. 2) Zu hohe Samplerate. Abhilfe: selbige reduzieren. 3) Zu hohe Quellimpedanzen. Abhilfe: selbige reduzieren. Zu allen drei Problemkreisen bietet das Datenblatt eigentlich alle nötigen Informationen. Hast du es gelesen?
spess53 schrieb: > Was ist denn für dich plausibel? Ergebnisse die in den möglichen Toleranzbereich passen und das zu erwartende Verhalten zeigen. Wenn aber an einem Kanal 1,3V gemessen werden und am andren 1,57 V und die ausgegebenen Werte im Verhältnis 1:1,3 stehen ist das nicht erklärlich. Auch am Verhalten, wie Streuung der Messwerte lässt sich Einiges erkennen. Die unteren zwei bit zeigen halt die übliche Streuung. Ich hab halt, wegen der Ähnlichkeit meines Problems gehofft, irgendeinen Hinweis zu bekommen von Jemandem, der Ähnliches mit dem atmega8 erlebt hat. Inzwischen habe ich das Problem umgangen, nicht gelöst. Ich arbeite nur mit Kanal6. Was Kanal 7 direkt messen sollte lässt sich am Signal 6 daran erkennen, dass es nahezu auf Null geht. Da das Problem (für mich) nicht mehr existiert, verabschiede ich mich mit einem Danke und wünsche noch eine schöne Zeit.
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.