PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannung messen - Probleme mit der Berechnung



TomEdl
05.01.2009, 23:08
Hallo!

Für mein Projekt will ich die Versorgungspannung messen und diese anschließend auf einem LCD-Display ausgeben. Der A/D-Eingang ist über einen Spannungsteiler, bestehend aus 10k und 4k7 an der Versorgungsspannung angeschlossen. Zusätzlich wird er durch eine Zenerdiode Zd=5V1 vor Überspannung geschützt.

0V entsprechen nun dem Wert 0
6V entsprechen nun dem Wert 512
12V entsprechen nun dem Wert 1023

Eine einfache Methode zum Umrechnen des Wertes vom A/D-Wandler ist meiner Meinung nach folgende:


Dim x as Word
Dim Spg as Word

x = Getadc(0)
Spg = x*12
Spg = Spg/1023


Bekomme ich bei dieser Methode nur Ganzzahlen heraus (z.B. 7V)?
Falls nicht, wie wandle ich diese in einen String um, so dass ich am LCD zum Beispiel 7,07V lesen kann?

Wie ihr seht habe ich mich mit dieser Problematik nicht befasst und bin jetzt auf eure Hilfe angewiesen.

Mit freundlichen Grüßen
Thomas

TomEdl
05.01.2009, 23:14
Habe einen Teil der Antwort schon gefunden.
Die Variable Spg muss als Single definiert werden, dann sind mit ihr auch Operationen mit Dezimalzahlen á la 5,12 möglich.

Nur die Umwandlung in einen String zur Ausgabe am LCD ist mir noch nicht ganz klar.

MfG
Thomas

stromflo
06.01.2009, 00:45
Hallo Thomas,


Nur die Umwandlung in einen String zur Ausgabe am LCD ist mir noch nicht ganz klar.


Du musst das ganze nicht zwingend in einen String umwandeln. Wenn du das ganze auf dem Display ausgeben möchtest könnte das wie folgt aussehen:



Locate 1,1
Lcd Spg;V


Gruß Flo

TomEdl
06.01.2009, 12:25
Hallo Flo!

Danke für deine Antwort!

Wenn allerdings für Spg einmal 8,497 und einmal 12 rauskommt, hätte ich am Display zuerst 8,497V und anschließend 12V97 stehen, oder?

Wieviele Nachkommastellen sind eigentlich möglich, bzw., wieviele benutzt der µC? Ist das definierbar?

MfG
Thomas

MeckPommER
06.01.2009, 13:41
Bei deinem Spannungsteiler dürfte erst bei 15.4V eine 1023 beim getadc(0) herauskommen, wenn du ihn mit 10k und 4.7k aufgebaut hast.

Schau dir mal die Funktion Fusing() an, die dürfte für dich hilfreich sein. Mit dieser wandelst du ein Single in einen String mit definierten Nachkommastellen um.

Wenn du dann auch noch möchtest, das dein String, den du zum LCD sendest, stets die selbe Länge hat, damit der Wert mit seinen Stellen immer am gleichen Platz erscheint, bietet sich an, den Ergebnisstring vorne mit Leerzeichen zu ergänzen und dann nur rechts die gewünschte Anzahl an Stellen zu nehmen.

Erg = Fusing(Singlewert,"#.##")
Erg = "... einige Leerzeichen ..." + Erg
Erg = Right(Erg,5)

Gruß MeckPommER

Besserwessi
06.01.2009, 13:54
Die Auflösung und damit die Zahl der Sinnvollen stellen gibt der AD vor. Beim AVR sind das 10 Bit. Bei 15 V als Messumfang kann man damit 15V/1024 also etwa 0,015 V auflösen. Damit ist schon die 2te Stelle hinter dem Komma nicht voll aufgelöst. Ein wenig mehr kann man noch gewinnen, wenn man den AD wandler mehr als 1 mal ausließt und z.B 8 Werte addiert. Mehr als 2 Stellen hinter dem Komma machen aber wenig Sinn.

Die Umrechnung kann man dann mit einer Multiplikation machen. Den Faktor müßte man sich als Konstante definieren oder mit dem Taschenrechner vorher ausrechenen. Also mehr so:

sumadc = sumadc + getadc(0) -> (z.B. 8 mal als schleife )
Spg = sumadc * 0.0023456

TomEdl
06.01.2009, 14:47
Danke für eure Antworten! :)

Ich hab jetzt mal in die BASCOM-Hilfe geschaut und bin um einiges reicher an Wissen geworden.

Herausgekommen ist dabei dieser Code:


Dim Adc_wert as Word
Dim Spg as Single
Dim Spg_ausgabe as String * 4
Const Adc_faktor = 0.01171875

Do

Adc_wert = Getadc(0)
Spg = Adc_faktor * Adc_wert

Spg_ausgabe = Str(Spg)
Spg_ausgabe = Fusing(Spg , "##.##")

Locate 1 , 1
Lcd Spg_ausgabe , "V"

Loop

End


Würde das so funktionieren? Laut meinen Überlegungen müsste ich am Display dann einen Zahlenwert von z.B. 08.12V stehen haben, oder?

MfG
Thomas

MSN
06.01.2009, 15:03
obs funktioniert kann ich dir nich sagen aber diese zeile :"Spg_ausgabe = Str(Spg)" ist vollkommen überflüssig.

MeckPommER
06.01.2009, 15:22
dein string ist auf jeden fall zu kurz ... "10.00" -> 5 zeichen und wenn du deinen spannungsteiler oder deinen umrechnungsfaktor nicht änderst, zeigt er dir brav 12 Volt an, wenn 15.4 anliegen, bzw. 9.35V, wenn 12V anliegen.

vorsichthalber würde ich auch die typenkonvertierung (word->single) in einer extra-zeile machen und nicht mit anderen berechnungen zusammen. ist weniger fehleranfällig, sauberer und besser sichtbar.

TomEdl
06.01.2009, 16:11
obs funktioniert kann ich dir nich sagen aber diese zeile :"Spg_ausgabe = Str(Spg)" ist vollkommen überflüssig.
Okay, dann lass ich sie weg.


dein string ist auf jeden fall zu kurz ... "10.00" -> 5 zeichen und wenn du deinen spannungsteiler oder deinen umrechnungsfaktor nicht änderst, zeigt er dir brav 12 Volt an, wenn 15.4 anliegen, bzw. 9.35V, wenn 12V anliegen.
Der Umrechnungsfaktor ist in dem Fall nur ein Zufallswert, da ich die genaue zu messende Spannung (noch) nicht kenne. Der Spannungsteiler wird dann ebenfalls noch angepasst.

MfG
Thomas

niki1
06.01.2009, 16:59
Hallo.

Ich wollte nur kurz mal Fragen .
Gehört hier nicht ein Cls ?
Weil ja der vorherige Spg. Wert ja immer überschrieben wird und irgendwann wird mal der Stack von dem Ding voll oder ?

mfg niki1

TomEdl
06.01.2009, 17:22
Hallo niki1!

Bis jetzt habe ich nicht die Erfahrung gemacht, dass das Ding voll wird. Es werden einfach die neuen Stellen überschrieben, das hat den Vorteil das die Anzeige nicht flimmert. Aber ich kann mich natürlich auch täuschen...

;)

MfG
Thomas

MeckPommER
06.01.2009, 19:15
Da läuft kein Stack über. Die Anzeige wird einfach überschrieben. Von daher gibts keine Probleme. Und das mit dem Flimmern ist richtig. Erst löschen und dann schreiben flimmert halt, je nach Timing ein wenig.

TomEdl
06.01.2009, 19:28
Da läuft kein Stack über. Die Anzeige wird einfach überschrieben. Von daher gibts keine Probleme. Und das mit dem Flimmern ist richtig. Erst löschen und dann schreiben flimmert halt, je nach Timing ein wenig.
Sag ich doch! ;) ;) :D

LG
Thomas

niki1
06.01.2009, 20:51
Sorry.
War nur ein Gedanke der mich gequält hat.

Schönen Abend noch .