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

#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;
/* 我的第一个 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算法。是经典算法。本人是做单片机的 这个用来求 模电流做闭环。控制电机恒流运行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值