打印

关于一个AD采样后的数据转换的问题

[复制链接]
20124|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jaylondon|  楼主 | 2010-1-3 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人还是个菜鸟。
我用一块10位AD采样
然后把采样值通过发送给PC
原先程序写的是将高低位分开分别发送
//------------------------------------
// sendtoPC:通过UART发送转换结果到PC
//-------------------------------------
void sendtoPC(void)      
{  TI=0;      
  SBUF=  AD0DAT0L;   //发送结果高位,即9:2
while (!TI);     
TI=0;      
SBUF=AD0DAT0R;     //发送结果低位,即7:0  
while (!TI);
}

这一步可以实现
接下来我想改变这一部分程序让单片机发送 实测值 即为实测多少电压。
修改程序如下
//------------------------------------
// sendtoPC:通过UART发送转换结果到PC
//-------------------------------------
void sendtoPC(void)      
{ double  AD0DAT0;
TI=0;      
AD0DAT0=AD0DAT0L*256+AD0DAT0R;     //高低位结合
SBUF=  AD0DAT0*3.3/1023.0;    //将组合后的数字处理为真实电压后 SBUF 发送      //问题此时的值是否大于8位?
  
while (!TI);     
TI=0;      
}

这样一来发送结果好像就不正确了。
希望大家帮我看看 怎样才能使单片机发送实测值。

我对AD部分一直有些没有解决的疑问:
1.如果单片机采样大于8位时,比如10位 需要2个寄存器,是否寄存器L里一定是高位,寄存器R里一定是低位?即第一个寄存器里放的是高八位,第二个寄存器里放的是低二位。数据是左对齐的。
2.如果要将两个寄存器里的数据组成一个完整的数据,公式为  完整数据=寄存器1*256+寄存器2 ?
3.还是举个例子说明吧。 比如采样数据是 1023 那么第一个寄存器里为 1111 1111
第二个寄存器为 1100 0000 是这样么?
4.如果该AD基准电压为3.3V  那么实测电压的计算公式是否为 3.3V*a(采到得10位数据)/1023  ?

说的我自己都有点晕了,大概就这个意思吧。 大家勉强看得懂的话,帮我解答下吧。
非常感谢

相关帖子

沙发
原野之狼| | 2010-1-3 23:11 | 只看该作者
1
数据对齐问题请看数据手册
2
AD0DAT0=AD0DAT0L*256+AD0DAT0R;     //高低位结合
SBUF=  AD0DAT0*3.3/1023.0;
计算结果直接赋值给SBUF 数据类型都不一样 默认强制转换后丢失了小数部分数据
解决方法一:发送两字节的AD值给PC处理 PC端需要知道参考电压
解决方法二:格式化字符串后发给PC机  
解决方法三:根据精度要求,然后放大测量值乘整数,例如实测2.52V,那么可以发送252给PC,当然这个协议必须说明这一点

使用特权

评论回复
板凳
wgj_fly| | 2010-1-4 13:03 | 只看该作者
2楼说的有理,在发送数据的时候,可以要将数据格式化之后,在进行发送。

使用特权

评论回复
地板
jaylondon|  楼主 | 2010-1-4 20:54 | 只看该作者
啥叫数据格式化 能否给了例子说明下?

使用特权

评论回复
5
原野之狼| | 2010-1-5 00:08 | 只看该作者
知道printf不 它就是用来进行格式化的

使用特权

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

本版积分规则

9

主题

87

帖子

0

粉丝