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??
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.
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.
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
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)
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!
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
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...