天天看點

三角函數 求模 和 求角度算法

#include <stdio.h>

//x y 為Q8格式

//傳回模長 角度 由最後兩個變量傳回指針值

int my_atan5(int x, int y,int * AP,int *XianP)

{

const int angle[] = {11520, 6801, 3593, 1824, 916, 458, 229, 115, 57, 29, 14, 7, 4, 2, 1};

int i = 0,j;
int x_new, y_new;
int angleSum = 0;

if(y<0){
 y = -y; // 3 4
 j=1;
}
else{
      // 2 1
 j=0;
}

if(x<0){
 x = -x; // 2 3 
 if(j == 0)j=2;else j= 3;
}
else{
      // 1 4
 if(j == 0)j=1;else j= 4;
}

for(i = 0; i < 15; i++)
{
    if(y > 0)
    {
        x_new = x + (y >> i);
        y_new = y - (x >> i);
        x = x_new;
        y = y_new;
        angleSum += angle[i];
    }
    else
    {
        x_new = x - (y >> i);
        y_new = y + (x >> i);
        x = x_new;
        y = y_new;
        angleSum -= angle[i];
    }
}
           

x *= 155;

x = x>>8;

*AP = angleSum;

*XianP = j;

return x;

}

int main()

{

int a,b,c;

a = my_atan5((0<<8),(8<<8),&b,&c);

printf(“第二象區 加90度 第三象區加180度 第四區加270度-45度 = 11520\n模長Sq8 = %d\n角度Aq8 = %d\n象區 =%d\n”,a,b,c);

return 0;

}

https://c.runoob.com/compile/11 可以這個網站 驗證程式

程式中 角度用的是360度 Q8格式(實際值X256).由于int最大值 不能支援 360度 程式将所有度數控制在90度以内 實際度數按傳回的象區 補償上去然後格式轉換成大一點的類型 比如LONG型 這個算法是CORDIC算法。是經典算法。本人是做單片機的 這個用來求 模電流做閉環。控制電機恒流運作。

繼續閱讀