Forum: Mikrocontroller und Digitale Elektronik Atmega1284 ADC


von MGS:GZ (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Peter R. (pnu)


Lesenswert?

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)

von MGS:GZ (Gast)


Lesenswert?

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?

von holger (Gast)


Lesenswert?

>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.

von spess53 (Gast)


Lesenswert?

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

von MGS:GZ (Gast)


Lesenswert?

@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.

von Mitlesa (Gast)


Lesenswert?

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 ....

von spess53 (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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.

von MGS:GZ (Gast)


Lesenswert?

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!!!

von c-hater (Gast)


Lesenswert?

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?

von Mitlesa (Gast)


Lesenswert?

c-hater schrieb:
> Hast du es gelesen?

Hast du den Thread durchgelesen?

von Peter R. (pnu)


Lesenswert?

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