Forum: Mikrocontroller und Digitale Elektronik Map-Funktion/Abbildungsformel?


von Hendrik B. (hendrik_ber)


Lesenswert?

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

von lightninglord (Gast)


Lesenswert?

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.

von Hendrik B. (hendrik_ber)


Lesenswert?

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!

von Klaus W. (mfgkw)


Lesenswert?

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.

von Hendrik B. (hendrik_ber)


Lesenswert?

Vielen Dank Klaus, das scheint wohl zu funktionieren. Aber wie bist du 
darauf gekommen? Kann ich dazu eine Herleitung finden?

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

oh danke, kann ich mir die Arbeit sparen :-)

von Hendrik B. (hendrik_ber)


Lesenswert?

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
Noch kein Account? Hier anmelden.