Ich habe ein kleines Problem mit einer Winkelberechnung.
Der Winkelwert wird für eine Feld orientierte Regelung benötigt. Dabei
liegen ADC-Werte von einem Sin/Cos-Geber an.
Bisher hab ich die Winkelberechnung mit jener Funktion realisiert,
welche ich vor einiger Zeit einem anderem Forum entdeckt und etwas
vereinfacht hatte.
1 | const unsigned char atan[64] = {1,1,2,3,4,5,6,7,8,9,9,10,11,12,13,14,15,15,16,
| 2 | 17,18,19,19,20,21,22,23,23,24,25,26,26,27,28,28,29,30,31,31,32,33,33,34,34,35,
| 3 | 36,36,37,37,38,38,39,40,40,41,41,42,42,43,43,44,44,45,45};
| 4 |
| 5 | uint16_t ArcTan(int16_t dY, int16_t dX)
| 6 | {
| 7 | uint16_t degree;
| 8 |
| 9 | if (dX < 0)
| 10 | {
| 11 | degree = 180;
| 12 | dX = -dX;
| 13 | }
| 14 | if (dY < 0)
| 15 | {
| 16 | degree = 360;
| 17 | dY = -dY;
| 18 | }
| 19 |
| 20 | if (dY < dX)
| 21 | {
| 22 | degree -= atan[(dY * 64) / dX];
| 23 | }
| 24 | else if (dX < dY)
| 25 | {
| 26 | degree -= 90 - atan[(dX * 64) / dY];
| 27 | }
| 28 | else
| 29 | {
| 30 | if (dX != 0)
| 31 | {
| 32 | degree -= 45;
| 33 | }
| 34 | else
| 35 | {
| 36 | return 0;
| 37 | }
| 38 | }
| 39 | return degree;
| 40 | }
|
Das Problem ist jedoch die Abarbeitungszeit auf Grund der Division.
Bisher sind es ca. 12,5µs. Also bei 48 Mhz rund 600 Cycles.
Gibt es irgendeinen Ansatz wie man diese Zeit halbieren könnte?
Es wären auch 2° Schritte genau genung.
Markus Horn schrieb:
> Bisher sind es ca. 12,5µs. Also bei 48 Mhz rund 600 Cycles.
600 Takte?
Für eine 16Bit/16Bit Division?
Kommt mir heftig viel vor für eine 32 Bit CPU.
Markus Horn schrieb:
> Gibt es irgendeinen Ansatz wie man diese Zeit halbieren könnte?
> Es wären auch 2° Schritte genau genung.
Bei 2° Auflösung wären das selbst bei einem Vollkreis nur 180 Werte.
In dem Fall würde ich zur Tabelle raten!
Schneller geht's nicht :-)
Chris D.
Chris D. schrieb:
> Markus Horn schrieb:
>> Gibt es irgendeinen Ansatz wie man diese Zeit halbieren könnte?
>> Es wären auch 2° Schritte genau genung.
>
> Bei 2° Auflösung wären das selbst bei einem Vollkreis nur 180 Werte.
>
> In dem Fall würde ich zur Tabelle raten!
>
> Schneller geht's nicht :-)
>
> Chris D.
Wäre nicht eine 2-dim Tabelle ebenso ein zeitaufwändiges Geschäft?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|