社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 2405|回复: 16

[讨论] msp430中开根号和除法出大问题。。。

[复制链接]

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-5-7 23:01:48 | 显示全部楼层 |阅读模式
msp430 ADC12进行双通道重复采样,采用定时器中断采样,然后对采样数据进行处理,DAC0832输出,我试验了 ADC采样和DAC输出,两者可以,对采样的波形可以误差很小的DAC复原,

然后问题来了,我将采样数据x和y进行一些算法的处理,输出波形完全乱了。(图3)只添加下面的语句
  其中k1 k2 k3 是系数,x y是双通道采样值,sqrt是math.h中的函数

    Fx=(-k1*y) -(k2*d_x);
    if(Fx>0)  { Ix=(int)sqrt(Fx*x*x/k3);}
      else   { Ix=(int)sqrt(-Fx*x*x/k3);}


情况1当没有   if(Fx>0)  { Ix=(int)sqrt(Fx*x*x/k3);}
                      else   { Ix=(int)sqrt(-Fx*x*x/k3);}
          输出的x y波形如图1,波形很好,也很稳定;
情况2 然后我把sqrt去掉 if(Fx>0)  { Ix=(int)(Fx*x*x/k3);}
                                       else   { Ix=(int(-Fx*x*x/k3);}
      输出的x y波形波形如图2,波形开始震荡,不稳定;
情况3 然后我把除法和开根号都去掉 if(Fx>0)  { Ix=(int)(Fx*x*;}
                                                        else   { Ix=(int(-Fx*x*x);}
      输出的x y波形波形如图1了,很好很稳定
分析其原因,我觉得是msp430 单片机对 除法和开根号没有办法处理,导致程序跑偏了。(我输入的是两路直流电,测的是DAC0832两路输出)
不知道各位怎么看次问题,如何在430中实现开根号和复杂些的数学运算。。。。。。
此帖出自MSP430论坛

输入直流电 很好

输入直流电 很好

加了除法/k3 波动

加了除法/k3 波动

加了sqrt 完全乱了

加了sqrt 完全乱了

回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-7 23:03:21 | 显示全部楼层
可能说的不是特别清楚 我想表达的意思就是  开根号和除法 是不是msp430 做不了导致程序出乱,可以的话我会把程序附上

点评

把问题阐述得再清晰点。  详情 回复 发表于 2014-5-7 23:42

回复

使用道具 举报

419

TA的帖子

5

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2014-5-7 23:42:06 | 显示全部楼层
爱就一个字 发表于 2014-5-7 23:03
可能说的不是特别清楚 我想表达的意思就是  开根号和除法 是不是msp430 做不了导致程序出乱,可以的话我会 ...

把问题阐述得再清晰点。

点评

嗯! ADC12 采样进来是x y两个值,为了查看ADC和DAC正常工作,我采用DAC0832双缓冲输出, 我DAC12采用定时器中断触发,采样频率为1KHz.x,y定义为全局变量// ADC中断服务程序 #pragma vector=TIMERA0_VECTOR __int  详情 回复 发表于 2014-5-8 09:09
终于逐渐稳定下来了,,有时间可以更新这里面的内容了。

回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-8 09:09:00 | 显示全部楼层
jqh_111 发表于 2014-5-7 23:42
把问题阐述得再清晰点。

嗯! ADC12 采样进来是x y两个值,为了查看ADC和DAC正常工作,我采用DAC0832双缓冲输出,
我DAC12采用定时器中断触发,采样频率为1KHz.x,y定义为全局变量//        ADC中断服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{ADC12CTL0&=~ENC;
x=ADC12MEM0>>4;      //读取ADC转换值,存入暂存区
y=ADC12MEM1>>4;
ADC12CTL0|=ENC+ADC12SC;  }//DAC0832是八位精度,右移四位

在主函数中用while(1){   (这前面有对x y的处理算法,因调试省去先)       DAC(x,y);}//DAC(a,b)是DAC转化子函数
此时输出波形很稳定,如图一。
注:sqrt()是math.h中的函数
然后问题来了,就像上文描述一样,
当while(1)
{  Fx=(-k1*y) -(k2*x);
    if(Fx>0)  { Ix=(int)sqrt(Fx*x*x/k3);}    
      else   { Ix=(int)sqrt(-Fx*x*x/k3);}
 DAC(x,y);} 波形完全乱了如图3,其实对x,y值没影响。中间虽然用到x,y。但是x,y值并没变,还是原来采样值(我采的是直流)
当 while(1)
{ Fx=(-k1*y) -(k2*x);
    if(Fx>0)  { Ix=(int)(Fx*x*x/k3);}    
      else   { Ix=(int)(-Fx*x*x/k3);}
 DAC(x,y)};
}     我将sqrt去掉,波形有好转,但是波动有点大,如图2
当while(1)
{ Fx=(-k1*y) -(k2*x);
    if(Fx>0)  { Ix=(int)(Fx*x*x);}    
      else   { Ix=(int)(-Fx*x*x);}
 DAC(x,y)};
}  我继续将除法去掉,只剩乘法,这是波形良好图1
所以综上现象,我个人的结论是 msp430对sqrt无法处理,对除法的处理也不够灵活;导致输出波形错误或者不稳定
不知道这样解释清楚了没??


点评

可以先试一试开方的算术运算,写个简单的开方式子,调试下看看结果对着没。。你这个程序说实话一时半会不好理解。。在我印象中,应该没问题。  详情 回复 发表于 2014-5-8 13:43

回复

使用道具 举报

2579

TA的帖子

19

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2014-5-8 09:36:19 | 显示全部楼层
Ix是啥

点评

Ix是我算法中的一个变量,由输入的x,y决定,你看到的程序中 他对x,y没影响  详情 回复 发表于 2014-5-8 18:19
    懒得很

回复

使用道具 举报

419

TA的帖子

5

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2014-5-8 13:43:08 | 显示全部楼层
爱就一个字 发表于 2014-5-8 09:09
嗯! ADC12 采样进来是x y两个值,为了查看ADC和DAC正常工作,我采用DAC0832双缓冲输出,
我DAC12采用定 ...

可以先试一试开方的算术运算,写个简单的开方式子,调试下看看结果对着没。。你这个程序说实话一时半会不好理解。。在我印象中,应该没问题。
终于逐渐稳定下来了,,有时间可以更新这里面的内容了。

回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-8 18:19:49 | 显示全部楼层

Ix是我算法中的一个变量,由输入的x,y决定,你看到的程序中 他对x,y没影响

回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-8 19:59:29 | 显示全部楼层
jqh_111 发表于 2014-5-8 13:43
可以先试一试开方的算术运算,写个简单的开方式子,调试下看看结果对着没。。你这个程序说实话一时半会不 ...

我今天查阅了不少资料,http://blog.sina.com.cn/s/blog_6cd2030b01018fp8.html   这篇文章讲的挺好,版主可以小瞧一下,

本来就认定是sqrt函数的 问题了 可是我又进一步试验,按照版主的方法去验证sqrt()
给定数值while(1)
{
   int a,b,m,n,t,r;
   t=sqrt(4000000);
   r=t/2;
   a=t>>4;
   b=r>>4;   
DAC(a,b);
}
结果DAC输出也是对了,这样子就排除了单片机无法运行sqrt的可能性,可能是单片机运行sqrt()会消耗一定时间(相对加乘法),然后导致与中断时序发生冲突(个人猜想)。
我是这样考虑流程图的,
定时器中断里做采样处理,每次进入中断保存采样值,16次得到平均值,即x,y(全局变量);
while(1){}主循环里做 对x,y的算法处理,也就是说 主循环一直在对 x,y做运算,当16次中断发生后在主循环里更新x,y一次;
这种逻辑是不是有问题,版主如果做这样的程序会怎么考虑,双中断?????一个中断得到x,y,另一个中断算法处理x,y,while里只做DAC?????
麻烦楼主和各位指导一下,这几天调程序很费神。。。谢谢

点评

作开方,除法,三角这种运算,你把数据类型换成浮点型试试。。  详情 回复 发表于 2014-5-9 14:01

回复

使用道具 举报

423

TA的帖子

2

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2014-5-9 08:59:14 | 显示全部楼层
建议LZ先进行简单的测试,比如仅仅计算一个数的开方。
用软件仿真看看计算结果精度,对比汇编程序看是否有问题。 看看有没有溢出、精度是否有损失,
Ix=(int)sqrt(-Fx*x*x/k3);   x*x 范围有多大?x的数据是怎样的?是否溢出? sqrt 函数使用时间长度如何?

个人感觉,一般情况下,单片机C程序是支持数学函数的(未验证,仅是猜测)。

点评

这个不是sqrt的问题 我已经验证了,我今天买的jtag口到了 用硬件仿真, Mon May 12, 2014 20:17:48: The stack pointer for stack 'Stack' (currently Memory:0x9A4) is outside the stack range (Memory:0x9B0 to  详情 回复 发表于 2014-5-12 20:23
I-Love-MCU

回复

使用道具 举报

907

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2014-5-9 10:47:45 | 显示全部楼层
明白楼主的意思了,先是AD采样数据经过一段算法后DA输出,结果波形乱了,个人感觉不应该是sqrt算法的问题,

回复

使用道具 举报

419

TA的帖子

5

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2014-5-9 14:01:16 | 显示全部楼层
爱就一个字 发表于 2014-5-8 19:59
我今天查阅了不少资料,http://blog.sina.com.cn/s/blog_6cd2030b01018fp8.html   这篇文章讲的挺好,版 ...

作开方,除法,三角这种运算,你把数据类型换成浮点型试试。。

点评

这个不是sqrt的问题 我已经验证了,浮点也没有效果我今天买的jtag口到了 用硬件仿真, Mon May 12, 2014 20:17:48: The stack pointer for stack 'Stack' (currently Memory:0x9A4) is outside the stack range (M  详情 回复 发表于 2014-5-12 20:24
终于逐渐稳定下来了,,有时间可以更新这里面的内容了。

回复

使用道具 举报

1135

TA的帖子

2

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2014-5-11 15:03:38 | 显示全部楼层
估计运算精度不够。。。。。。。。
响应春哥号召《全民DIY ACDC实验电源》正在进行中。。。

回复

使用道具 举报

6057

TA的帖子

13

TA的资源

裸片初长成(初级)

Rank: 10Rank: 10Rank: 10

荣誉会员勋章

发表于 2014-5-11 15:34:04 | 显示全部楼层
做算术处理建议使用数学库,TI前段时间上线了一个优化过的数学库。16位的MCU本身CPU的处理能力很有限,乘除都不拿手,所以出现算术处理没有做过来的情况很普遍,乘法和除法可以借用乘法器实现可以提高效率

点评

我用的是C语言的math.h 不过版主 这个不是sqrt的问题 我已经验证了,我今天买的jtag口到了 用硬件仿真, Mon May 12, 2014 20:17:48: The stack pointer for stack 'Stack' (currently Memory:0x9A4) is outside  详情 回复 发表于 2014-5-12 20:24
《MCU工程师炼成记》作者之一

回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-12 20:23:18 | 显示全部楼层
upc_arm 发表于 2014-5-9 08:59
建议LZ先进行简单的测试,比如仅仅计算一个数的开方。
用软件仿真看看计算结果精度,对比汇编程序看是否有 ...

这个不是sqrt的问题 我已经验证了,我今天买的jtag口到了  用硬件仿真,
Mon May 12, 2014 20:17:48: The stack pointer for stack 'Stack' (currently Memory:0x9A4) is outside the stack range (Memory:0x9B0 to Memory:0xA00)  
堆栈溢出了 这种情况你遇到过没


回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-12 20:24:03 | 显示全部楼层
jqh_111 发表于 2014-5-9 14:01
作开方,除法,三角这种运算,你把数据类型换成浮点型试试。。

这个不是sqrt的问题 我已经验证了,浮点也没有效果我今天买的jtag口到了  用硬件仿真,
Mon May 12, 2014 20:17:48: The stack pointer for stack 'Stack' (currently Memory:0x9A4) is outside the stack range (Memory:0x9B0 to Memory:0xA00)  
堆栈溢出了 这种情况版主遇到过没


点评

我以前遇到这种问题的时候是因为变量定义太多了。。  详情 回复 发表于 2014-5-12 20:44

回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-5-12 20:24:55 | 显示全部楼层
wstt 发表于 2014-5-11 15:34
做算术处理建议使用数学库,TI前段时间上线了一个优化过的数学库。16位的MCU本身CPU的处理能力很有限,乘除 ...

我用的是C语言的math.h
不过版主 这个不是sqrt的问题 我已经验证了,我今天买的jtag口到了  用硬件仿真,
Mon May 12, 2014 20:17:48: The stack pointer for stack 'Stack' (currently Memory:0x9A4) is outside the stack range (Memory:0x9B0 to Memory:0xA00)  
堆栈溢出了 这种情况版主您遇到过没



回复

使用道具 举报

419

TA的帖子

5

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2014-5-12 20:44:52 | 显示全部楼层
爱就一个字 发表于 2014-5-12 20:24
这个不是sqrt的问题 我已经验证了,浮点也没有效果我今天买的jtag口到了  用硬件仿真,
Mon May 12, 201 ...

我以前遇到这种问题的时候是因为变量定义太多了。。
终于逐渐稳定下来了,,有时间可以更新这里面的内容了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-22 09:05 , Processed in 0.595766 second(s), 18 queries , Redis On.

快速回复 返回顶部 返回列表