6189|17

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430中开根号和除法出大问题。。。 [复制链接]

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中实现开根号和复杂些的数学运算。。。。。。

1.jpg (89.5 KB, 下载次数: 0)

输入直流电 很好

输入直流电 很好

2.jpg (99.34 KB, 下载次数: 0)

加了除法/k3 波动

加了除法/k3 波动

3.jpg (92.88 KB, 下载次数: 0)

加了sqrt 完全乱了

加了sqrt 完全乱了

最新回复

你好,请问之后减少定义的变量,sqrt函数就能够正常计算了是吗?   详情 回复 发表于 2023-3-29 10:00
 
点赞 关注

回复
举报

19

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
可能说的不是特别清楚 我想表达的意思就是  开根号和除法 是不是msp430 做不了导致程序出乱,可以的话我会把程序附上

点评

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

回复

396

帖子

5

TA的资源

纯净的硅(中级)

板凳
 
爱就一个字 发表于 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
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

4
 
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
 
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

5
 
Ix是啥

点评

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

回复

396

帖子

5

TA的资源

纯净的硅(中级)

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

可以先试一试开方的算术运算,写个简单的开方式子,调试下看看结果对着没。。你这个程序说实话一时半会不好理解。。在我印象中,应该没问题。
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

7
 

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

回复

19

帖子

0

TA的资源

一粒金砂(中级)

8
 
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
 
 
 

回复

384

帖子

2

TA的资源

纯净的硅(初级)

9
 
建议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

 
 

回复

1181

帖子

0

TA的资源

五彩晶圆(初级)

10
 
明白楼主的意思了,先是AD采样数据经过一段算法后DA输出,结果波形乱了,个人感觉不应该是sqrt算法的问题,
 
 
 

回复

396

帖子

5

TA的资源

纯净的硅(中级)

11
 
爱就一个字 发表于 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
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

1080

帖子

2

TA的资源

五彩晶圆(中级)

12
 
估计运算精度不够。。。。。。。。
 
 
 

回复

5015

帖子

13

TA的资源

裸片初长成(初级)

13
 
做算术处理建议使用数学库,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工程师炼成记》作者之一
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

14
 
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)  
堆栈溢出了 这种情况你遇到过没

 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

15
 
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
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

16
 
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)  
堆栈溢出了 这种情况版主您遇到过没


 
 
 

回复

396

帖子

5

TA的资源

纯净的硅(中级)

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

我以前遇到这种问题的时候是因为变量定义太多了。。
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

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

你好,请问之后减少定义的变量,sqrt函数就能够正常计算了是吗?

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表