STM32F0 Arctan Berchnung

#2982004
Lesenswert?

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.
#2982024
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren