Hallo, ich hab jetzt ein Problem, das ich zu Beginn meines Projektes überhaupt nicht erkannt habe. Projekt: Ich muss eine eigene Wasserversorgung mit Pumpe und Kessel nutzen. Nach immer wiederkehrenden Problemen mit dem Druckschalter soll nun eine elektronische Lösung her. Nachdem die Startschwierigkeiten mit C und Winavr überwunden sind, bin ich begeisterter WinAvr Benutzer. ADC auslesen und Werte umrechnen und auf dem Nokia3310 Display ausgeben etc. geht prima. Zur Übertragung der Werte aus dem Pumpenschacht hab ich ein 4-20mA Industriestandard ausgesucht. Als preisgünstigen Sensor wollte ich die relativ neuen Kraftsensoren von Conrad nutzen. Habe geplant den Druck über eine Membrane direkt auf den Kraftsensor zu geben, dieser ändert dann seinen Widerstand und so komm ich an meine Druckwerte. Nu kommen die Probleme: Der Sensor ist nicht linear :-(((. Das Datenblatt hab ich angehängt, da ist mal eine Beispielkurve enthalten. Ich möchte die Druckwerte mit 1 Kommastelle anzeigen und entsprechend die Pumpe regeln. Ist hier jemand, der mir mal die Richtung sagen könnte, in der ich suchen muss? Wie krieg ich diese "in etwa exponential-Kurve" in C linearisiert? Könnte sowas mit einer Art Tabelle gehen? Wie errechne ich dann die Zwischenwerte? Oder hat einer ne andere Idee für einen preiswerten Drucksensor?
tabelle ist korrekt, leg dir einfach ein array. der index entspricht dem parameter, der wert des jeweiligen elements dem funktionswert deiner übertragungsfunktion. lies dir dein datenblatt nochmal genauer durch. speziell die stelle mit den erreichbaren genauigkeiten. die dinger sind als taster gedacht, nicht als messwandler.
Versuchs mal hiermit: http://www.mikrocontroller.net/forum/read-1-94718.html#97435 oder das hier: http://www.mikrocontroller.net/forum/read-1-99331.html#99361 Gruß Oliver
Ich nehme für sowas eine Formel, denn man kann an die Tabellen-Werte immer leicht eine passende Funktion anfitten. Zu gnuplot (open source freeware) gibt's ja genügend Anleitungen dazu im Netz.
Ich bevorzuge ebenfalls die Variante von nobody0, sie ist wesentlich einfacher zu implementieren und meiner Meinung nach weniger aufwändig. Gruss, Alex
Ich denke es ist gleich, ob Du es über ein Fitting oder eine Lookup-Tabelle machst -- wobei Lookup meist einfacher ist. Aber es ist darauf zu achten, daß Du die Kurve aus dem Datenblatt nicht direkt umsetzen kannst, denn Deine Mechanik (Membran) wird dieses Verhalten verändern. Sprich Du mußt Deinen kompletten Aufnehmer kalibrieren -- Referenzmessungen aufnehmen. Die dann entstandene Kurve solltest Du dann in den Controller aufnehmen. Gruss Marc
Hallo Leute, Danke für die schnellen und kompetenten Antworten!!! Ich hab jetzt völlig umdisponiert und werde mir bei Aktiv Sensor GmbH einen piezoresistiven kompletten Sensor kaufen. Meine Fehler waren: 1. Nicht das Datenblatt gelesen, sondern von der Werbung verführen lassen. 2. Einen Test hab ich gemacht: runde Scheibe auf den Sensor gelegt und mit Gewicht beschwert, Widerstand gemessen, Gewicht runter und wieder rauf, Widerstand wieder gemessen - alles schick! Aber keinen Langzeittest! Am Ende des Datenblattes steht, dass die Lastbeaufschlagung über einen längeren Zeitraum zum wandern des Wertes führt. Also Sensor umsonst gekauft :-((( Vorher lesen!!! Selber Schuld. So werde ich wohl die Tips von Euch nicht einbauen können/brauchen - diese Piezo Dinger sind weitestgehend linear und wie ich eben erfahren hab, mit 25-30 EUR zwar nicht billig, aber auch noch bezahlbar. Messverstärker und Wandler muss man zwar selber bauen, aber das krieg ich denke ich hin. Nochmals Danke, tut mir leid den Aufwand produziert zu haben. Gruss Holger
Also lookup table macht nur Sinn, wenn in der Tabelle alle Werte sind; wenn welche berechnet werden müssen, sollte man gleich eine Formel nehmen. Ich habe nämlich noch mit altem Code zu kämpfen, in dem jemand eine zweidimensionale Lookup-Table verwendet, aber nicht richtig interpoliert. In dem Fall hat man ja i. Allg. den betreffenden Wert in einem Quadrat, dessen 4 Ecken in der Tabelle stehen. Weil eine Ebene durch 3 Punkte bestimmt ist, ist die Interpolation überbestimmt (es gibt ja 4 mögliche Ebenen durch 3 der 4 Eckpunkte), so dass man den Mittelwert von 4 Mittelwerten berechnen muß um fair zu Interpolieren (was in dem alten Code nicht gemacht wurde so daß dadurch Sprünge entstehen). Bei dem Aufwand ist eine Formel wesentlich weniger aufwendig.
das hängt besonders auf controllern ohne hardware-multiplikation deutlich von der formel und der messwiederholrate ab. und kompromisse sind auch nicht immer schlecht. lineare interpolation ist weitaus schneller erledigt als eine hochkomplexe linearisierungsfunktion zu berechnen und ein paar stützpunkte verbraten bei weitem nicht soviel speicher wie eine 16bit tabelle.
Äh !? vier Ebenen? hochkomplexe lineare Interpolisierungsfunktion? Lookup Tabelle mit 3 Ebenen und lauter Ecken? --- BAHNHOF --- nix mehr versteh - vieeel zu heiss heute Gruss Holger
Also Polynome stellte man in der Numerik so dar: A0 + x*(A1 + x*(A2 + x*(....))) statt A0 + A1*x + A2*x*x ... und damit hat ein Polynom nur lineare Zeitkomplexität, ist also schnell berechnet. Bei Brüchen von Polynomen ist es ebenso. Und wie gesagt ist eine Funktion z(x, y) besser als eine 3d-Tabelle (Matrix), weil der Rechenaufwand für die (in 3 Dimensionen vierdeutige) lineare Interpolation erheblich ist. Dazu kommt noch, das sowas meist falsch implementiert wird, weil viele Programmierer einfach mal so implementieren, was sie nur halb kennen.
Qnobody: Kennst Du eine gute Quelle, wo ich mich in diese Materie mal ein bischen einlesen kann? Hab mich noch nie mit der Berechnung solcher Funktionen beschäftigt. Gruss Holger
Also Fitten allgemein erfordert Einarbeitung wie ein paar Semester Mathematik, aber meist reicht ein Polynom (oder eine einzige kurze Funktion wie sin), also a + b*x + c*x*x ... oder auch 1 / ( a + b*x + c*x*x ... ). Dazu gibt's einiges an Theorie (Taylor-Reihe usw.) in Fachbüchern, falls man weiteres dazu wissen will, aber in der Praxis braucht man das meist nicht. Wichtig ist meist eine Vorverarbeitung, also beispielsweise für x nicht den Strom I einsetzen sondern I*I oder 1/I. Zum Fitten wird ein least-square-fig genommen, bei dem die Quadrate der Abweichungen in x-, y- ...-Richtung quadriert u. Summiert werden. Durch das Quadrieren ist diese Summer immer positiv. Der Fit bewirkt eine Anpassung der Parameter (a, b, ...), so dass diese Summe minimal wird. Unter Gnuplot sieht das zum Temperatursensor KTY81-110 so aus (als Eingabe in's Terminal oder als Skript, mit dem gnuplot als Parameter aufgerufen wird): set encoding iso_8859_1 # set title "KTY81-110" f(x)=a+b*x+c*x**2+d*x**3 a=-75 b=0.05 c=-0.5 d=0.5 set xlabel "R" set ylabel "T" FIT_LIMIT=1e-20 fit f(x) 'kty81-110.txt' using 1:2 via a, b, c, d plot 'kty81-110.txt' with points, f(x) # pause -1 # wartet auf return set output "kty81-110.ps" set terminal postscript color replot # reread # fängt wieder oben an Und hier die Daten (kty81-110.txt) nach Hersteller-Angabe zusammen mit dem Ergebnis (ohne Abb.): # KTY81-110 # resistance/Ohm T/degree celsius 490 -55 515 -50 567 -40 624 -30 684 -20 747 -10 815 0 886 10 961 20 1000 25 1040 30 1122 40 1209 50 1299 60 1392 70 1490 80 1591 90 1696 100 1805 110 1915 120 1970 125 2023 130 2124 140 2211 150 #Final set of parameters Asymptotic Standard Error #======================= ========================== # #a = -167.123 +/- 1.297 (0.776%) #b = 0.275501 +/- 0.003506 (1.273%) #c = -0.000102316 +/- 2.86e-06 (2.795%) #d = 1.92025e-08 +/- 7.168e-10 (3.733%) # # #correlation matrix of the fit parameters: # # a b c d #a 1.000 #b -0.985 1.000 #c 0.954 -0.990 1.000 #d -0.919 0.969 -0.994 1.000 Folglich berechne ich die Temperatur des Sensors so: T = a + R_s*( b + R_s*( c + R_s*d)) mit a = -167.123 b = 0.275501 c = -0.000102316 d = 1.92025e-08 Dazu kommen noch die Fehlerfälle Kabelbruch und Kurzschluß, die vorher behandelt werden. Anschließend kommt noch eine simple Mittelwertbildung zur Glättung: if (T_actual) { T_actual += T; T_actual /= 2.; } else T_actual = T; Ansonsten hilft auch google oder metager: http://meta.rrzn.uni-hannover.de/
Gibt's irgendeinen vernünftigen Grund, wieso die Hersteller in ihren Datenblättern nicht schon selber eine Formel zur Verfügung stellen? Ich meine das ist schon fast eine Frechheit, welche ungenauen Diagramme man in manchen Datenblätter findet. Soll man die dann ausdrucken und mit dem Lineal messen und die Werte schätzen oder wie? >:(
@thomas kropf: das ist jetzt ein missverständnis. die linearisierungsfunktion fittest du an deinen speziellen sensor und dessen individuelle kennlinie. kennlinien werden in datenblättern meist deshalb nur tendenziell angegeben, weil die entsprechenden bauteile eine sehr grosse exemplarstreuung haben. generell sollten niemals kennlinien aus datenblättern benutzt werden um sein individuelles messsystem zu linearisieren. zu vielen bauteilen ist es auch unüblich eine exakte kennlinie zu benötigen, wie der oben genannte drucksensor, der eigentlich als taster gedacht ist. auch dort soll das im datenblatt angegebene diagramm lediglich eine tendenz wiedergeben.
Besser wäre es schon, die Formeln mit den Parametern anzugeben, aber das ist eine Stil-Frage. Hersteller wie Texas Instruments geben die Formeln mit Parametern an (zumindest beim MSP430); da muß man nichts selber fitten.
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.