请各位帮忙分析下 功能一样的代码为什么写法不同结果会不同

[复制链接]
 楼主| a3724395 发表于 2017-7-23 13:15 | 显示全部楼层 |阅读模式
功能是:幅度是2--4的正弦波通过AD0832连接到单片机,要求读这个正弦波的峰值。
做法是:每5ms进行AD采样时读五次,去掉最大值和最小值剩下的三个取平均值,作为这一次的采样值;
采三次,如果第二次大于第一次和第三次,第二次就是峰值。

关键的是取平均值是这步,如果用下面这个算法proteus仿真就能读出峰值是 4。
sum=((pluse[0]+pluse[1]+pluse[2]+pluse[3]+pluse[4]-max-min)/3);
如果用下面分开写,峰值读出来是一点多,就不正确。
  sum=(pluse[0]+pluse[1]+pluse[2]+pluse[3]+pluse[4]);
  sum=sum-max-min;
  sum=sum/3;  

功能应该是一样的,为什么结果 会不一样呢
simonliu009 发表于 2017-7-23 13:53 | 显示全部楼层
本帖最后由 simonliu009 于 2017-7-23 13:55 编辑

建议两个算法都打印输出一下每个变量,包含pluse[x]和max,min
看看是否有不同还有三次平均值取最大值的算法是否有差别啊,都需要看一下。
mcu5i51 发表于 2017-7-23 14:36 | 显示全部楼层
好像你说的不正确的算法是对的
dirtwillfly 发表于 2017-7-23 20:04 | 显示全部楼层
追踪一下sum的变化,或者看看生成的汇编代码
bb632639228 发表于 2017-7-24 11:54 | 显示全部楼层
估计是数据类型的问题,你可以将sum改为更宽的数据类型试试。
yichunshan 发表于 2017-7-24 13:36 | 显示全部楼层
数据类型是什么?
 楼主| a3724395 发表于 2017-7-25 22:39 | 显示全部楼层
bb632639228 发表于 2017-7-24 11:54
估计是数据类型的问题,你可以将sum改为更宽的数据类型试试。

高手啊,本来是char,改成int就好了,谢谢
难道是“sum=(pluse[0]+pluse[1]+pluse[2]+pluse[3]+pluse[4]);”这句超出了?还是程序认为可能超出所以乱码?
linqing171 发表于 2017-7-26 16:04 | 显示全部楼层
c语言标准有个术语叫做整形提升。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

134

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部