Berechnung durch Näherungsformel

Gast #2181427
Lesenswert?

Hallo

ich möchte in meinem Tiny13 mit der in Excel ermittelte Formel
y = 0.004347x2 + 0.174571x - 155.697431
eine Temperatur (y) berechnen.

Die Formel hab ich genähert durch:
y = (68x/1024)^2 + 89x/512 -156

und entsprechend umgesetzt:
volatile int32_t temperatur;
temperatur = (((68*ADC) >> 10)^2)
           + ((89*ADC) >> 9)
           - 156;

Die ADC-Werte überschreiten den Wert von 350 nie, einen Überlauf sollte 
also weder beim 1. noch beim 2. Term geben. Doch leider stimmt das 
Ergebnis hinten und vorne nicht.

Auch wenn ich im Code die Variable "ADC" durch einen fixen Wert 
ersetzte, weicht die Ausgabe stark vom erwarteten Ergebnis ab. Hier 
einige Beispiele

Faktor an Stelle von "ADC"      Ergebnis        erw. Ergebnis
0                               -154            -156
16                              -151            -153 (= 1^2 + 2 - 156)
128                             -124            -70 (= 8^2 + 22 - 156)
256                             -93             177 (= 17^2 + 44 - 156)
350                             -75             433 (= 23^2 + 60 - 156)

Woran liegt der Fehler???
Besten dank für eure Hilfe
Gast #2181489
Lesenswert?

Bei einer Bitfummelei etwas zu ver-XOR-n sieht zwar witzig aus, aber so 
tät ich des nicht machen. Schreib dir eben eine pow(); - Funktion. Oder 
eine Makrofunktion. Inline könnte es eine while-Schleife mit 
ordentlichem Funktionsrumpf richten.
mfg mf
Gast #2181504
Lesenswert?

wenn ich nun den ersten term mit ((68*ADC) >> 10) * ((68*ADC) >> 10) 
berechne (die funktion pow() kann ich nicht einsetzten, hat keinen platz 
hat in meinem 1k flash), scheint das resultat korrekt zu sein.
rechne ich jedoch (68*68*ADC*ADC) >> 20) (oder 4624 anstelle von 68*68) 
erhalte ich nicht das gewünschte.
mein ADC wert hat zwar eine breite von 11 Bit, wie aber oben erwänt wird 
der ADC-wert aber nie grösser als 380 und braucht somit auch höchstens 9 
bits. damit tritt bei der berechnung keinen überlauf auf und kann immer 
in einer 32-bit variable (eigentlich ja nur 31 bits für den wert, 1 bit 
fürs vorzeichen) gespeichert werden.
woran liegt das?
Gast #2181557
Lesenswert?

Und wenn du schon mit int32 rechnest solltest du das >>20 zum Schluss 
machen:

y =   0.004347x2 + 0.174571x - 155.697431
  =  (4558,159872x2 + 183050,960896x  - 163260589,408256 )/ 1024/1024
  = ((4558 * x + 183051)*x - 163260589)>>20

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren