Forum: Mikrocontroller und Digitale Elektronik ADC-Mega8, Hilfe bitte, Ich komme nicht weiter


von Wilfried H. (willi_2)


Angehängte Dateien:

Lesenswert?

Hallo liebe AVR-Gemeinede,
ich bin ziemlicher Neuling was den Umgang mit µC’s angeht obwohl ich 
schon einige Zeit recht intensiv hier im Forum und in den Tutorials 
unterwegs bin. Ich beschäftige mich mit einem ATmega8 und habe auch 
schon einige Projekte erfolgreich abgeschlossen. Ich programmiere mit C 
und AVR-Studio.
Zurzeit bin ich dabei mich durch das Thema AD-Wandlung zu wühlen. Ich 
habe mir ein Projekt gewählt in dem ich die Spannung und damit den 
Ladezustand einer 12V- Batterie überwachen und anzeigen  möchte. 
Getaktet wird der Mega8 mit internen 8 MHz. Als Referenzspannung habe 
ich AVCC +5V gewählt und die Mess-Spannung wird über einen 
Spannungsteiler auf PC0 gelegt. Das Wandlerergebnis wird durch 
Umwandlungsfunktionen darstellbar gemacht und auf einem 2x16 LCD-Display 
ausgegeben.
Des Weiteren soll über einen Timer-Interrupt auf bestimmte 
Wandlerergebnisse reagiert werden. Entsprechend soll in der 2.Zeile des 
Displays eine Nachricht ausgegeben werden.
Das alles funktioniert auch alles ganz gut. Aber doch gibt es ein 
Problem. Der angezeigte Spannungswert stimmt nämlich nicht. Auf meinem 
Entwicklungsbord  habe ich der Einfachheit halber die 
Versorgungsspannung von 5V über ein 25K Poti als Spannungsteiler als 
Mess-Spannung benutzt. Es wäre also zu erwarten, das die angezeigte 
Spannung max. 5V sein wird. Dem ist aber leider so. Tatsächlich wird die 
5V-Anzeige schon bei ca. 50% Poti-Stellung erreicht und geht dann über 
5V hinaus, was ja eigentlich nicht sein kann. Leider kann ich den Fehler 
nicht finden.
Bitte seht Euch doch mal an was ich da „zusammengebraut“ habe. 
Vielleicht könnt Ihr mir sagen wo mein Fehler liegt. Ich wäre Euch sehr 
dankbar.

Gruß Wilfried

von Lord Z. (lordziu)


Lesenswert?

Fangen wir erstmal mit der Hardware an. Hast du die Versorgungsspannung 
des ADC angeschlossen? Und alle nötigen Abblock-Kondensatoren?

von Peter Z. (hangloose)


Lesenswert?

Ich tippe mal... falsche Referenz Spannung eingestellt

von Karl H. (kbuchegg)


Lesenswert?

Wilfried H. schrieb:

> Das alles funktioniert auch alles ganz gut. Aber doch gibt es ein
> Problem. Der angezeigte Spannungswert stimmt nämlich nicht. Auf meinem
> Entwicklungsbord  habe ich der Einfachheit halber die
> Versorgungsspannung von 5V über ein 25K Poti als Spannungsteiler als
> Mess-Spannung benutzt. Es wäre also zu erwarten, das die angezeigte
> Spannung max. 5V sein wird.

Ich kann in deinem Code überhaupt nichts entdecken, wo du den 
'Spannungswert' überhaupt ausrechnest.

Letzten Endes gibst du einfach nur den ADC Wert, so wie du ihn vom ADC 
bekommst, an das LCD aus. Du fügst zwar noch ein Komma ein, aber 
logisch: Wenn du die Zahlenwerte 0 bis 1023 ausgibst, indem du nach der 
Hunderterstelle ein Komma einfügst, dann stehen auf deinem LCD 
Zahlenwerte von 0 bis 10,23. Das sind aber trotzdem noch keine Volt 
sondern nur die ADC Werte anders aufbereitet.

Der ADC liefert nicht direkt Volt!
Der liefert eine Zahl von 0 bis 1023, die den anliegenden Volt im 
Bereich 0 bis Referenzspannung entsprechen.

  0     ....    0V
  1023  ....    Referenzspannung

Den ADC Wert musst du selber, mit der Kenntnis der Höhe der 
Referenzspannung in tatsächliche Volt umrechnen.

von Wilfried H. (willi_2)


Lesenswert?

Hallo Karl Heinz,
die Umwandlung des Wandlerergebnisses und die Ausgabe erfolgt in der 
Interrupr-Service-Routine. Ist das etwas falsch?


Lord Ziu,
der m8 steckt auf einem Testbord. Es sollte eigentlich alles vorhanden 
sein.
Die Ref-Spannung habe ich mit 100n gegen Masse geblockt.

Peter Z.,
da die Ref.-Spannung gleich der Versorgungsspannung ist kann sie doch 
eigentlich nicht falsch sein.

von Karl H. (kbuchegg)


Lesenswert?

Wilfried H. schrieb:
> Hallo Karl Heinz,
> die Umwandlung des Wandlerergebnisses und die Ausgabe erfolgt in der
> Interrupr-Service-Routine. Ist das etwas falsch?

Grundsätzlich nicht (*)
Aber deine Anzeige zeigt dir nicht die Spannung in Volt an, sondern die 
Spannung in ADC Einheiten. So hast du das programmiert.

Und die sind nun mal
    0   bei 0 Volt am ADC Eingang
 1023   wenn die Eingangsspannung der Referenzspannung entspricht

Wenn du auf der Anzeige Volt haben willst, dann musst du dir die auch 
ausrechnen. Vom ADC kriegst du die nicht direkt.

Wenn deine Eingangsspannung der Hälfte der Referenzspannung entspricht, 
dann liefert der ADC zb 512. Das sind jetzt aber nicht 5.12 Volt, 
sondern einfach nur die Hälfte der Referenzspannung (weil 512 die Hälfte 
von 1024 ist). Die war bei dir 5V, also ist die Hälfte davon 2.5 Volt.
Da du das aber nicht ausrechnest, steht bei dir am Display 5,12 (wegen 
der 512) und nicht 2.5V (weil du die gar nicht ausgerechnet hast)

Wenn du dir leichter tust, dann stell dir einfach vor, der ADC liefert 
dir eine Art 'Prozentzahl': Wie gross, ausgedrückt in 'Prozent' ist die 
Eingangsspannung im Vergleich zur Referenzspannung?
Nur geht der Wertebereich nicht wie bei Prozent von 0 bis 100, sondern 
von 0 bis 1023.

(*) Na ja. Eigentlich schon.
Aber das ist jetzt erst mal nicht dein Problem.

von Wilfried H. (willi_2)


Lesenswert?

Karl Heinz,
danke. Jetzt wo Du es sagst fällt es mir auch auf. Ich hab zwar noch 
keinen Plan wie ich das realisiere. Aber ich muss nun erst mal darüber 
nachdenken.
Oder hast Du da vielleicht noch einen Tipp für mich.

von Karl H. (kbuchegg)


Lesenswert?

Wilfried H. schrieb:
> Karl Heinz,
> danke. Jetzt wo Du es sagst fällt es mir auch auf. Ich hab zwar noch
> keinen Plan wie ich das realisiere. Aber ich muss nun erst mal darüber
> nachdenken.
> Oder hast Du da vielleicht noch einen Tipp für mich.

Ja: Dreisatz

1024 Äpfel kosten 5 Euro.
Wieviel kosten 478 Äpfel?


      1024  ......     5
       478  ......     x
     ---------------------
             478 * 5
       x = ----------- = 2.33 Euro
               1024

Die 478 kriegst du vom ADC :-)

Wenn du 2 Nachkommastellen haben willst, solltest du annehmen, dass 1024 
Äpfel 500 Euro kosten. Denn dann kosten die 478 Äpfel 233 Euro. Und da 
du bei der Ausgabe das Komma richtig einschmuggelst, steht dann auf 
deiner Anzeige 2,33

(Aufpassen, dass du dir während der Berechnung keinen Overflow 
einhandelst. Eine uint16_t Berechnung läuft über, sobald irgendein 
Zwischenergebnis größer als 65535 wird [oder werden kann])

von Wilfried H. (willi_2)


Lesenswert?

Man Karl Heinz,
da hätte ich auch selbst drauf kommen müssen, oder ? :-))
Danke für Erste Karl Heinz. Ich arbeite das erst mal ein und teste es 
aus.
Sollte es dann immer noch nicht klappen, darf ich mich sicher nochmal 
melden?

Gruß Wilfried

von Wilfried H. (willi_2)


Lesenswert?

Ach so, siehst Du sonst noch irgend wo einen bug?

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.