Forum: Compiler & IDEs Sensorkurve in C umsetzen, wie?


von Holger Gerwenat (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Dingens (Gast)


Lesenswert?

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.

von Oliver Rogasch (Gast)


Lesenswert?


von nobody0 (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

Ich bevorzuge ebenfalls die Variante von nobody0, sie ist wesentlich
einfacher zu implementieren und meiner Meinung nach weniger aufwändig.

Gruss, Alex

von Marc Vollmer (Gast)


Lesenswert?

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

von Holger Gerwenat (Gast)


Lesenswert?

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

von nobody0 (Gast)


Lesenswert?

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.

von Dingens (Gast)


Lesenswert?

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.

von Holger Gerwenat (Gast)


Lesenswert?

Äh !?

vier Ebenen? hochkomplexe lineare Interpolisierungsfunktion? Lookup
Tabelle mit 3 Ebenen und lauter Ecken?

--- BAHNHOF ---

nix mehr versteh - vieeel zu heiss heute

Gruss Holger

von nobody0 (Gast)


Lesenswert?

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.

von Holger Gerwenat (Gast)


Lesenswert?

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

von nobody0 (Gast)


Lesenswert?

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/

von Thomas Kropf (Gast)


Lesenswert?

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? >:(

von Dingens (Gast)


Lesenswert?

@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.

von nobody0 (Gast)


Lesenswert?

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