Forum: Mikrocontroller und Digitale Elektronik ADC-Wert in Spannung umrechnen


von neunfuenfundneunzig (Gast)


Lesenswert?

Hallo,

ich habe an meinem Mikrocontroller eine ADC-Referenzspannung von 5V. Mit 
der Formel im Datenblatt beträgt meine anliegende Spannung also:

Da das LSB mit 4,88mV so ein blöder Wert ist, wäre meine Frage wie ihr 
das sonst immer implementiert bzw. an meiner Stelle umrechnen würdet?

Danke für Antworten...

von billydeedaniels (Gast)


Lesenswert?

Also ich verstehe noch nicht so ganz, wo die Reise hingehen soll.
Kurz: Es ist ein 10bit AD Umsetzer. Deine 4,88mV ist deine 
Quanisierungsstufe.
Was möchstest du nun genau? Möchstest du nun den Wert in Volt umrechnen?

Einfach ADCWert/1024 * 5V fertig.

von billydeedaniels (Gast)


Lesenswert?

Wenn du Spannungen größer 5V messen möchtest, dann mußt du einen 
Spannungsteiler vorschalten und den daraus resultierenden Formfaktor 
noch mit einbringen.

von neunfuenfundneunzig (Gast)


Lesenswert?

Ja, möchte den Wert gerne in mV umrechnen.

Wenn ich das jedoch einfach so im Code eingebe, werden erst mal alle 
Bits auf Null gesetzt, wenn ich durch 1024 rechne.

Wenn ich den ADC-Wert einfach * 5mV (anstatt 4,88mV) nehme, bekomme ich 
allerdings ein "recht hohe" Abweichung, die ich gerne vermeiden würde.

von Michael R. (mexman) Benutzerseite


Lesenswert?

neunfuenfundneunzig schrieb:
> Hallo,
>
> ich habe an meinem Mikrocontroller eine ADC-Referenzspannung von 5V. Mit
> der Formel im Datenblatt beträgt meine anliegende Spannung also:
>
>
>
>
> Da das LSB mit 4,88mV so ein blöder Wert ist, wäre meine Frage wie ihr
> das sonst immer implementiert bzw. an meiner Stelle umrechnen würdet?
>
> Danke für Antworten...

Wie DU schon erfahren hast, ist Deine Fragestellung undurchsichtig.
Solltest Du einen "runden" Wert pro Digit/Bit des ADC - weshalb auch 
immer - haben wollen, dann musst Du eben ein bischen Mathe programmieren 
oder eine andere Referenzspannung nehmen....


Bitte auch beim Fragen stellen das Hirn einschalten.


Gruss

Michael

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

neunfuenfundneunzig schrieb:
> Wenn ich das jedoch einfach so im Code eingebe, werden erst mal alle
> Bits auf Null gesetzt, wenn ich durch 1024 rechne.
Falscher Datentyp?

Formel umstellen:
((long)ADCWert*5000l)/1024l
Gibt die Spannung in Millivolt.

von Chris (Gast)


Lesenswert?

Mache aus den 5 V referenz halt 5000mV. Und rechne damit. Dann hast 
alles mVolt.
Also ADC_Wert * 5000 / 1024 =  Vin

von billydeedaniels (Gast)


Lesenswert?

Dann rechne doch mit 488 und shifte anschließend. Kommt halt darauf an, 
was für einen Wertebereich deine Variable hat. Du kannst die Zahl ja 
auch vergößern z.B. 8bit in 16bit durch Splittung in LSB und MSB

von Carlos (Gast)


Lesenswert?

Warum denn alles so kompliziert ??

Ich gehe einmal davon aus, daß Du in C programmierst.

Du definierst dann Vin als float-Variable und programmierst einfach:

Vin = adcwert / 1024.0 * 5;

und schon hast Du das Ergebnis exakt in V, nimmst Du es dann noch * 1000 
so hast Du es in mV.

Dein Fehler war:  adcwert / 1024

da adcwert vermutlich eine int-Variable ist im Berech von 0 ... 1023 bei 
einem 10-Bit Wandler, dann ergibt die Division durch 1024 IMMER 0, da 
der Compiler das als int-Division auffast.

Carlos

von billydeedaniels (Gast)


Lesenswert?

Das ist ja das Problem, was bereits angedeutet wurde, dass er hierzu zu 
wenig Info bereit gestellt hat und die Antworten mehr auf Vermutungen 
beruhen. Aber das ist das was ich meinte mit Wertebereich der Variable.

von Udo S. (urschmitt)


Lesenswert?

Grundlagen Grundlagen Grundlagen!

Welchen Variablentyp benutzt du?
Welchen Wertebereich hat der?
Was passiert wenn du durch eine Multiplikation den Wertebereich 
überschreitest?
Was passiert bei Ganzzahlenvariablen wenn du dividierst.

Programmieren ist halt mehr als Codeschnipsel aus dem Internet 
zusammenzusetzen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Carlos schrieb:
> Du definierst dann Vin als float-Variable und programmierst einfach:
Und das am besten auf einem Popel-uC wie einem ATtiny10 mit 512 Bytes 
Codespeicher. Und die Ausgabe wird dann mit printf() gemacht...  :-o

> Vin = adcwert / 1024.0 * 5;
> und schon hast Du das Ergebnis exakt in V,
> nimmst Du es dann noch * 1000 so hast Du es in mV.
Was spricht gegen eine Lösung, die mit 5000 multipliziert und dann durch 
1024 teilt? Das lässt sich nämlich sehr effizient ganz ohne Division 
implementieren...

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.