Hallo, ich stehe derzeit etwas auf dem Schlauch. Ich lese über den ADC ein 1-5V ein. Dies kann somit zwischen 51 und 255 liegen (8-Bit-Auflösung). Nun möchte ich diese Werte auf ein 0-3.3V Signal abbilden (0-255). Ich komme dabei einfach auf keinen grünen Zweig. Könnt Ihr mir einen Tipp geben, wonach ich suchen oder was ich mir anschauen könnte bzgl. einer Umrechnung? Viele Grüße
Rein Rechnerisch würde die Formel für die Lineare Interpolation funktionieren. Schau bei Wikipedia, da steht die Newtonsche Interpolationsformel, die würde ich nehmen. Oder willst du das ganze in Hardware realisieren? Das wäre mit OPs möglich. Oder sogar mit einem kleine Widerstandsnest, falls der Ausgangsspannungsbereich innerhalb des Eingangsspannung Bereiches liegt.
Mit OPs wäre es ganz interessant, wie man das macht. Ich schaue mir mal die von dir genannte Formel an und versuche die auf meinem AVR umzusetzen. Danke!
Erster Schuß aus der Hüfte mit linearer Interplation: f_0 = gelesener ADC-Wert f_0_unten = 1.0*256/5.0 f_0_oben = 5.0*256/5.0 - 1 f_1_unten = 0 f_1_oben = 3.3 f_1 = f_1_unten + ( f_0 - f_0_unten )*( f_1_oben - f_1_unten )/( f_0_oben - f_0_unten ) Durch Rundungsfehler (f_0_unten ist genau genommen 51.2 statt 51) kann z.B. bei f_0 für f_1 ein leicht negativer Wert rauskommen, der ist dann natürlich aufzurunden. Außerdem evtl. geschickt umzustellen, wenn du ganzzahlig rechnen willst.
Vielen Dank Klaus, das scheint wohl zu funktionieren. Aber wie bist du darauf gekommen? Kann ich dazu eine Herleitung finden?
Hendrik B. schrieb: > Dies kann somit zwischen 51 und 255 liegen (8-Bit-Auflösung). > Nun möchte ich diese Werte auf ein 0-3.3V Signal abbilden (0-255). > Das wird dann wohl auf eine lineare Transformation hinauslaufen. Also auf eine Umrechnung nach dem Muster
1 | y = k*x + d |
die einzige Frage lautet: wie gross ist k und wie gross ist d? > Ich komme dabei einfach auf keinen grünen Zweig. Könnt Ihr mir einen > Tipp geben, wonach ich suchen oder was ich mir anschauen könnte bzgl. > einer Umrechnung? Ist ganz simpel. x sei der Wert vom ADC, y sei der Wert, den du an deine Ausgangsstufe geben willst. Der Zusammenhang zwischen beiden sei
1 | y = k*x + d |
Wie gross ist k? wie gross ist d? Ganz einfach. Du kennst ja 2 Wertepärchen x und y. Denn bei einem ADC Wert von 51, soll am Ausgang ja 0 auftauchen und bei einem ADC Wert von 255, soll am Ausgang auch 255 auftauchen. D.h. in FOrmeln gefasst
1 | 0 = k * 51 + d |
2 | 255 = k * 255 + d |
2 Gleichungen in 2 Unbekannten (k und d), das lässt sich lösen. Die erste Gleichung von der 2. Gleichung abgezogen, lässt das d verschwinden
1 | 0 = k * 51 + d // ---+ |
2 | 255 = k * 255 + d // ---+ Subtrahieren |
3 | ---------------------- |
4 | |
5 | 255 - 0 = k * 255 - k * 51 + d - d |
6 | ergibt 0 |
7 | --------------------- |
8 | 255 = k * 255 - k * 51 |
das k herausgehoben
1 | 255 = k * ( 255 - 51 ) |
Die Klammer ausgerechnet, durchdividiert und das k nach links
1 | k = 255 / 204 |
und wir wissen, wie gross das k ist. Was ist mit dem d? Simpel. Nimm eine der beiden Gleichungen, zb
1 | 0 = k * 51 + d |
setzte das jetzt bekannte k ein
1 | 0 = 255 / 204 * 51 + d |
ausrechnen und umstellen
1 | d = -63.75 |
Wichtig: Probe machen! Bei einem Eingangswert von 51 muss 0 rauskommen
1 | 0 = k * 51 + d |
2 | |
3 | k und d einsetzen |
4 | |
5 | 0 = 255 * 51 / 204 - 63.75 |
6 | |
7 | 0 = 63.75 - 63.75 |
8 | |
9 | 0 = 0 passt |
Weiters wissen wir: bei einem Eingangswert von 255 muss 255 rauskommen
1 | 255 = k * 255 + d |
2 | |
3 | k und d einsetzen |
4 | |
5 | 255 = 255 * 255 / 204 - 63.75 |
6 | |
7 | 255 = 318.75 - 63.75 |
8 | |
9 | 255 = 255 passt |
die gesuchte Umrechnung lautet also
1 | y = 255 * ADC_Wert / 204 - 63.75 |
bzgl. der 63.75 könnte man noch was drehen, falls notwendig
Hendrik B. schrieb: > Vielen Dank Klaus, das scheint wohl zu funktionieren. Aber wie bist du > darauf gekommen? Kann ich dazu eine Herleitung finden? Du hast diesen Zusammenhang
1 | -------------+-------------------+-------------- |
2 | f_0 unten oben |
3 | |
4 | | | |
5 | +-+ +-+ |
6 | v v |
7 | |
8 | f_1 ---------------+---------------+-------------- |
9 | unten oben |
den du realisieren sollst. D.h. auf dem oberen Zahlenstrahl ist die Distanz zwischen oben und unten wie gross?
1 | + von hier bis hier + |
2 | | | |
3 | -------------+-------------------+-------------- |
4 | |
5 | | | |
6 | +-+ +-+ |
7 | v v |
8 | |
9 | f_1 ---------------+---------------+-------------- |
10 | unten oben |
Diese Distanz soll sich im unteren Zahlenstrahl auf welcher Distanz wiederfinden?
1 | + von hier bis hier + |
2 | | | |
3 | |
4 | -------------+-------------------+-------------- |
5 | f_0 unten oben |
6 | |
7 | | | |
8 | +-+ +-+ |
9 | v v |
10 | |
11 | f_1 ---------------+---------------+-------------- |
12 | unten oben |
13 | |
14 | | | |
wenn wir also erst mal nur diese Distanzen betrachten, wie muss das umgerechnet werden? Wenn also sagen wir mal am oberen Zahlenstrahl der Abschnitt 10 Einheiten lang ist, und am unteren nur 5, wie rechnet man dann. Na einfach. Den zu transferierenden Wert x mal 5 und durch 10. Das ist im Grunde einfach nur eine verkappte Prozentrechnung. Wenn der zu transferierende Punkt o, auf dem oberen Strahl x Prozent vom linken Rand des Abschnitts entfernt war
1 | x % |
2 | | | |
3 | |
4 | -------------+-----O-------------+-------------- |
5 | f_0 unten oben |
6 | |
7 | | | |
8 | +-+ +-+ |
9 | v v |
10 | |
11 | f_1 ---------------+---------------+-------------- |
12 | unten oben |
13 | |
14 | | | |
dann muss er auch im unteren Abschnitt dieselben x % vom unteren Rand entfernt sein. Nur dass diesmal der Abschnitt eine andere Länge hat
1 | x % |
2 | | | |
3 | |
4 | -------------+-----O-------------+-------------- |
5 | f_0 unten oben |
6 | |
7 | | | |
8 | +-+ +-+ |
9 | v v |
10 | |
11 | f_1 ---------------+----O----------+-------------- |
12 | unten oben |
13 | |
14 | | | |
15 | dieselben x% |
Jetzt haben wir noch ein klitzekleines Problem: wir können doch nicht einfach so mulitplizeren. Aber oft werden die Dinge einfacher, wenn man irgendwas in den 0 Punkt verschiebt. Wir schieben also den oberen Zahlenstrahl einfach mal so, dass 'unten' bei 0 zu liegen kommt. Das ist einfach nur eine Subtraktion mit 'unten'. Im unteren Zahlenstrahl machen wir dasselbe
1 | -------------+-------------------+-------------- |
2 | f_0 0 oben - unten |
3 | |
4 | | | |
5 | | +---+ |
6 | | v |
7 | |
8 | f_1 -------------+---------------+-------------- |
9 | 0 oben - oben |
Jetzt können wir einen Punkt aus dem oberen Zahlenstrahl auf den unteren Übertragen indem wir einfach über das Verhältnis der Abschnittslängen gehen (mathematisch nennt man das den Strahlensatz), also die Prozentgeschichte anwenden. Bleibt nur noch im unteren Strahl die Verschiebung in den 0 Punkt wieder rückgängig zu machen, in dem zum bisherigen Ergebnis f1_unten wieder addiert wird.
Super, vielen Dank für die klasse Erklärungen! Ist doch einfacher nachzuvollziehen, wenn es einmal richtig aufgedröselt wird. Nochmals vielen Dank dafür, habe es jetzt verstanden. :)
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.