Rechenfunktionen des Kr-Mega
|
16.01.2008, 11:37
Beitrag #2
|
|||
|
|||
RE: Rechenfunktionen des Kr-Mega
Hallo Frederik!
Es gibt in der Tat bereits mathematische Funktionen, die auch diese Winkelberechnungen durchführen. Da du diese Funktionen für die Regelung von Motoren verwenden willst, ein kleiner Hinweis vorweg. Die Winkelfunktionen als auch die Wurzelfunktionen benötigen eigentlich eine Fließkommaberechnung. Da der Atmel jedoch von seiner Hardware her nur mit ganzen Zahlen rechnen kann, werden diese Fließkommazahlen mittels Software "simuliert". Das funktioniert genauso exakt, als wenn der Atmel dafür eine Hardwareeinheit hätte. Aber die Berechnungen mit Fließkommaeinheiten sind nicht mehr in einem Takt durchzuführen. Damit werden Operationen mit Fließkommazahlen wesentlich langsamer als mit anderen Zahlen. Zur Berechnung von Winkelfunktionen werden gleich mehrere solcher Fließkommaoperationen durchgeführt, was zur Folge hat, das diese Berechnungen ebenfalls langsam sind. Ob das nun für deine Anwendung evtl. doch noch schnell genug ist, musst du ausprobieren. Um die mathematischen Funktionen nutzen zu können, musst du in dein Programm die Kopfdatei "math.h" einbinden (#include "math.h") Dann stehen dir folgende Befehle zur verfügung: Functions • double cos (double x) • double fabs (double x) • double fmod (double x, double y) • double modf (double value, double iptr) • double sin (double x) ATTR CONST • double sqrt (double x) ATTR CONST • double tan (double x) ATTR CONST • double floor (double x) ATTR CONST • double ceil (double x) ATTR CONST • double frexp (double value, int exp) • double ldexp (double x, int exp) • double exp (double x) • double cosh (double x) • double sinh (double x) • double tanh (double x) • double acos (double x) • double asin (double x) • double atan (double x) • double atan2 (double y, double x) • double log (double x) • double log10 (double x) • double pow (double x, double y) • int isnan (double x) • int isinf (double x) • double square (double x) • double inverse (double) Einige Funktionen ergeben sich bereits aus dem Namen. Die komplette Dokumentation zu diesen Funktionen findest du in der Dokumentation zur avrlibc, die mit WinAVR mit kommt. Wenn WinAVR installiert ist, findest du die Datei im Anstallationsordner im Unterordner "doc/avr-lbc". Im PDF werden Die Funktionen im Kapitel 5.12 ab Seite 31 beschrieben. Sollten die Funktionen für deine Anwendung zu langsam sein, gibt es noch die Möglichkeit, eine eigene Funktion mit einer Lookuptable zu verwenden. Das geht im Groben so, dass du dir überlegst wie genau du die Berechnung benötigst und dann so viele "Ergebnisse" wie für die Genauigkeit notwendig sind, in eine Feldvariable speicherst. Dann baust du dir eine Funktion, die je nach Wert, der übergeben wird, das richtige Feld der Feldvariable zurück gibt, oder besser, den Wert des Feldes. Das könnte zum Beispiel so aussehen: //Gibt den Wert des Sinus mal 100 aus. So dass er im Programm für Festkommarechnungen genutzt werden kann. int sinus(int winkel) { int LUT[] = {0, 17, 34, 50, 64, 77, 87, 94, 98, 100, 98, 94, 87, 77, 64, 50, 34, 17, 0, -17, -34, -50, -64, -77, -87, -94, -98, -100, -98, -94, -87, -77, -64, -50, -34, -17, 0}; int wert = 0; winkel /= 10; while (winkel > 36) winkel -= 36; while (winkel < 0) winkel += 36; wert = LUT[winkel]; return wert; } Damit man mit den Werten rechnen kann, werden sie mal 100 gerechnet. Das bedeutet, dass der Rückgabewert 17 eigentlich dem Wert 0,17 entspricht. Aber 17 kann der Atmel wesentlich schneller verarbeiten, als 0,17. Und wenn man nach der Berechnung im Hauptprogramm das Ergebnis wieder durch 100 teilt, hat man ebenfalls wieder das richtige Ergebnis. Grüße Thomas |
|||
|
Nachrichten in diesem Thema |
Rechenfunktionen des Kr-Mega - Frederik.Ebert - 13.01.2008, 11:30
RE: Rechenfunktionen des Kr-Mega - thomas - 16.01.2008 11:37
RE: Rechenfunktionen des Kr-Mega - Frederik.Ebert - 27.01.2008, 17:30
RE: Rechenfunktionen des Kr-Mega - thomas - 01.02.2008, 11:36
|
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste