mikrocontroller.net

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


Autor: TomTom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TomTom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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).

...

Autor: Andreas Kassner (andi_k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Kassner (andi_k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes...

MfG
Andi

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kenne ich doch irgendwoher....????....  ;-)

Grüß dich, Andi...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.