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.