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
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.
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.
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.
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.
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])
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