PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD-Wandler beim Mega8 + Ausgabe über LCD



Bierbauch
08.01.2005, 13:43
Hallo zusammen,

Ich hab folgendes Problem:
Ich will eine Spannung vom einem 12V-Beiakku (aber nicht im Auto) einlesen und möchte die auf einem LCD mit einer Nachkommastelle wiedergeben.
Dazu hab ich zuerst einen Spannungsteiler per Spindeltrimmer aufgebaut und auf 4:1 eingestellt (20V entsprechen dann beim 10-Bit-AD-Wandler 1023).
Leider bekomm ich es einfach nicht gebacken, wie den AD-Wandler "geeicht" bekomme, so dass 12V auch wirklich als 12V interpretiert werden, und dass die "Skala" dann auch linear ist.

Was muss ich hardware-mäßig anstellen, damit ich eine vernünftige Grundlage habe, und wie muss der Code aussehen dazu?

Seither hab ich einfach den Wert den der AD-Wandler ausgibt durch 51,2 geteilt, damit ich auf eine Volt-Skala komme. Aber ganz das richtige ist das leider nicht...

Danke schonmal für eure Hilfe, ich freu mich schon auf die Antworten meines ersten Beitrages O:)

tobimc
08.01.2005, 14:18
HI

Du musst die VREF deines ADCs (Ich nehme mal an 5,0V) durch 1024 teilen.

Das ergibt 0.0048828125.

Jetzt musst du deinen ADC-Wert mit 0.0048828125 malnehmen.
(Achte darauf, dass deine Vref hochgenau ist, denn sonst bekommst du immer ungenaue Werte...)

So genau braucht das aber kein Mensch, wenn er nue eine Nachkommastelle braucht.
Nimm also mit 0.005 mal.

Ganz liebe Grüße, Tobi

Michael
08.01.2005, 14:54
Hallo tobimc,
kleiner Denkfehler? Er will ja 12 Volt messen und nicht 5 Volt...
@Biebauch:
Deine Rechnung ist richtig, so wird es i.A. gemacht. Woran liegt es denn jetzt genau?
Gruß, Michael

Bierbauch
08.01.2005, 15:44
Hallo,


Achte darauf, dass deine Vref hochgenau ist, denn sonst...

Leider hab ich nur den 7805 anzubieten, genaueres hab ich nicht da und weiß auch net ob das wirklich nötig ist. Der 7805 bringt (mit 20€-Multimeter gemessene) 5,05V.

Das hab ich mal in die Formel miteinfließen lassen, also anstatt 1024/20V hab ich jetzt 20,12 (weil ich ja 5,05 statt 5,00V referenz habe), dann komm ich auf 50,8946 statt 51,2

Problem ist jetzt die Liniarität: Bei angelegten 10V hab ich 10,70 aufm Display, und bei angelegten 15V hab ich aber 16,32V aufm LCD :-/

Soll ich da jetzt ein Korrektufaktor reinbasteln, ähnlich wie wenn man eine Gerade im Koordinatensystem verschiebt?

Alternativ wäre auch ein SELECT CASE, und die werte zwischen grob 9 und 16V die ein Bleiakku in der Realität haben kann liste ich eben auf. Aber "cooler" wäre eben eine gerechnete Variante. Zumal ich ein Ergebnis mit einer Nachkommastelle brauche...

thx

RCO
08.01.2005, 15:52
Also Korrektur hört sich ganz gut an, die kann ja schon nötig sein, weil der Widerstandsteiler nicht sehr geanu ist. Allerdings scheinen deine Messwerte nicht ganz Linear zu sein. Kannst ja mal ein ADCspannungswert-"REAL"-Spannungs-Diagramm aufstellen um zu sehen ob die Abweichung linear ist.

MFG Moritz

bhm
08.01.2005, 16:56
Also, korrekt wäre:

U = ADC * Uref / 1023 * 4/1
^ Spannungsteiler
Wenn das für einen hohen Wert von U kalibriert wird (zB durch Feineinstellung des Spindeltrimmers), sehe ich nicht wo das nicht-linear werden könnte. Die Bit-Auflösung liegt bei 0.02V, das kann es auch nicht sein, +- 0.1V sollte damit auf jeden Fall möglich sein.
Geht die Spannung direkt vom Akku auf den Trimmer, oder liegen da noch Elemente (zB Diode?) dazwischen?
ciao .. bernd

Bierbauch
08.01.2005, 17:18
Hallo bhm,

Das war der entscheidende Tipp!
Ich hab bei 18V den Trimmer kalibriert, so dass ich auch 18V angezeigt bekomme. Wenn ich jetzt runterdrehe (hängt gerade am Netzteil), dann bekomme ich einen realistischen Spannungswert, Abweichungen über den interessanten Spannungsbereich (9...16V) sind max. 3/100!!! :)

Jetzt muss ich nur noch hinbekommen, dass der Wert immer genau auf eine Nachkommastelle genau ist, alternativ 4stellig (3 Ziffern + ein Komma, also z.b. 13,2).

Eine Diode ist bislang nicht dazwischen, ich will aber nach Möglichkeit eine einbauen (soll im Akkubetrieb keinen Standbystrom ziehen, deshalb etwas umständliche Schaltung). Ich müsste dann nur die 0,7V einer Si-Diode auf den Messwert wieder zuaddieren, dann sollte es doch in ordnung sein oder?

thx
Peter

harryup
08.01.2005, 21:27
hi,
prinzipiell ja, blöd ist nur dass die durchbruchspannungen bei dioden ganz gruslig von der temperatur abhängig sind. eine diode in einem messkreis ist, wenn der spannungsabfall eine rolle spielt, immer fehlerquelle nr.1
gruss, harry

Bierbauch
09.01.2005, 12:00
Hi,

Hat jemand noch einen Tipp, wie ich den Wert auf 4 stellen (3 ziffern + Komma) oder alternativ eine Nachkommastelle umformen kann?

bei einer String-Variablen kann man ja die Anzahl de Zeichen begrenzen, aber geht das auch vernünftig mit Zahlen!?

Danke schonmal,

harryup
09.01.2005, 13:58
hi,
wenn du eine routine meinst, mit der man zahlen in ein anzeige mit nachkommastellen bringen kann, versuch's mal so:

' *** ausgabe des druckes mit einer nachkommastelle ----------------------
Level = 65

'Az = Fusing(level , "##.#") + " bar" ' Ausgabe mit 1 Nachkommastelle
' verbraucht mehr platz im flash!

Az = Format(str(level) , "0.0") + " bar" ' Ausgabe mit 1 Nachkommastelle
' geht genauso, ist sparsamer und schneller'
' *** -------------------------------------------------------------------------------

gruss, harry

bhm
09.01.2005, 23:54
Hat jemand noch einen Tipp, wie ich den Wert auf 4 stellen (3 ziffern + Komma) oder alternativ eine Nachkommastelle umformen kann?
ich welcher Programmiersprache eigentlich ?

Bierbauch
10.01.2005, 09:45
Hi,

das hier ist doch das "Basic-Programmierung mit Bascom"-Forum oder? ;-)
Ich hab das Beispiel von Harryup schon probiert, ganz funktioniert hats aber noch nicht.. mal sehn...

harryup
10.01.2005, 14:14
ooohps,
ich hab vergessen die az variable als string zu deklarieren, sorry.
das oben war nur ein auszug aus einem prog.
also muss irgendwo am programmanfang stehen:
dim az as string *8 (oder wie lang du den string eben brauchst)
dim level as byte (oder auch word, kommt auf deine werte an)
gruss, harry
p.s. das ist schon das bascom forum

bhm
10.01.2005, 14:46
das hier ist doch das "Basic-Programmierung mit Bascom"-Forum oder? ;-)

:oops: 'tschuldigung, hab den Betreff nicht gelesen, peinlich!

Bierbauch
10.01.2005, 16:53
Hi Harry,
ich bekomm das einfach nicht gebacken:
Der betreffende Code ist:

Dim U1 As Word 'Wert vom AD-Wandler
Dim U2 As Word 'AD-Wander/51,2 = Volt
Dim U3 As String * 4 'Spannung auf eine Nachkommastelle

...

U1 = Getadc(0) 'AD-Wandler0 auswerten
U2 = U1 / 51.2 'Spannung in Volt
U3 = Format(str(u2) "0.0")

Dann bekomm ich aufm LCD nur z.B. "1.6" angezeigt, bei 16V am Eingang.
Was muss ich ändern, damit ich da auf z.B. "13.5" komme (das V für Volt kann ich ja im LCD-Befehl dranhängen)???
arg irgendwie steh ich aufm Schlauch, ich hab bisschen rumgetüftelt komm aber auf nix richtiges irgendwie :-/

harryup
10.01.2005, 21:22
hi bierbauch,

das ist ja ok so, der format befehl macht ja nix anderes als das komma reinpacken. du musst aber das format mit "00,0" angeben, sonst wird alles auf eine vorkommastelle abgesägt.
geb doch mal deine U1 auf's display, die müsste ja 819 betragen.
wenn das so ist und du teilst durch 51,2 kriegst du 15,99, also 16 wegen rundung. wenn das display jetzt 16,0 anzeigen soll müsstest du die 16 mit 10 malnehmen, weil dein format alles wieder um 'ne 10er potenz verschiebt. das wär aber nicht sehr elegant, weil dabei genauigkeit verloren geht. besser so:

U1 = getadc(0) ' ergebnis 819
U2 = U1/5,12 ' gleich die 10er verschiebung berücksichtigen, gibt 159,9
U3 = format(str(u2) "00,0") ' sollte jetzt 15,9 zeigen
so müsst's funzen, ich kann's im moment nur nicht probieren.
gruss, harry

Octi
12.01.2005, 11:02
Hallo
@Bierbauch
könntest du bitte mal den ganzen programmcode einstellen, oder mir den per mail/ pn zukommen lassen,
würde mir nämlich gerne auch sowas basteln, nur habe ich im moment keine ahnung wie der programmcode dafür aussehen soll
danke
octi

Bierbauch
12.01.2005, 17:15
Hallo zusammen!

Es hat geklappt, Danke schön Harry!
Wenn ich nur durch 5,12 teile gehts, perfekt!

Danke auch an alle anderen die mich unterstützt haben bei meinem ersten Thread.
@Octi: ich mail dir bei gelegenheit den kompletten Quelltext (muss den erst via Diskette vom anderen Rechner holen, der nicht am Netzwerk hängt).

Bierbauch
12.01.2005, 18:03
Hallo zusammen!

Es hat geklappt, Danke schön Harry!
Wenn ich nur durch 5,12 teile gehts, perfekt!

Danke auch an alle anderen die mich unterstützt haben bei meinem ersten Thread.
@Octi: ich mail dir bei gelegenheit den kompletten Quelltext (muss den erst via Diskette vom anderen Rechner holen, der nicht am Netzwerk hängt).

Octi
14.01.2005, 06:49
Hallo

ja Danke Bierbauch, ich warte auf dein Listing.
Möchte doch auch mal Volts auf den LCD haben.
Danke nochmal
octi

14.01.2005, 14:30
U2 ist doch word und damit ganzzahlig. wieso kann ich dann durch einen Real wert (51.2) teilen und bekomme dann einen String ?

harryup
14.01.2005, 16:11
hi,
richtig, u2 ist ganzzahlig, dennoch kannst du's durch einen real teilen, das ergebnis ist erstmal wieder ein (gerundeter) ganzzahlenwert. der string wird durch die funktion str(ganzzahl) gebildet, die funktion (format) formatiert den string nur nach dem vorgegebenen muster "0,0".
die anweisungen format(str(u2),"0,0") sind nur ineinanderverschachtelt, also mehrere funktionen in einer anweisungszeile, streng übersetzt heist das dann:
SCHREIBE in u3 den FORMATIERTEN wert des STRING von u2 nach dem MUSTER "0,0"
gruss, harry

15.01.2005, 10:27
Hallo zusammen!
Interessiert verfolge ich dieses Thema und habe nun selbst versucht, einen Wert "Speed" aufzulösen und 3-stellig darzustellen. Sinn und zweck ist es, auf einem 4-zeilen Display "große Zahlen" für die Darstellung von "Speed" zu verwenden.

Nun gibt es für "BIGLCD" einen Sub, der mir die notwendigen Sonderzeichen für die großen Zahlen bereit stellt.

Will ich nun BIGLCD : Speed verwenden, wird mir immer nur die erste Stelle von Speed angezeigt. Also dachte ich mir, zerlege ich wie o.g. den Wert Speed und lasse mit jede einzelne Stelle anzeigen. Leider kommt gar nichts auf dem Display!?! Kann mir da jemand weiterhelfen?

Für Eure Hilfe wäre ich wirklich sehr dankbar! :-)

Stefan



Dim Speed As Word
...
Declare Sub Lcdbig ' Funktion zum Schreiben der großen Zahlen deklarieren
Dim Lcdbigspalte As Byte , Lcdbigzahl As Byte
...
...
Lcdbigspalte = 12 : Lcdbigzahl = Speed : Lcdbig
...
...
'################
Sub Lcdbig
' Zeile 1
Locate 1 , Lcdbigspalte
Select Case Lcdbigzahl
Case 0 : Lcd Chr(0) ; Chr(1) ; Chr(2)
Case 1 : Lcd Chr(0) ; Chr(1) ; Chr(32)
Case 2 : Lcd Chr(0) ; Chr(1) ; Chr(2)
Case 3 : Lcd Chr(0) ; Chr(1) ; Chr(2)
Case 4 : Lcd Chr(1) ; Chr(32) ; Chr(32)
Case 5 : Lcd Chr(1) ; Chr(1) ; Chr(1)
Case 6 : Lcd Chr(0) ; Chr(1) ; Chr(2)
Case 7 : Lcd Chr(1) ; Chr(1) ; Chr(1)
Case 8 : Lcd Chr(0) ; Chr(1) ; Chr(2)
Case 9 : Lcd Chr(0) ; Chr(1) ; Chr(2)
End Select

' Zeile 2
Locate 2 , Lcdbigspalte
Select Case Lcdbigzahl
Case 0 : Lcd Chr(31) ; Chr(32) ; Chr(31)
Case 1 : Lcd Chr(32) ; Chr(31) ; Chr(32)
Case 2 : Lcd Chr(0) ; Chr(1) ; Chr(3)
Case 3 : Lcd Chr(32) ; Chr(0) ; Chr(3)
Case 4 : Lcd Chr(31) ; Chr(1) ; Chr(31)
Case 5 : Lcd Chr(31) ; Chr(1) ; Chr(2)
Case 6 : Lcd Chr(31) ; Chr(1) ; Chr(2)
Case 7 : Lcd Chr(32) ; Chr(0) ; Chr(3)
Case 8 : Lcd Chr(31) ; Chr(1) ; Chr(31)
Case 9 : Lcd Chr(31) ; Chr(1) ; Chr(31)
End Select

...usw...

tubefreak
18.01.2005, 16:42
Hallo,

ich bin auf dem Gebiet zwar auch eher ein Newbie, habe aber bei meinem Röhrenamp (Messung der Ströme von 0-500mA/0-500V) keine zusätzlichen (internen) Teiler eingebaut, sondern einfach eine externe Referenz in Form eines LM336 (exakt einstellbar von 4-6V). Durch den internen Teiler von 1024 habe ich dann bei eingestellten 5,10-5,11V EXAKT die richtige (und zu erwartende) Spannung/Strom.

Dazu einfach im ADMUX-Register die 2 Bits REFS0 und 1 auf 0 setzen (AREF off, er nimmt dann weder die interne v. 2,56V noch AVCC), den Ausgang des LM336 am AREF-Pin anschliessen und anschl. genau abgleichen (Spindeltrimmer). Den Kondensator zwischen AREF und GND ruhig belassen, ist immer besser.

Gruß
Dirk

www.tubefreak.de