打印
[PIC®/AVR®/dsPIC®产品]

PIC单片机AD结果处理问题求指教

[复制链接]
933|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
布丁奶茶|  楼主 | 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的转换结果时需要进行什么操作?

使用特权

评论回复
5
NE5532| | 2016-3-24 15:50 | 只看该作者
你把数据扩大100倍来算,整形就可以解决了,不用浮点数,浮点计算慢。

使用特权

评论回复
6
布丁奶茶|  楼主 | 2016-3-24 15:58 | 只看该作者
NE5532 发表于 2016-3-24 15:50
你把数据扩大100倍来算,整形就可以解决了,不用浮点数,浮点计算慢。

还是不太明白,能举个例子吗?谢谢了!

使用特权

评论回复
7
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 ]; //百分位

}


使用特权

评论回复
8
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

粉丝