www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD-Wandler Atmega 32


Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte bei einem Gerät noch eine Batterie-Zustands-Anzeige 
machen. Dazu beutze ich den AD-Wandler des Controllers. Der AD-Wandler 
liefert doch einen Wert zwischen 0 und 1023 oder?
Ich möchte, dass ich nur Werte zwischen 0 und 7 (bzw. 1 und 8) erhalte. 
Dazu muss ich doch als Teilungsfaktor "128" einstellen, also ADPS2, 
ADPS1 und ADPS0 auf 1 setzen. Stimmt das so?
Ich erhalte auf meinem Display nämlich Ergebnisse, die nicht gerade der 
Realität entsprechen.

Vielen Dank!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem Teilerfaktor hat das ganze überhaupt nichts zu tun! Der 
definiert nur, mit welchem Takt der ADC arbeitet, also wie lange er für 
eine Wandlung braucht. In Deinem Fall musst Du aber das Ergebnis der 
Wandlung entsprechend weiterverarbeiten.

Zunächst mal solltest Du das ADLAR-Bit im ADMUX-Register setzen. Dann 
wird das Ergebnis schon mal linksbündig ausgegeben und Du musst nur noch 
das 8-Bit-Register ADCH auslesen (Wertebereich 0...255). Und den Wert 
teilst Du noch durch 32. Dann hast Du Deinen Wertebereich von 0...7.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies dich mal im Dateblatt ein, wie das ADC-Ergebnis 'left-adjusted' 
eingestellt wird, dann bist du bei 8 bit (die unteren 2 bit kannst du 
ignorieren, indem du dann nur ADCH ausliest). Diese 8 bit nun 5 bit nach 
rechts schieben und du bist bei 3 bit Auflösung (0..7). In Assembler und 
in C die schnellste Variante.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn dir 0..3 (also 1..4) als Wertebereich ausreichen, dann nimm doch 
einfach right-adjusted und lies nur das ACDH aus, das denthält dann 
werte zwischen 0...3

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hier ist mal der Quellcode, hab im Moment noch Probleme mit dem 
AD-Wandler. Wenn ich den Pin am Controller auf Masse ziehe, krieg ich 
immer noch einen hohen Wert, also eigentlich immer...
uint16_t ReadChannel(uint8_t kanal)
{
  uint8_t i;
  uint16_t result;

  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);      // Frequenzteiler auf 128 setzen --> 8 Zustände 
                                            
  ADMUX = kanal;                              // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0);         // interne Referenzspannung nutzen 

/*  // Dummy-Messung (wird bei ADC-Initialisierung selbständig ausgeführt...

  ADCSRA |= (1<<ADSC);                      // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;                           // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;                    // ADCW muss einmal gelesen werden,
                                    // sonst wird Ergebnis der nächsten Wandlung
                                    // nicht übernommen.
*/
  // Eigentliche Messung

  result = 0; 
    ADCSRA |= (1<<ADSC);                    // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;                         // auf Abschluss der Konvertierung warten
    }
    result = ADCW;                    // Wandlungsergebnis
  ADCSRA &= ~(1<<ADEN);                     // ADC deaktivieren
 
  return result;
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wundert mich nicht wirklich. Im Datenblatt steht eindeutig, dass das 
erste Ergebnis nach dem Start des ADC u.U. für die Tonne ist. Warum hast 
Du die Dummy-Wandlung auskommentiert? Die könnte das Problem nämlich 
beheben. Und je nachdem, wie oft gewandelt werden soll, ist es auch 
unsinnig, den ADC nach jeder Wandlung wieder zu deaktivieren. Dann kann 
man sich auch die Dummy-Wandlung sparen (außer beim ersten Mal, aber das 
kann man in main nach der Initialisierung machen).

Außerdem solltest Du bei Änderungen im Code auch die Kommentare 
entsprechend anpassen. Das mit "Frequenzteiler auf 128 setzen --> 8 
Zustände" hatten wir schließlich schon geklärt (hoffe ich jedenfalls).

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch vor der ersten Wandlung 120µs Pause machen (bzw. etwas 
Anderes), dann kommt auch bei der ersten Wandlung was Vernünftiges 
'raus.
Zwischen dem Einstellen der Betriebsart und der nächsten Messung 120µs 
Pause machen.

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hab jetzt die Dummy-Wandlung wieder drin. Bekomme als Ergebnis 
jedoch immer 255 angezeigt. Sogar wenn ich die den ADC-Kanal auf Masse 
lege. Ich hab aber einen anderen Punkt auf der Platine gefunden 
(übrigens auch auf Masse-Potenzial!!!!!!!!), bei dem dann 31 angezeigt 
wird.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den Kondensator (100 nF) am AREF-Pin gegen Masse?

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein hab ich nicht, ist laut Datenblatt auch nicht unbedingt nötig. Bei 
mir ist die Genauigkeit sowieso nicht so wichtig, ich brauch ja nur 3 
Bits.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verzeihe mir bitte die dumme Frage: AVCC/AGND angeschlossen?

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja klar ist angeschlossen

Autor: Auch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nein hab ich nicht, ist laut Datenblatt auch nicht unbedingt nötig.

Das was die Entwickler vom Atmel vorschlagen ist ja total unwichtig.

Autor: Wurst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An dem Kondensator liegts ziemlich sicher nicht, der ist zwar wichtig, 
aber wenn er wirklich nur die obersten Bits braucht kann man den auch 
weglassen. Wenn man feststellt, dass diese dennoch flattern sollten kann 
man den auch noch einbauen. Aber momentan scheint er immer den gleichen 
Wert zu bekommen und da ist der Kondensator kaum schuld.
Ich will damit nicht sagen, dass es nicht nötig ist diesen Kondensator 
einzubauen, aber eben...

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also es funktioniert!!!
An was es lag, darf ich hier aber nicht sagen, sonst bekomm ich von euch 
Prügel!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sags trotzdem, welchen Fehler hast du gemacht, über den wir sicherlich 
auch mal gestolpert sind

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flea wrote:
> Also es funktioniert!!!
> An was es lag, darf ich hier aber nicht sagen, sonst bekomm ich von euch
> Prügel!
Die bekommste auch so...;-) Also raus damit! Falschen Pin an GND 
gezogen?

Autor: Wurst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sei kein Spielverderber, Unterhaltung muss sein!

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ding ist ne fertige Platine, bei der ich noch den Batteriezustand 
aufs Display machen sollte. Da der Controller so klein ist, habe ich von 
jemand anderem einen losen Draht an den ADC-Pin anbringen lassen. Und 
ich hab jetzt zweieinhalb Stunden gebraucht um herauszufinden, dass der 
Draht Isolierlack drauf hatte ^^

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..n anbringen lassen....raht Isolierlack ..


Wie wurde er dann angebracht? Sekundenkleber?

Autor: Flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit Tesafilm! Was sonst?
Oder wie nennt man das auf dem Draht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.