mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA8: >> Spannung messen mit ADC >> C


Autor: Chillxx (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich hab schon ein paar Beiträge gestartet, doch dort passt mein 
aktuelles Problem nicht mehr so richtig hin :)
Infos zur Anwendung findet ihr hier, falls relevant:
Beitrag "ATMEGA8 in C: 1 Tastendruck --> 2 verschiedene Funktionen -->Hilfe!"

Ich will laut Schaltplan die Akkuspannung mittels ADC am Analog-PIN PD0 
messen.

Das Programm hab ich nun auf eine Zustandsmaschine aufgebaut und es 
funktioniert einwandfrei.
Nur die Messung der Spannung funktioniert noch nicht bzw. wenn ich die 
Versorgunsspannung auf 6V verringere (6V wäre meine Schwellspannung, bei 
dem meine Anwendung nicht mehr starten dürfte), wird das Programm aber 
trotzdem ganz normal fortgeführt!

Hab ich am Schaltplan was vergessen oder passt das Programm 
nicht....oder beides?? Hab ich was übersehen?

Anbei befindet sich auch der Code...vielleicht kann mir jemand auf die 
Sprünge helfen?!

MFG

Autor: Nonsense (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für eine Spannung liefert der MCP1703? Falls die unter 3.7V liegt 
liefert dir der Spannungsteiler am ADC nämlich momentan eine unzulässig 
hohe Spannung bei vollem Akku. Diese sollte idealerweise <= VCC sein.

Autor: Chillxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nonsense schrieb:
> Was für eine Spannung liefert der MCP1703?

Dieser liefert 5V und die habe ich als Referenz für den ADC genommen.
Die maximale Spannung am Spannungsteiler von 3,7V passt ja dann nicht 
schlecht, oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    ADMUX = (0<<REFS1) | (1<<REFS0);          // AVcc als Referenz benutzen
    ADMUX = (1<<MUX0);        // Pin PC0 (23) als Analogeingang
 

Gratuliere:
Mit der 2.ten Zuweisung an ADMUX hast du dir soeben wieder die 
Referenzspannung abgeschaltet.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und gleich noch einmal
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (1<<MUX0);

:-)
Besonders pikant: der Kommentar dazu!


Warum hast du die Tutorial Routinen verändert? Das hatte schon seinen 
Sinn, warum da im Tut etwas Aufwand getrieben wird.


Weiter hab ich dann nicht mehr geschaut.

Autor: Nonsense (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chillxx schrieb:
> Dieser liefert 5V und die habe ich als Referenz für den ADC genommen.
> Die maximale Spannung am Spannungsteiler von 3,7V passt ja dann nicht
> schlecht, oder?

Nee, das passt dann. Die Spannung am ADC darf ja VCC nicht 
überschreiten. Dein Spannungsteiler liefert bei 7,4V aber 3,7V am ADC, 
was deutlich unter deiner VCC von 5V liegt, somit ist also alles in 
Ordnung :)

Autor: Chillxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab gedacht, ich müsste hier was ändern
Ich verwende aber nur den PD0 zum messen, muss ich dann diese Zeile 
trotzdem gleich lassen?

ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);

wahrscheinlich schau ich, unter anderem, schon so lange dieses Tutorial 
an, dass ich bald garnichts mehr verstehe :)

steh momentan einfach an, hinterher werde ich sicher einen AHA-Effekt 
erleben :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chillxx schrieb:
> Ich verwende aber nur den PD0 zum messen, muss ich dann diese Zeile
> trotzdem gleich lassen?

Müssen nicht.
Aber du kannst.

Aber wenn du sie änderst, dann must du die auch richtig ändern.

In ADMUX sind die Bits für die Referenzspannung! die darfst du nicht 
verändern, wenn du die Kanalbits setzt. Die Originalroutinen 
berücksichtigen das. Deine Änderung aber nicht!

>
> ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);

          |               |
          +---------------+
            Nur die tatsächlichn
            Kanalbits auf 0 setzen

          |                                   |
          +-----------------------------------+
                Und die Bits für den gewählten
                Kanal auf 1 setzen

In Summe: Die Bits für die Referenzspannung werden nicht geändert. Die 
sind immer noch so wie sie im ADC_Init eingestellt wurden (sofern in 
ADC_Init die zweite Zuweisung an ADMUX rausgenommen wird. Denn die 
löscht die zuvor eingestellten Bits für die Referenzspannung ebenfalls)

Autor: Chillxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar :)

ich habs wieder in den ursprünglichen Zustand versetzt (lt.Tutorial), 
und siehe da --> es funktioniert!! und danke für die Erklärung Herr 
Buchegger ;)

Noch eine Frage zum Schaltplan:
Sollte ich beim R14 den uC  irgendwie vor Spannungsspitzen schützen zb. 
mit einer Z-Diode? Oder kann man das vernachlässigen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da rinnt über die 10k so wenig Strom, dass das die internen 
Clipping-Dioden schon schaffen.

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.