Forum: Mikrocontroller und Digitale Elektronik STM32F0 Arctan Berchnung


von Markus H. (mhspecial)


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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

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.

von Markus H. (mhspecial)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.