ATMEGA8: >> Spannung messen mit ADC >> C

Gast #2047048
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
Angehängte Dateien:
#2047143
Lesenswert?

Und gleich noch einmal
1
uint16_t ADC_Read( uint8_t channel )
2
{
3
  // Kanal waehlen, ohne andere Bits zu beeinflußen
4
  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.
Gast #2047163
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 :)
Gast #2047170
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 :)
#2047238
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)
Gast #2047762
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren