Hallo,
> Versuch es doch mal mit einer Taylorreihe.
Die Taylorreihe habe ich mir schon auf der Wikipedia angesehen, nur ich
glaube diese Berechnung dauert auf einem AVR recht lange...
>> -90.00° bis +90.00° in 0.01° Schritten.
>
> Dann wären es als LUT aber auch schon 180°/0,01° = 18.000 Werte!
> arctan(pi/2) - artan(-pi/2)= 2,00 also müsste ein Byte pro Wert reichen,
> dann wären es 18kByte.
Eine Lookup Tabelle von 18kb wäre ja noch im Rahmen, ich habe sowieso
recht viel Flash übrig...
> john schrieb:
>> Es kommt vor allem auf die
>> Schnelligkeit an,
>
> Nenn doch mal ne Hausnummer: 1ms 10ms 1µs ?
Das ganze (und noch einiges mehr) muss mit ca 400Hz laufen, das heißt
ich habe ca 2.5ms zeit. Aber wie gesagt muss da noch einiges mehr
berechnet werden... Takt des AVR ist 20MHz
Ich habe gerade mal auf Basis der Nährungsfunktionen in der Wikipedia
eine kurze Funktion geschrieben:
1 | int16_t _arctan(double x)
|
2 | {
|
3 | if(-1 <= x && x <= 1) // |x| <= 1
|
4 | {
|
5 | return (int16_t)((57.2958*x) / (0.28*x*x + 1));
|
6 | }
|
7 | else if(x > 1) // x > 1
|
8 | {
|
9 | return (int16_t)(90 - (57.2958*x) / (x*x + 0.28));
|
10 | }
|
11 | else // x < 1
|
12 | {
|
13 | return (int16_t)(-(90 - (57.2958*x) / (x*x + 0.28)));
|
14 | }
|
15 | }}
|
16 | }
|
Ganz um die Fließkommazahlen komme ich so aber nicht herum...
Wie finde ich heraus, wie viele Takte die Funktion benötigt?
Viele Grüße