ADC Umrechnug

Gast #401617
Lesenswert?
• ▲
▼
Hallo alle zusammen,

ich habe eigentlich ein sehr einfaches Problem.
Ich möchte den Spannungswert, der am AD-Eingang liegt, auf nem Display
anzeigen.

Dazu multipliziere ich den Digitalwert mit meiner Referenzspannung und
dividiere durch die Auflösung des AD-Wandlers.

Hier ein Beispiel:

unsigned long int i;
unsigned int k;

Messergebnis = readADC(4, 64) // Einlesen am Kanal 4 und Mittelwert aus
64 Messungen

k = Messergebnis*5/1024; //Vorkommastelle berechnen
i = (Messergebnis*5000/1024)%1000; //Nachkommastelle


Diese beiden Größen will ich auf dem Display ausgeben.
Bei der Vorkommastelle kei Problem, bei der Nachkommastelle kommt nur
Unsinn.
Hat jemand einen Tip für mich? Den Datentyp habe ich ja schon extra bei
i auf long int gesetzt??

Danke vorab
Gast #401618
Lesenswert?
• ▲
▼
Ist das Messergebnis auch long int? Wenn nicht, wird die Rechnung
wahrscheinlich nur mit 16 Bit ausgeführt, was um Überlauf führt.
Abhilfe: Eine der Konstanten als long kennzeichnen, z.B 5000UL.
#401620
Lesenswert?
• ▲
▼
Der Datentyp des Ergebnisses interessiert niemanden.
Entscheiden ist welche Datentypen an der Operation beteiligt
sind. Und das sind nun mal in allen Fällen int (oder unsigned int).
Daher wird die Rechnung selbst auch nur im Zahlenbereich int
(oder unsigned int) durchgeführt. Erst nachdem das Ergebnis
der Berechnung feststeht, wird das Ergebnis (der das was von
ihm übrig ist) nach long konvertiert.
Gast #401624
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bin jetzt nicht der Experte, aber ließe sich die Geschwindigkeit
der Berechnung nicht folgendermaßen erhöhen?

k = Messergebnis * 5 / 1024

Dieses lässt sich ja umformen zu:

k = (Messergebnis * 4 / 1024) + (Messergebnis / 1024)

Durch kürzen ergibt sich dann doch:

k = (Messergebnis / 256) + (Messergebnis / 1024)

Sowas lässt sich doch in C folgendermaßen realisieren:

k = (Messergebnis >> 8) + (Messergebnis >> 10)

Eine Addition und zwei Shift-Befehle sind doch in der Ausführung
deutlich schneller als eine Multiplikation und eine Division oder ist
in meiner Überlegung ein Denkfehler drin.
Gast #401627
Lesenswert?
• ▲
▼
i muss übrgens nicht long int sein, da der Wert nicht größer als 999
sein kann.

Und mein Vorschlag für eine schnellere Berechnung:


unsigned int i;
unsigned int k;

Messergebnis = readADC(4, 64) * 5;

k = Messergebnis /1024; //Vorkommastelle berechnen
Messergebnis -= k * 1024;
i = (Messergebnis*250UL) / 256; //Nachkommastelle


Eine andere Frage ist, ob du die Trennung in Vor- und Nachkommastelle
überhaupt brauchst, wenn du sie danach ohnehin noch (getrennt) in einen
String o.ä. wandeln musst.

i = (readADC(4, 64) * 1250UL) / 256;

würde einen Wert zwischen 0 und 4999 ergeben. Den wandelt man in einem
Aufwasch und 'merkt' sich, dass die erste Stelle die Vorkomma, die
anderen die Nachkommastellen sind. Nur so als Idee.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.