Forum: Mikrocontroller und Digitale Elektronik Spannungsanzeige


von Peter (Gast)


Lesenswert?

Hallo,

ich hab mal wieder ein kleines Problem.
Ich lese eine Spannung ein und will sie auf einen LCD-Display anzeigen 
lassen. Die Spannung wird erst durch einen Spannungsteiler geteilt, mit 
einem invertierenden Verstärker verstärkt und dann mit einem 
Mikrocontroller eingelesn. Das klappt auch alles, bis auf folgendes 
Problem: Die Anzeige ist nicht linear. Im Programm teile ich die 
Spannung nochmal so das sie der eingelesenen Spannung entspricht. Wenn 
ich z.b. so teile das 10V genau angezeigt werden, weicht die Anzeige bei 
größeren oder kleineren Spannungen immer mehr ab. Eigentlich müsste der 
Wert bei änderungen linear bleiben. Ich hab keine Ahnung woher das 
kommen kann.

mfg Peter

von M. K. (sylaina)


Lesenswert?

Schaltplan und/oder Code wären noch hilfreich, so hilft nur ne Glaskugel 
und sowas hat nicht jeder daheim auf'm Schreibtisch stehen.

von holger (Gast)


Lesenswert?

>Die Spannung wird erst durch einen Spannungsteiler geteilt, mit
>einem invertierenden Verstärker verstärkt und dann mit einem
>Mikrocontroller eingelesn.

Zeig mal die Schaltung.

von Lukas K. (carrotindustries)


Lesenswert?

Vielleicht ist noch ein Offsetfehler drauf, der mittels Korrektur durch 
eine Geradengleichung y=mx+c zu beseitigen ist.
Also hintereinander ;) zwei bekannte Spannungen anlegen, angezeigten 
Wert ablesen und m und c bestimmen.

von Peter (Gast)


Lesenswert?

Hier mal der Programmteil zum anzeigen der Spannung:

    adcval = ReadChannel(0);
    u = ADC;
    u = (u>>6);

    ut = 197;

    u = u * 100;
    u = u / ut;

    itoa( u, Spannungswert, 10 );
    sprintf (Spannungswert, "%u,%u", u/10 , u%10);
    sprintf (Spannungswert, "%u,%02u", u/100 , u%100);
    set_cursor(0,1);
    lcd_string("Spannung: ");
    lcd_string(Spannungswert);
    lcd_string("V");
    lcd_string("   ");

Schaltplan habe leider nur eínen selbst gezeichneten, ist aber 
eigentlich genau so wie ich es beschrieben habe.

mfg Peter

von Peter (Gast)


Lesenswert?

@ Lukas: kannst du das genauer erklären?

von Peter (Gast)


Lesenswert?

keiner eine idee?

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:

> Schaltplan habe leider nur eínen selbst gezeichneten, ist aber
> eigentlich genau so wie ich es beschrieben habe.

Es geht darum eine Nichtlinearität zu finden, die du selber nicht 
siehst. Denkst du nicht, dass ein Schaltplan mit Bauteilwerten dazu 
besser geeignet wäre, als so eine windige Beschreibung?

Hast du eigentlich schon mal die Spannung direkt am ADC-Pin gemessen und 
mit deiner Anzeige verglichen?

von Karl H. (kbuchegg)


Lesenswert?

adcval = ReadChannel(0);

In adcval hast du jetzt deinen ADC-Wert ...

    u = ADC;

... warum dann noch einmal einlesen?

    u = (u>>6);

Sehr sinnig. Von 10 Bit Messergebnis werden gleich mal 6 weggeworfen.

von holger (Gast)


Lesenswert?

>Hier mal der Programmteil zum anzeigen der Spannung:

Dankeschön, unvollständig wie immer bei Deppen.

>    adcval = ReadChannel(0);
>    u = ADC;

Was soll der Quatsch? Nimm adcval statt ADC.

>    u = (u>>6);

Ähem. Schon mal was von Right adjusted gehört?

Du rechnest da so viel hin und her das es kein
Wunder ist das da nur noch Müll raus kommt.

von Peter (Gast)


Lesenswert?

tut mir echt leid, ich versteh die ganzen Penner nicht die nur 
irgendeinen Scheiß schreiben (Deppen). Wenn es dir zu unverständlich ist 
halte dich doch einfach aus dem Thema raus.

adcval ist genau das gleich wie adc.
ADC ist ein 16 Bit Register, wo der Wert linksbündig steht. Ich schiebe 
ihn nur nach rechts, das ich nicht so viel teilen muss. Denn Wert habe 
ich mal 100 genommen weil ich schlecht durch 1,97 teilen kann, oder?



@ alle anderen, ich werde noch einen schaltplan mit Splan anfertigen und 
ihn dann Posten.

von Peter (Gast)


Lesenswert?

@ Karl:

>adcval = ReadChannel(0);

>In adcval hast du jetzt deinen ADC-Wert ...

>    u = ADC;

tut mir leid, das habe ich nun mal so in einem tuturial gelesen, das der 
Wert immer gleich in eine Variable geschrieben werden sool.

>... warum dann noch einmal einlesen?

>    u = (u>>6);

>Sehr sinnig. Von 10 Bit Messergebnis werden gleich mal 6 >weggeworfen.

1111111111000000

so sieht nun mal das Ergebnis aus dan kann man doch wohl erstmal um 6 
nach rechtsschieben.

mfg Peter

von Lukas K. (carrotindustries)


Lesenswert?

Peter schrieb:
> @ Lukas: kannst du das genauer erklären?

x ist deine angelegte Spannung y=f(x) die angezeigte
nun 2 Beispielwerte:
2V angelegt, 1,3V abgelesen
3V angelegt, 2V abgelsen
daraus folgt
und
dieses LGS löst du nach m und c auf.

von Peter (Gast)


Lesenswert?

@Lukas,

danke für die Antwort. Tut gut mal eine Antwort zu lesen wo keine 
Vorwurfe drin sind.

mfg Peter

von Peter (Gast)


Lesenswert?

@ Karl:

>tut mir echt leid, ich versteh die ganzen Penner nicht die nur
>irgendeinen Scheiß schreiben (Deppen). Wenn es dir zu unverständlich ist
>halte dich doch einfach aus dem Thema raus.

tut mir leid, du warst damit nicht gemeint.

von Helfer (Gast)


Lesenswert?

> Wenn ich z.b. so teile das 10V genau angezeigt werden, weicht die Anzeige > bei 
größeren oder kleineren Spannungen immer mehr ab. Eigentlich müsste
> der Wert bei änderungen linear bleiben.

Kann an der Software und/oder der Hardware liegen.

Software mag ich aus dem Codeschnippsel nicht beurteilen.

Aber zu Hardware...

Hast du die Spannung am ADC Eingang (!) schon mit einer unabhängigen 
Methode (Multimeter) gemessen. Ich meine, wenn dort schon keine 
Linearität herrschen würde, könntest du dich in der Software totsuchen. 
Zur Sicherheit bzw. aus Forscherdrang würde ich diese Messung auch vor 
dem Spannungsteiler und vor dem invertierenden Verstärker durchführen.

Wenn die gewünschte Linearität an allen drei Punkten vorhanden ist, 
lohnt es sich ab dem ADC Eingang zu suchen. Zwei Dinge aus dem 
Datenblatt sind IMHO relevant: Abtastrate und Eingangsimpedanz. Bei 
einem zu schnellen Abtasten kann ich mir vorstellen, dass es 
Verschluckerlis gbt. Bei einer nicht passenden Eingangsimpedanz könnte 
es Probleme geben den ADC fristgerecht zu füllen. Im Zusammenhang mit 
dem invertierenden Verstärker sicher untersuchungswert.

von Peter (Gast)


Lesenswert?

@ Helfer:

Das werde ich Morgen mal machen.

Sorry:

    adcval = ReadChannel(0);
    u = ADC;
    u = (u>>6);

    ut = 197;

    u = u * 100;
    u = u / ut;

    itoa( u, Spannungswert, 10 );
    sprintf (Spannungswert, "%u,%u", u/10 , u%10);

>    sprintf (Spannungswert, "%u,%02u", u/100 , u%100);

Das gehört eigentlich nicht rein, das steht bei mir nur im Programm als 
Kommentar, falls ich eine oder zwei Stellen hinterm Komma anzeigen will.

    set_cursor(0,1);
    lcd_string("Spannung: ");
    lcd_string(Spannungswert);
    lcd_string("V");
    lcd_string("   ");

mfg Peter

von Anja (Gast)


Lesenswert?

Helfer schrieb:
> Bei einer nicht passenden Eingangsimpedanz könnte
> es Probleme geben den ADC fristgerecht zu füllen.

Gilt natürlich nicht nur für den ADC-Eingang sondern auch die 
Spannungsreferenz des ADCs. (Fehlender Kondensator).

Gruß Anja

von MaWin (Gast)


Lesenswert?

> Hier mal der Programmteil

Interessiert keinen.

> Schaltplan habe leider nur eínen selbst gezeichneten, ist aber
> eigentlich genau so wie ich es beschrieben habe.

Damit hätte man jedoch vielleicht helfen können, weil man dann
hätte können, ob dein Ausgang wegen Begrenzungen an der 
Versorgungsspannung gar nicht linear sein könnte, oder so.

von Bernd N. (Gast)


Lesenswert?

>> x ist deine angelegte Spannung y=f(x) die angezeigte
>> nun 2 Beispielwerte:
>> 2V angelegt, 1,3V abgelesen
>> 3V angelegt, 2V abgelsen

Also 2 Wertepaare, Delta U / Delta ADC

und so wird es in Software umgesetzt:

Beitrag "ADC und Fixed-Point Arithmetik"

Linearisierung inklusive herausrechnen aller Fehlerquellen. Das 
beschriebene Oversampling kannst du ja weglassen.

von Joachim (Gast)


Lesenswert?

So ein "Problem" hatte ich auch mal. Das war aber bei mir kein 
Linearitätsproblem, sondern ein Verstärkungsproblem. Wenn du deine 
Faktoren so anpasst, daß da bei angelegten 10V auch wirklich 10V stehen, 
dann kann deine Verstärkung auch totaler Mumpitz sein, was du dann aber 
erst bei Wertänderungen merkst.
Konkret meine ich: dein Verstärkungsfaktor setzt sich ja aus z.B. dem 
Spannungsteilerverhältnis, deiner Auflösung und deiner Referenzspannung 
zusammen. Da gibt es die "Idealwerte" (z.B. Referenzspannung = 5V) und 
die Wirklichen. Messe deinen Spannungsteiler vielleicht nochmal durch 
und vor allem deine Referenzspannung. Für einen Punkt (deine 10V) kann 
man sich dir werte zurecht lügen (was bei dir glaube ich) passiert. Mit 
zwei Referenzpunkten kriegst du das aber weg. Dann ist es aber immer 
noch kein Linearitätsproblem, sondern eine Verstärkungsproblem :) . Ich 
hab das Problem bei mir bei der Referenzspannung gefunden...


Gruß

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.