Zwischen -30°C und 400°C ist die Berechnung ausreichend genau, obwohl
die DIN IEC 751 nur Temperaturen >0°C zulässt.
Ist ein bischen 'Krieg der Klammern' geworden, aber der Compiler
optimiert die Rechenzeit auf 2.5µs @ 16MHz.
Für Verbesserungen bin ich jederzeit dankbar.
donnerwetter, kann ich nur sagen. In 22 takten mehrere Floating Point
Multiplikationen und eine Wurzel Berechnung, das ist Rekord. Aber das
steht ja nicht dabei, welcher Prozessor das ist. Vielleicht ein IBM
Vektorrechner mit vielen parallel laufenden Prozessoren?
mfg
Sorry! Ist ein ATmega32 bei 16MHz.
Wie ich schon schrieb: der Compiler optimiert aufgrund der vielen
Konstanten prima, also wird da nicht mehr viel gerechnet! ;-)
Welchen denn? Das Teil ist in meinem Regler integriert, ohne weitere
Includes krieg' ich das nicht auseinandergefieselt.
Lass' es doch einfach über den Debugger im AVR-Studio laufen, die
Stoppuhr zeigt dir die Zeit korrekt an!
mfg
THM wrote:
> Muss mich korrigieren, die Rechenzeit beträgt 1.38µs @ 16MHz.
Wohl eher 1.38 ms
Zumindest bewegt sich auf meinem Debugger die Zeit in diesem
Bereich. Was bei knapp 16000 verbrauchten Taktzyklen auch nicht
weiter verwunderlich ist.
Wurzel berechnen kostet nun mal seine Zeit.
Weiß gerade einer aus dem Stehgreif, wie der Compiler die Wurzel
umsetzt? Das einzige Verfahren, das mir spontan einfällt ist das
Heron-Verfahren und das braucht eine Division pro Approximationszyklus -
und die muss auch erstmal dem Mega32 beigebracht werden...
Ich hätt's wahrscheinlich eher als Wertetabelle mit linearer
Interpolation umgesetzt - oder kubisch, wenn's zu ungenau würde.
Können ja 'nen Contest draus machen, wer die schnellste Implementierung
hinkriegt ;)=
(Macht natürlich nur Sinn, wenn die aktuelle Messlatte wirklich bei
16000 liegt)
So, hab's nochmal extra getestet: komme auf 242.94µs.
So langsam glaube ich dem Debugger nix mehr! :(
Hat mich ehrlich gesagt auch gewundert, dass das Teil so schnell war ;)
mehrere messungen in einer Schleife laufen lassen und die Ergebnisse
über RS232 an PC senden und speichern. Und Uhrzeit jede sek. übertragen.
Aus dem Abzählen der Übertragungen zwischen den Sekunden kann man die
Rechenzeit berechnen. Das geht allerdings nur, wenn der RS232 keinen
Engpaß darstellt.
Aber zwischen 2 µs und 230µs ist schon ein Riesenunterschied und man
sollte auch die Glaubhaftigkeit anhand der Assemblerliste überprüfen.
Deshalb hatte ich ja danach gefragt.
mfg
Double reicht dafür dicke.
Die Genauigkeit bezieht sich auf den berechneten Widerstand, bei 400°C
sind das ca. 0.3°C Abweichung. Meines erachtens noch tolerierbar.
Was die Zeitmessung angeht: Die Dauer der Wurzelberechnung ist
vermutlich stark vom zu berechnenden Wert abhängig. Kann auch ein Grund
sein, warum eure Messungen so stark auseinanderlaufen.
>stark vom zu berechnenden Wert abhängig.
Habe ich grade getestet:
schwankt zwischen 190 und 250µs (ca.)
Je nachdem ob Nachkommaanteil drin ist, die Größe der Zahl ist auch
ausschlaggend.
> Double reicht dafür dicke.
Dafür reichen normalerweise auch die (32-bit) floats mit denen der avr
rechnet.
> Die Genauigkeit bezieht sich auf den berechneten Widerstand, bei 400°C> sind das ca. 0.3°C Abweichung. Meines erachtens noch tolerierbar.
Da müsste auch mit floats ein Fehler << 0.1 K rauskommen.
Allerdings sollte man sich auch nicht auf jede Tabelle verlassen!
Mal sinds 247.038 Ohm, mal 247.07 Ohm oder 247.092 Ohm bei 400 °C.
(247.092 Ohm sollte man mit der Standardformel bei 400 °C rausbekommen)