Werte per quadratscher Gleichung berechnen ?

OP #2423739
Lesenswert?
• ▲
▼
(Betr.: C auf ATMEGA 328)

Hallo,
eine Sensor-Kennlinie lautet wie folgt:

a=17,1218388508 (offset)
b=0,1455858690 (Factor)
c=0,0000885752 (quadratic)

pulsetime = a + b*Temp + c*Temp² (quadratische Funktion)
Wertebereich für Temp = 40..170°C
Das Ergebnis (pulsetime) muss eigentlich nur in 0,05 Schritten genau 
sein..


Ich würde gerne Float-Berechnungen umgehen (wg. Geschwindigkeit),
daher die Frage,
kann man das ganze (quadratisch) irgendwie mit Festkomma rechnen ?
(Festkommaarithmetik)
oder ist es schneller*, einfach eine Wertetabelle anzulegen 
(lookuptable) *bzgl. Ausführungsgeschwindigkeit) ?

Der Vorteil, wenn ich es als quadratischen Formel implementieren würde, 
wäre, dass man zur Kalibration einfach die drei Faktoren a,b,c 
einstellbar macht.
(System muss regelmäßig wiederkehrend kalibriert werden, Sensoren werden 
nach einiger Zeit ausgetauscht, da verschlissen)
Moderator (Firma: Titel) Persönliche Seite #2423761
Lesenswert?
• ▲
▼
Friedo B. schrieb:
> C auf ATMEGA 328

Friedo B. schrieb:
> Das Ergebnis (pulsetime) muss eigentlich nur in 0,05 Schritten genau
> sein..
Wie meinen? Eine Ganzzahl auf 0.05 genau?

Friedo B. schrieb:
> oder ist es schneller*, einfach eine Wertetabelle anzulegen
> (lookuptable) *bzgl. Ausführungsgeschwindigkeit) ?
Ja.

> Der Vorteil, wenn ich es als quadratischen Formel implementieren würde,
> wäre, dass man zur Kalibration einfach die drei Faktoren a,b,c
> einstellbar macht.
3 Ecken zum Abgleich. Das nenne ich nicht "einfach"... :-o

BTW:
> a=17,1218388508 (offset)
> b=0,1455858690 (Factor)
> c=0,0000885752 (quadratic)
float kennt nur 6 signifikante Stellen. Das ist dir klar?
Du hast also reell nur
> a=17,1218 (offset)
> b=0,145585 (Factor)
> c=0,0000885752 (quadratic)
Gast #2423762
Lesenswert?
• ▲
▼
ob nun Wertetabelle oder Festkomma schneller ist, ist abhängig davon 
wieviele Werte du in der Tabelle hättest.

Festkomma ist natürlich überhaupt nur sinnvoll wenn du mit ganzzahlen 
einen vertretbaren Wertebereich erstellen kannst.

z.B.:

wir machen deine 3 floats zu 3 int32 indem wir einfach alle 3 zahlen mit 
z.B.
1000000 mutliplizieren, dann hast du

a=17121838
b=145585
c=88

musst halt schauen das du eine möglichst hohen Faktor nimmst, aber nich 
so hoch das eine Zahl 2^31 (2147483648) übersteigen kann, bzw. 2^32 wenn 
du kein vorzeichen brauchst.
OP #2423787
Lesenswert?
• ▲
▼
Danke schon mal !

Wertebereich "Temp" = 40 ... 170 (steht ja oben schon)
Wertebereich Ergebnis = ca. 23 ... 44 (kann man ja ausrechnen ;-)

habe jetzt noch das hier gefunden:
--> http://www.mikrocontroller.net/articles/Festkommaarithmetik
das fand ich interessant -> ich denke, so könnte ich das hinbekommen.

Es geht ja neben Addition nur um Multiplikation (siehe Formel)

also wenn ich Euch richtig verstanden habe:

Berechnung in Float: "langsam"
Berechnung in Festkommaarithmetik: "schneller"
Lookup-Table: "am schnellsten" (auch mit 100-200 Wertepaaren ?)

(?)




B.T.W. haben die ARM Cortex M0 / M3 eigentlich FPU's ?
#2423790
Lesenswert?
• ▲
▼
Friedo B. schrieb:
> (auch mit 100-200 Wertepaaren ?)

Egal wieviele Wertepaare. Solang dir der Speicher nicht ausgeht, ist die 
Lookup-Tabelle immer am schnellsten.

Und wenn du dir durch eine Tabelle die komplette Float-Bibliothek 
einsparen kannst, darf die schon recht groß werden um auf denselben 
Flash-Bedarf zu kommen.

Als Mittelweg kannst du dir auch nur eine Tabelle mit Stützpunkten 
anlegen, und dazwischen linear interpolieren.
OP #2423799
Lesenswert?
• ▲
▼
"irgendwer" schrieb:
> ob nun Wertetabelle oder Festkomma schneller ist, ist abhängig davon
> wieviele Werte du in der Tabelle hättest.

OK.

Εrnst B✶ schrieb:
> Egal wieviele Wertepaare. Solang dir der Speicher nicht ausgeht, ist die
> Lookup-Tabelle immer am schnellsten.

OK, alles klar...

> Als Mittelweg kannst du dir auch nur eine Tabelle mit Stützpunkten
> anlegen, und dazwischen linear interpolieren.
ich denke darauf wird's hinauslaufen...

Danke noch mal.
#2423812
Lesenswert?
• ▲
▼
Friedo B. schrieb:

>> Als Mittelweg kannst du dir auch nur eine Tabelle mit Stützpunkten
>> anlegen, und dazwischen linear interpolieren.
> ich denke darauf wird's hinauslaufen...

Hat dann wiederrum den Vorteil, dass du praktisch jede beliebige 
Kurvenform hinkriegst. Hat allerdings den Nachteil, dass du bei 
Kalibrieren mehr Aufwand treiben musst.

> Der Vorteil, wenn ich es als quadratischen Formel implementieren
> würde, wäre, dass man zur Kalibration einfach die drei Faktoren
> a,b,c einstellbar macht.

Und die 3 Faktoren kriegt derjenige, der die Kalbrierung machen muss, wo 
her?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.