Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Nachrichten in diesem Thema
RE: Rechenfunktionen des Kr-Mega - thomas - 16.01.2008 11:37

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste

Kontakt | Krause Robotik | Nach oben | Zum Inhalt | Archiv-Modus | RSS-Synchronisation