3474|6

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

小弟新学AD数据处理有问题求助 [复制链接]

部分程序如下:(10ad)
void Get_ad_result(void)
{        
        unsigned char i;
        unsigned int a_ad=0,ad_sum=0;
        unsigned long ad_val=0,ad_val_temp=0;
        unsigned char AD_Result[7];
        for (i=0;i<10;i++)
        {
                AD0INT = 0;
                ADC0L = 0;
                ADC0H = 0;
                AD0BUSY = 1;
                while (!AD0INT);
                AD0BUSY = 0;
                ad_sum = ad_sum + (ADC0H*256 + ADC0L);       
        }
        a_ad = ad_sum/10;     //程序至此一切OK,ad数据正确
        ad_val_temp = a_ad * 2440/1023;      此过程数据应该溢出,导致错误。但数据类型为long,
        ad_val = ad_val_temp;                        怎么还会溢出?还是其他错误?
        for (i=0;i<7;i++)
        {
                 AD_Result = ad_val % 10 + 0X30;
                 ad_val = ad_val / 10;
        }
}
准备想ad结果放大10倍处理。vref=2440mv,10位AD,请高手帮忙看看该如何修改。我定义为long。尝试逐次增加,2440*10计算OK,乘以100就数据不对。long型的数据够啊,我哪儿定义错了?
此帖出自51单片机论坛

最新回复

ad_val_temp =(long) a_ad * 2440/1023;   先类型转换再运算,否则进行的是16位乘除然后赋值给32位当然溢出了。   ad范围是0~1023,每刻度是1/1024,所以放大或缩小运算时应该除1024的,你再琢磨琢磨。。。   只要除数是2N编译器会把除法优化成右移。     [ 本帖最后由 huo_hu 于 2012-4-8 11:51 编辑 ]  详情 回复 发表于 2012-4-8 11:31
点赞 关注
 

回复
举报

535

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

回复 楼主 wangkuangs 的帖子

用的是什么芯片啊?米有说啊?
此帖出自51单片机论坛
 
 
 

回复

355

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

标题

先乘再除,前面最大可超过2的21次幂,你多少位的cpu?
2440/1024,不要1023一看就不对,可以约掉一部分简化成305/128再约估算12/5。这样肯定没问题了,整除你懂的,精度会更高
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

4
 

不瞒你说,我选用1023是因为我调试时,最大采样1023,也是为提高精度。

计算出来最大2440*1023=2496120

估计与单片机多少位有关系。

我现在采用小数计算ad_val = a_ad * 238.514173998(2440/1023*100),此方法到也可行。放大100是为了能够显示后面精确度。暂时可以使用,精度位校准试验

谢谢两位

请问我此方法可有什么问题?

此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 沙发 小小白 的帖子

C8051F340.主要是为了内部基准
此帖出自51单片机论坛
 
 
 

回复

355

帖子

0

TA的资源

纯净的硅(初级)

6
 

标题

从0到1023对吧,你前面采样数加1,除1024可以考虑用右移。你这里改用浮点数计算然后赋值取整,本身是在牺牲资源的基础上进行的。
个人不建议单片机上用浮点数,尽量规避,除非特殊要求。
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

7
 

ad_val_temp =(long) a_ad * 2440/1023;

 

先类型转换再运算,否则进行的是16位乘除然后赋值给32位当然溢出了。

 

ad范围是0~1023,每刻度是1/1024,所以放大或缩小运算时应该除1024的,你再琢磨琢磨。。。

 

只要除数是2N编译器会把除法优化成右移。

 

 

[ 本帖最后由 huo_hu 于 2012-4-8 11:51 编辑 ]
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表