[PIC®/AVR®/dsPIC®产品] PIC单片机AD结果处理问题求指教

[复制链接]
 楼主| 布丁奶茶 发表于 2016-3-24 14:54 | 显示全部楼层 |阅读模式
用的16F877A的单片机,对AD采样结果的要求是:电压值保留精确到两位小数点,并将结果的转化为ASC码通过串口发送给上位机!
现在遇到的问题是
1:如何确保结果精确到小数点后两位
2:如何将电压值转换为ASC码?
例如,我的基准电压是5V,模拟输入3.3V,我应该怎么做才能达到上面的要求?
希望大神们帮忙看看,第一次用AD,不熟悉啊
 楼主| 布丁奶茶 发表于 2016-3-24 15:04 | 显示全部楼层
通信协议定的电压值必须占5个字节
NE5532 发表于 2016-3-24 15:19 | 显示全部楼层
比如你的AD是8位,量化就是255级,参考电压5V,除以255,每个LSB就是0.02V,这个明显不够2位,所以你至少需要10位的AD。

根据上面的算法,算出输入电压值,至于转ASCII码,你先跟需要这样转的人确认一下,这样会造成数据量变大,运算变慢。确实要转的话,用除法取出每一个十进制位上的数,转成BCD码,然后查ASCII码表,加偏移量转到ASCII。你的5个字节里有一个是小数点吧?
 楼主| 布丁奶茶 发表于 2016-3-24 15:49 | 显示全部楼层
NE5532 发表于 2016-3-24 15:19
比如你的AD是8位,量化就是255级,参考电压5V,除以255,每个LSB就是0.02V,这个明显不够2位,所以你至少需 ...

感谢版主!对的,我用的就是10位的AD,量化是1023.我的基准电压5v。我通信协议上要发的是实际电压,中间是需要计算的。我现在不明白的是:假如我要发给上位机的电压值是12.10V(也就是0x31,0x32,...),我要怎么得到ASCII码?我的电压值定义为浮点型就可以了吗?在存AD的转换结果时需要进行什么操作?
NE5532 发表于 2016-3-24 15:50 | 显示全部楼层
你把数据扩大100倍来算,整形就可以解决了,不用浮点数,浮点计算慢。
 楼主| 布丁奶茶 发表于 2016-3-24 15:58 | 显示全部楼层
NE5532 发表于 2016-3-24 15:50
你把数据扩大100倍来算,整形就可以解决了,不用浮点数,浮点计算慢。

还是不太明白,能举个例子吗?谢谢了!
QQ826220679 发表于 2016-4-1 01:16 | 显示全部楼层
//不要用浮点数:

//把实际值扩大100倍,手动在相应位置加上点


//发送的0123456789的ASCII码
const unsigned char TX_num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,}; //0、1、2、3、4、5、6、7、8、9的ASCII码

//小数点. 的ASCII码

#define dian      0x2E //“.”ASCII码

//比如你要转换a1为ASCII码


void BCD_1234(unsigned int a1) //转换编码
{
        unsigned char n1= 0, n2= 0, n3= 0;
        while(a1 >= 10000)
        a1 -= 10000;
        while(a1 >= 1000)
        {
                a1 -= 1000;
                ++n1;
        }
        while(a1 >= 100)
        {
                a1 -= 100;
                ++n2;
        }
        while(a1 >= 10)
        {
                a1 -= 10;
                ++n3;
        }

        //TX0 到TX3 是你要发送的数值的字节数

        TX0 = TX_num[ m1 ]; //十位
        TX1 = TX_num[ m2 ]; //个位
        TX3 = dian;         //小数点
        TX2 = TX_num[ m3 ]; //十分位
        TX3 = TX_num[ a2 ]; //百分位

}


QQ826220679 发表于 2016-4-1 01:18 | 显示全部楼层
本帖最后由 QQ826220679 于 2016-4-1 01:22 编辑


这一段错了,这样写,
        //TX0 到TX4 是你要发送的数值的字节数
        TX0 = TX_num[ m1 ]; //十位
        TX1 = TX_num[ m2 ]; //个位
        TX2 = dian;         //小数点
        TX3 = TX_num[ m3 ]; //十分位
        TX4 = TX_num[ a1 ]; //百分位

能看明白吗?

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

本版积分规则

44

主题

180

帖子

1

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