Hallo, ich würde gerne aus 13 Messwerten in einer Tabelle automatisch die Zwischenwerte berechnen lassen. Also um es mal zu erklären, ich habe einen ADC Wert zwischen 0 und 200 der zu einem realen Wert 0 bis ~8500 umgerechnet werden muss, da die werte aber leider nicht linear sind ist meine wahl auf eine lookup Tabelle gefallen. Ich habe aber keine lust, bzw Zeit mir für jeden ADC Wert den richtigen Real wert Rauszumessen. kPa ADC 0 0 100 9 200 19 300 27 390 34 510 43 620 50 750 58 820 62 910 67 1500 92 2700 123 4700 150 8200 172 Deswegen meine frage: wie bekomme ich die zwischenwerte berechnet um sie in meiner Lookup tabelle einzutragen? Gibt es dafür vielleicht sogar eine fertige software oder sowas? MFG
Rechne das doch einfach aus. Wert ADC 75 Das fällt zwischen 67 / 92 Also muss das Ergebnis zwischen 910 und 1500 liegen. Die Formel dazu wirst Du schon raus finden... PS: Ich würde dafür eher mindestens ein 12-Bit ADC nehmen und nicht nur ein 8-Bit.
:
Bearbeitet durch User
Millimeterpapier, Messwerte eintragen, mit Bleilineal den Graphen einzeichnen, Zwischenwerte ablesen.
:
Bearbeitet durch User
@Steffen We (woern92) >ich würde gerne aus 13 Messwerten in einer Tabelle automatisch die >Zwischenwerte berechnen lassen. Nennt man Interpolation. >Also um es mal zu erklären, ich habe einen ADC Wert zwischen 0 und 200 >der zu einem realen Wert 0 bis ~8500 umgerechnet werden muss, da die >werte aber leider nicht linear sind ist meine wahl auf eine lookup >Tabelle gefallen. Warum nicht mit einer Formel? Eine Tabelle nimmt man nur, wenn es sehr schnell gehen muss. >Ich habe aber keine lust, bzw Zeit mir für jeden ADC Wert den richtigen >Real wert Rauszumessen. Dann halt lineare Interpolation. kPa ADC 0 0 100 9 200 19 300 27 390 34 510 43 620 50 750 58 820 62 910 67 1500 92 2700 123 4700 150 8200 172 >Deswegen meine frage: wie bekomme ich die zwischenwerte berechnet um sie >in meiner Lookup tabelle einzutragen? Gibt es dafür vielleicht sogar >eine fertige software oder sowas? Das ist doch eine vorzööögliche ÖÖÖÖÖbung för den Schööööler! Lineare Funktionen sind(waren) mal Stoff im Mathematikunterricht bis Klasse 10. Sag jetzt bitte nicht, daß du erst in der 7. bist ;-) Kleine Hilfe. Dein ADC-Wert ist z.B. 52. Also muss man zuerst in der Tabelle die richtigen Zeilen finden, hier 7 und 8 (bei 0 beginnend) Also ist der Druck schon mal >620kPa. Wieviel? Das sagt uns die Prozentrechnung. Die Druckdifferenz zwischen den Zeilen ist 750-620=130kPa, die ADC-Differenz ist 58-50=8. Der Rest ist einfache Prozentrechnung delta ADC / delta ADC_MAX = delta Druck / delta Druck max. -> delta Druck = delta ADC / delta ADC max * delta Druck max. -> = 2 / 8 * 130 Zur Verminderung von Rundungsfehler macht man die Division am Schluß, also eher 2 * 130 / 8 Druck = Druck der 7. Zeile + delta Druck
@ Markus Müller (mmvisual) >PS: Ich würde dafür eher mindestens ein 12-Bit ADC nehmen und nicht nur >ein 8-Bit. Es würde für den Anfang erstmal reichen, den Spannungspegel des Sensors per OPV auf den vollen ADC-Meßbereich hochzubringen.
Steffen W. schrieb: > Deswegen meine frage: wie bekomme ich die zwischenwerte berechnet um sie > in meiner Lookup tabelle einzutragen? Einfachste Art der Interpolation wäre linear, also per angewandtem Dreisatz als 2-Punkte Form der Geradengleichung. Du kannst das auch direkt den µC erledigen lassen, falls der sich sowieso langweilt. Steffen W. schrieb: > Gibt es dafür vielleicht sogar eine fertige software oder sowas? Kennst du Excel von Microsoft? Das kann Trendlinien bestimmen und es gibt auch eine entsprechende Funktion zum Berechnen von Werten in Tabellenform. Falls du weisst, wie die Funktion aussieht, i.e. du das mathematische Modell dahinter kennst, ist das Solver add-on ein passendes Tool.
Falk B. schrieb: > Lineare Funktionen sind(waren) mal Stoff im Mathematikunterricht bis > Klasse 10. Sag jetzt bitte nicht, daß du erst in der 7. bist ;-) Wenn es schon werden soll und man kein vernünftiges mathematisches Modell hat, nimmt man kubische Splines. Damit vermeidet man gegenüber einer primitiven linearen Interpolation zumindest schon mal die hässlichen Knicke und die kräftigen systematischen Abweichungen zwischen den Stützstellen auf Grund der bei einer Geraden nicht vorhandenen Krümmung. Alles eine Frage der Genauigkeitsanforderungen. Zur Prüfung des Interpolationsverfahrens kann man einzelne Stützstellen aus der Interpolationsrechnung rausnehmen und gucken, wie gut der ausgelassene Wert getroffen wird.
Steffen W. schrieb: > Deswegen meine frage: wie bekomme ich die zwischenwerte berechnet um sie > in meiner Lookup tabelle einzutragen? Gibt es dafür vielleicht sogar > eine fertige software oder sowas? Wenigstens für den maximalen ADC-Wert (200) solltest du noch einen zugehörigen kPa-Wert bestimmen. Dann kannst du in wenigen Minuten per Exel entweder linear interpolieren und die Tabelle in dein Programm einbinden oder gleich per Software linear interpolieren. Der Zusammenhang ist aber exponentiell, so dass eine exponentielle Interpolation (Tabelle oder Software) bestimmt bessere Werte liefert, insbesondere bei größeren ADC-Werten in der oberen Hälfte. Im Anhang die lineare Interpolation bis kPa = 8200 als Diagramm.
Die Kennlinie sieht nach einer Hyperbel mit den Asymptoten x ≈ -2000 und y ≈ 200 aus. Zudem verläuft sie durch den Koordinatenursprung. Mittels Least-Square-Optimierung (z.B. mit SciPy) können ihre Parameter genauer bestimmt werden. Damit kannst du für jeden Druck- den ADC-Wert berechnen und umgekehrt.
Danke für die vielen Antworten! Ich habe es jetzt einfach mit einer Tabelle und der Interpolation gelöst.
1 | Sub Mapping(WertIn as word, WertOut as Single,byval Map as String * 10) |
2 | Dim Wert_Min as Single |
3 | Dim Wert_Max as Single |
4 | Dim ADC_Min as Word |
5 | Dim ADC_Max as Word |
6 | Dim ADC_DIFF as Word |
7 | Dim Wert_Diff as single |
8 | Dim Wert_Min_Diff as Word |
9 | Dim Delta as single |
10 | Dim DeltaRound as long |
11 | |
12 | Dim ReadOut as String * 20 |
13 | |
14 | Dim Trenner as Byte |
15 | Dim Wert as Single |
16 | Dim ADC as Word |
17 | |
18 | Dim ADCS as String * 5 |
19 | |
20 | |
21 | Open Map For binary As #66 |
22 | |
23 | do |
24 | lineinput #66, ReadOut |
25 | Trenner = instr(ReadOut, "-") |
26 | |
27 | If trenner > 0 then |
28 | trenner = trenner - 1 |
29 | temp = mid(readout,1,trenner) |
30 | ADC_Max = val(temp) |
31 | trenner = trenner + 2 |
32 | temp = mid(readout,trenner) |
33 | Wert_Max = val(temp) |
34 | |
35 | |
36 | If ADC_MAX = WertIn then |
37 | WertOut = Wert_Max |
38 | Goto Ende_Map |
39 | end if |
40 | |
41 | If ADC_MAX < Wertin Then |
42 | ADC_Min = ADC_Max |
43 | WERT_Min = Wert_Max |
44 | end if |
45 | |
46 | If ADC_Max > WertIn then |
47 | 'Berechnen |
48 | ADC_Diff = ADC_MAX - ADC_Min |
49 | Wert_Diff = Wert_Max - Wert_Min |
50 | Wert_Min_Diff = Wertin - Adc_Min |
51 | Delta = Wert_Diff / ADC_Diff |
52 | Delta = Delta * Wert_Min_Diff |
53 | wertout = Delta + Wert_Min |
54 | |
55 | |
56 | Goto Ende_Map |
57 | end if |
58 | |
59 | end if |
60 | |
61 | Loop Until Eof(66)<> 0 |
62 | Ende_Map: |
63 | |
64 | close #66 |
65 | |
66 | end sub |
Falk B. schrieb: > Lineare Funktionen sind(waren) mal Stoff im Mathematikunterricht bis > Klasse 10. Nicht in meiner 10. Klasse.
F. F. schrieb: > Nicht in meiner 10. Klasse. Ok, kann sein, dass das normalerweise schon in der 9. Klasse dran ist.
Nein, leider nicht. Ich habe damals die Fachoberschulreife an der Hauptschule gemacht. Das war das allererste Jahr, in dem das (zumindest in NRW) möglich war. Ob der Stoff hätte vermittelt werden sollen oder nicht, unsere Lehrerin war zu blöd für Mathe und Kurt (später Ing. geworden) hat dann immer alles vor gerechnet. Bei der habe ich nie was kapiert. Es ist sehr blöd, da in der Elektronik viel gerechnet werden muss und ich ja nun leider auf die Fähigkeiten von meinem mathematisch hochbegabten Jungen nicht mehr zurück greifen kann. Richard hatte mir das mal gezeigt und da hatte ich das auch verstanden, aber dann nicht wieder angewendet.
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.