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


von Chillxx (Gast)


Angehängte Dateien:

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

von Nonsense (Gast)


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.

von Chillxx (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

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

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

von Karl H. (kbuchegg)


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.

von Nonsense (Gast)


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 :)

von Chillxx (Gast)


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 :)

von Karl H. (kbuchegg)


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)

von Chillxx (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

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

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.