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
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. ...
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
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
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). ...
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.