Forum: Mikrocontroller und Digitale Elektronik AD-Wandler - Fließkomma-Umwandlung


von TomTom (Gast)


Lesenswert?

Hallo,

Momentan komme ich mit meinem AD-Wandler (mega16) nicht so ganz
weiter.

Die Aufgabe:

10-Bit-Signal mit den Zahlen von hex 000 bis hex 03FF (1023)
Diese Zahlen möchte ich umrechnen in eine Fließkommazahl zwischen 0,00V
bis 5,00V.

Mein Idee zur Umwandlung

Signal multiplizieren mit 10. Ergebnis solange -2048 rechnen bis
Überlauf erfolgt. Den Rest wieder mit 10 multiplizieren und erneut 2048
abziehen bis ein Überlauf erfolgt. Das ganze dann noch einmal und schon
habe ich meine drei Zahlen die ich nur mit einem Komma trennen muss und
aufs LCD ausgeben kann.


Beispiel :

Es liegt an hex  3E8 (1000)

1000x10 = 10000
Es kann 4 mal 2048 abgezogen werden, rest 1808
1808x10 = 18080
Es kann 8 mal 2048 abgezogen werden, rest 1696
1696x10 = 16960
Es kann 8 mal 2048 abgezogen werden

Ergebniss 4.88V


Nur ich frage mich gerade ob und wie ich das ganze Umsetzten kann

Vielleicht hat ja einer mal nen Beispiel Quelltext für mich (Assembler)
oder kann mir einen Rat geben wie ich die ganze Sache einfacher und
sinnvoller angehen kann falls es so nicht geht.


Danke

von Hannes L. (hannes)


Lesenswert?

Hatten wir vor einigen Wochen (Monaten?) erst, versuche es mal mit der
Suchfunktion.

Mit Fließkomma würde ich das aber nicht machen.
Versuche lieber, die Zahlenwerte auf das Tausendfache des Ausgabewertes
zu berechnen und bei der Ausgabe nach den Tausendern ein Komma
auszugeben. Das benötigt bedeutend weniger Systemressourcen und geht
daher viel schneller.

Multipliziere den ADC-Wert mit einer Konstante, so dass aus 1023 50000
wird. 50000/1023=48,8 also etwa 49. Die Konstante wäre demnach 49.
Dies ist erstmal eine Näherung, ist aber genauer als die
Messgenauigkeit des ADC.

Ferner solltest du zur Unterdrückung der Störungen eine
Mittelwertbildung des Messwertes vornehmen.

Falls die Daten an ein LCD ausgegeben werden sollen, dann reichen 1...4
Ausgaben pro Sekunde völlig aus. Es muss ja auch noch Zeit zum
(menschlichen) Lesen bleiben.

...

von Thomas (Gast)


Lesenswert?

Wenn es ohne Offset und Gain Korrektur und genau bei den Zahlen gehen
soll, dann schieb deinen AD Wert um eine Stelle nach rechts und gibs
dezimal aus.
In deinem Bespiel kannst du auch gleich 100 abziegen bis der Rest <100
ist, dann 10 abziehen bis <10 und der Rest.
Aber soviel bringt das auch nicht gegenüber einer "richtigen"
Division, die beim selberbasteln gleich den Modulorest mit ausgeben
könnte.
Aber warum eigentlich das Rad neu erfinden ?
Ich denke, daß eine "normale" Fließkommazahlenberechnung völlig
ausreicht, oder hast du ein Platzproblem im Controller ? Wenn´s auf ein
LCD rausgeschrieben wird, ist ja eh genug Zeit; es muß ja jemand noch
lesen können.
Wie wäre es dann mit C-Compiler ?
Dein ADC wird so genau wahrscheinlich nicht sein, sodaß du noch Offset
und Gainkorrektur brauchen kannst.

Gruß THomas

von TomTom (Gast)


Lesenswert?

Erstmal danke für eure Hilfe

@Hannes

Also heißt das :

Ich multiplitziere meine 8-Bit Konstante mit dem 16-Bit AD-Wert und
bekomme als Ergebniss eine 16-Bit Zahl.

Nun muss ich noch ein Komma nach der Tausenderstelle ausgeben.
Also brauch ich dann einen 10.000er, 1.000er, 100er und 10er
Dezimalteilert und ein Komma damit ich dann folgendes Ergebniss als
Besipiel bekomme:

R5  R4  R3  R2  R1

5    .  0   0   0

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Im Prinzip ja...

Aber ich lege das Ergebnis nicht (oder selten) in Register, sondern
gebe es gleich aus.

Schau dir mal den Anhang an, die darin enthaltene Routinen "print16"
und "print16s" könnten dein Problem lösen. - Oder dir zumindest
zeigen, wie man es machen kann (aber nicht unbedingt muss).

...

von Andreas K. (andi_k)


Lesenswert?

@TomTom,

Du kannst auch 64 mal den ADC-Wert auf eine 16 Bit-Variable aufaddieren
(Oversampling) und dann mit 5000 - auch 16 Bit - multiplizieren als 32
Bit Ergebnis.
Die beiden oberen Bytes aus dem  Ergebnis, Bit 16 bis 31, sind dann die
errechnete Spannung.
In einer der App-Notes bei www.atmel.com findest Du eine 16 x 16 Bit
Multiplikation unsigned.

MfG
Andi

von Andreas K. (andi_k)


Lesenswert?

Hallo Hannes...

MfG
Andi

von Hannes L. (hannes)


Lesenswert?

Das kenne ich doch irgendwoher....????....  ;-)

Grüß dich, Andi...

Bit- & Bytebruch...
...HanneS...

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.