Forum: Mikrocontroller und Digitale Elektronik LCD-Anzeige umechnen


von Helmut Hofmann (Gast)


Lesenswert?

Hallo,
ich habe mal eine Frage an die Spezialisten:
mir gelingt es,bei einem 4433 über den internen AD-Wandler einen 
Spannung von 0-5 Volt in eine 10bit-Binärzahl umzuwandeln und auf einem 
LCD-Display als Dezimalzahl von 0-1023 auszugeben.
Ich möchte aber eine Volt-Anzeige von 0,00 Volt bis 5,00 Volt 
realisieren.
Wie kann ich das genau umrechnen?? (Ungenau wäre einfach eine Division 
durch 2.  Entspricht dann bei 1023 einer Anzeige von 5,12 Volt)
Oder geht das auch mit Tabellen wie beim C-Control??

von Lothar (Gast)


Angehängte Dateien:

Lesenswert?

Der erste Schritt ist es, die Binärzahl in eine Kette von BCD-Zeichen zu 
wandeln. Dies gelingt durch eine simple Division der Binärzahl durch 10 
in einer Schleife, bis die Binärzahl=0. Das Ergebniss einer solchen 
Division "16div8", also 16 Bit durch 8 Bit, liefert ein Ergebnis und 
eine Rest. Der Rest stellt die BCD-Ziffer dar. Im ersten Schritt liefert 
die Division die Einerstelle des Dezimaläquivalents im BCD-Format. 
Diesen speichert man im S-Ram, Stack oder übergibt ihn der 
Ausgaberoutine. Im folgenden wird in der Schleife mit dem übergebenen 
Ergebnis weiter gerechnet. 10er, 100er, Stelle etc. bis als Ergebnis 
Null übergeben.

In der Ausgaberoutine addiert man auf diese BCD-Stelle einfach 31 
dezimal und erhält den ASCII-Code des Zahlenwerts der Dezimalstelle. 
Dieser kann dann auf's Display gebraten werden.

Wer interesse hat, ich arbeite gerade an einer Reihe von erklärten 
Standardroutinen wie "XdivY" "XmulY", "BIN2BCD", "BCD2ASC" etc. als 
Standard-Programmbibliothek. Braucht man halt immer. Siehe Anhang als 
Beispiel.
PSE Info bei Interesse.

von Lothar (Gast)


Angehängte Dateien:

Lesenswert?

Teil 2 der Antwort:
Theoretisch müsste man des Wert des AD-Wandler in deinem Fall vor der 
Ausgabe mit 0,0048828125 mal nehmen. Das läuft natürlich auf eine 
Berechnung mit realen Zahlen heraus. Machbar (Darstellung 
Mantisse,Exponent) aber auch für µP recht aufwendig.

Über Look-Up Tabelle im Programmspeicher (lpm) gings auch. 2 Byte pro 
Wert möglicher Wert des AD-Wandler = 2048 Byte, also 2k. Ich gehe hier 
von einer interpretierten Ganzzahldarstellung aus. 500 wäre da 5,00V, 
312 3,12V und so. Das ginge vielleicht noch ins Flash.

Aber was, wenn Du mal den Messbereich über Schalter und Vorwiderstand 
auf 12V erweitern möchtest?

Warum nicht die Spannungsschritte mit einer Zehnerpotenz (10, 100, 1000, 
.. ) malnehmen, damit ganzzahlmäßig rechnen, das Ergebnis in ASCII 
konvertieren, interpretieren wo das Komma hin muss und ausgeben. In 
deinem Fall wäre der Faktor 10000. Der Wandlerwert mal 49 ist 
hinreichend genau. Die ersten zwei Wandlerergebnisse schmeist du weg. 
Merkst dir ggf. eine Rundung wenn >= ,0050. Dann gibst Du zwei stellen 
aus (rechts nach links), ein Komma, dann den Rest ?

Auch das ist eine Form der interpretierten Ganzzahldarstellung. Wie man 
das umsetzt um nicht jedesmal das Rad neu erfinden zu müssen? Eine Reihe 
von Standardroutinen wie im ersten Teil meiner Antwort angedeutet.

von Lothar (Gast)


Lesenswert?

Sorry,

die .PDF scheinen nicht rüber gekommen zu sein.
Will have a look.

von Phagsae (Gast)


Lesenswert?

Hmmmm..... viel verwirrung wo keine sein müsste .-)


So wie ich das kenn erreicht der ADC seinen max Wert 1023 = 10bit
wenn am Input genau  Vref anliegt

ergo Vref auf 5,12 Volt dann ein kleiner links shift
und Anzeigen

Das man da ein bit verliert stört bei 2LSB genauigkeit nu wirklich nicht

Umess=(CONV/RES)*Vref

Phagsae

von Lothar (Gast)


Angehängte Dateien:

Lesenswert?

Sorry,
nur Test ob Anhang rüber kommt.

von Jonas Diemer (Gast)


Lesenswert?

Achtung!

Vref darf nicht größer asl AVcc sein. AVcc widerum darf nicht größer als 
Vcc+0.3V sein. hast also nochmal glück. AVcc=Vref=5,15V sollte klappen. 
dann musste den werd nur noch /2. Oder mal 5/10 (d.h. mal 5 und dann das 
komma verschieben. geht bestimmt besser, wenn der AVR keine division 
unterstützt)

von Helmut Hofmann (Gast)


Lesenswert?

test.doc ist rübergekommen, ist jedoch nicht lesbar

Helmut

von Ingo Busker (Gast)


Lesenswert?

Hi,

wie wäre es mit einfachem Dreisatz?

AdWert  500              AdWert  25
------------------  = (ca.) ----------------
1024                                   51

Ich weiss, man kann es sicherlich genauer machen, aber:
Kann man mit seinem Aufbau auf einem Millivolt genau messen?
Meisst befinden sich noch irgendwelche Hardwarefilter im Meßzweig und 
einen ungefilterten (Software) Wert sollte man ohnehin nicht 
verarbeiten.

Wenn es genauer sein soll, kann man ja für die Berechnung auf (long) 
casten, dann kann man auch mit 1023 anstatt mit 1024 rechnen...

Bis dann,
Ingo!

von Jonas Diemer (Gast)


Lesenswert?

na das ist doch wurscht!
multiplikation sollte einfacher sein als dreisatz (zumal das dasselbe 
ist, wenn man's umstellt).

von Heli (Gast)


Lesenswert?

Vielen Dank für den Tip, geht prima mit der Feinabstimmung der 
Spannungsmessung durch Veränderung von Aref.
Ich stimme die Versorgungsspannung ab und verbinde Aref und AVCC mit 
VCC.

Frage: wie kann ich die Meßwerte stabilisieren, pendeln immer um ca 20mV 
hin und her (z.B von 00,69 V bis 00,71V)?

mfg Helmut

von Jonas Diemer (Gast)


Lesenswert?

dazu steht was im datenblatt der avrs... es gibt z.B. die möglichkeit, 
den avr während der messung in den sleep mode zu schalten, dann stört 
der die messung nicht...

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.