打印
[AVR单片机]

紧急求助~,AVR单片机中正弦函数的算法

[复制链接]
4202|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whu_dhf81|  楼主 | 2010-6-11 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾:
    为什么我在AVR单片机中使用sin函数算出来的值是不正常的,而用cos函数算出来的值都是正常的,我用的单片机是atmega8l,希望大家帮忙解决一下,应该可以排除数据类型的问题,因为我把sin换成cos,算出来的值就是对的。要是用sin的话,就是错的,除了sin(3.1416/2)是正常的之外,sin其他的值基本都是算出来不对的。

相关帖子

沙发
jimoxinl| | 2010-6-11 21:57 | 只看该作者
好奇怪啊,怎么会这样呢

使用特权

评论回复
板凳
huamunv| | 2010-6-11 22:19 | 只看该作者
具体说说,在做什么

使用特权

评论回复
地板
wuzhaolie| | 2010-6-11 22:23 | 只看该作者
LZ可以把这部分程序贴出来看看,感觉好奇怪啊

使用特权

评论回复
5
whu_dhf81|  楼主 | 2010-6-12 08:56 | 只看该作者
...............
unsigned int i;
float data0 = 0,data1 = 0,data_Volt[250];
float data_adc = 0;
while(1)
{
for(i=1;i<250;i++)
{
        data_adc = Get_Conversion_Result();
       data_Volt[i] = Calc_WeightByVolt(data_adc);
       data0 += (data_Volt[i]*(sin((6.2832*i)/250)*2/250));
       printf("data0:%d\n",(unsigned int)data0*1000);
      data1 += (data_Volt[i]*(cos((6.2832*i)/250)*2/250));
      printf("data1:%d\n",(unsigned int)data1*100);                       
}
..........
}

上述程序中data0的数据一直不对,而data1的数据跟手动计算出来的是一样的~请大家帮忙分析一下

使用特权

评论回复
6
aresc| | 2010-6-12 10:23 | 只看该作者
有可能是累加结果再乘以1000以后溢出unsigned int的范围了。

另一个疑问累加后data0会不会有可能是负值,对负值直接进行unsigned int是你想要的吗?

使用特权

评论回复
7
whu_dhf81|  楼主 | 2010-6-12 16:05 | 只看该作者
关键是我后来测试的时候,我没有累计250次,我直接累计了2次,结果还是错误的~

使用特权

评论回复
8
aresc| | 2010-6-12 20:39 | 只看该作者
1. 你说sin(pi/2)是对的,其他都是错的,是单独只比较sin(x)的吗?比如sin(pi/3), sin(pi/6), sin(pi/4)?

可以用VC产生一个sin(PI* n / 256), n = 0,1,...,255 的表存成数组,然后用你的sin函数产生相同的表,比较每一个的误差大小, 如果这样比较都有问题,那估计是你的sin(x)确实有问题,你也不用在这上面花时间了。

2. 如果sin(x)真有问题,可以自己写一个sin(x),比如 sin(x) = |(1-(cos(x))^2)^1/2|.
或者通过级数展开 sin(x)=x-x^3/3!+x^5/5!-x^7/7!+x^9/9!-x^11/11!.........

使用特权

评论回复
9
ershisi| | 2010-6-12 22:37 | 只看该作者
不如用MATLAB,sin(x)还得自己整算法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

26

帖子

1

粉丝