找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1968|回复: 8
打印 上一主题 下一主题
收起左侧

想问下MCU adc数据的处理和显示程序问题

[复制链接]
回帖奖励 2 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:248659 发表于 2020-3-10 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xda 于 2020-3-10 20:54 编辑

这里两天做了adc显示实验,由于使用单片机内存太小,每次使用sprintf函数就要报错,所以只好按照常规方法处理(这种方法根本没用熟),现在遇到了问题
1、用oled显示出来的数据小数位不对,和实际计算结果不一样,就是说,我的ad是1024,10位精度的,比如我采到的值是865,理论计算以后是2.55左右,引脚上也是这个电压,但是通过c语言计算出来就是2.8几的电压,公式=采集到的值/1024*3.022
2、如何制作光标和翻页呢3、假如说,我想把处理后的值做一个判断呢,比如我处理过后得到是1.23,我想加一个判断,当是1的时候做出一些动作

下面贴代码,请各位大侠不吝赐教

显示部分
uint16_t Conversion_Value = 0;
unsigned int nBattery_Check_Value =0;//这两句我放在全局了



    OLED_ShowNum(0,0,Conversion_Value,5,16);
    nBattery_Check_Value=(float)Conversion_Value/1024*3.022;
    Conversion_Value=nBattery_Check_Value;//整数处理,虽然我觉得这句可以不要
    OLED_ShowNum(8,2,nBattery_Check_Value,5,16);
     Conversion_Value-=Conversion_Value;
     Conversion_Value*=1000;//这两句就不太明白怎么回事了
     OLED_ShowString(48,2,".");
     OLED_ShowNum(50,2,Conversion_Value,5,16);


我采集到的数据强制转换位浮点型数据,然后/1024,再乘3.022(我单片机的基准源用的是vcc的基准源,vcc电源是3.022)然后将处理过的数据传给无符号整形,这样,整数部分就出来了,然后显示再处理小数,小数是我抄的代码,贴出来
Conversion_Value-=Conversion_Value;
     Conversion_Value*=1000;

说实话这段我也不是太明白是怎么回事

在此感谢每个帮我的大佬!!!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 8#
ID:213173 发表于 2020-3-13 09:29 | 只看该作者
xda 发表于 2020-3-12 22:03
其实我也是不想用的,单片机内存只有8k,浮点型数据太占内存了,单片机型号stm8s001j,这种处理方法精度 ...

对于不同的数据类型和数据含义要采取相适应的解析方法:
一般原则是能用整数计算就不要用小数计算,能用移位计算就不要用算术计算。
前述是解析10位ADC的方法,如不考虑四舍五入通常采用
#define VCC_V  3022  //宏定义电源电压3022mV
uint ADC_RESX;       //10位ADC转换结果
uint ADC_V;          //ADC mV
ADC_V=VCC_V*(long)ADC_RESX/1024;

再谈DS18B20温度传感器的数据解析
Temp_Integer = (unsigned char)(Temp>>4);        //计算出温度的整数部分
Temp_Remainder = (Temp&0x000f) * 625;        //计算出温度的小数部分,并扩大1000倍,方便显示

我们来看Temp的数据含义:它是int型温度值数据,其最高位表示正负,次高3位空闲,依次低8位表示整数,最低4位表示小数。
        f=+/- z=整数 x=小数 f000 zzzz zzzz xxxx
如果全部化为整数,数字太大,所以把整数和小数分开处理最合理。通常方法:
        unsigned char TempH; //整数
        unsigned char TempL; //小数
        bit  negative;//负数标志
        if(temp&0x8000)//判断正负
        {
                negative=1;                //负数
                temp=~temp;                //取反加1
                temp +=1;
        }
        else negative=0;        //正数

        TempH=temp>>4;                //分解出整数
        TempL=temp&0x000F;//分解出小数
        TempL=TempL*6/10;        //保留一位小数,通常保留2~3位意义不大
后续处理就方便多了。
总之没有一招通吃天下的方法,只有更适合方法。
回复

使用道具 举报

沙发
ID:704545 发表于 2020-3-10 21:39 | 只看该作者
公式=采集到的值/1024*3.022,改成  采集到的值*3.022/1024
回复

使用道具 举报

板凳
ID:483611 发表于 2020-3-11 10:00 | 只看该作者
公式=采集到的值/1024*3.022,这个是对的
回复

使用道具 举报

地板
ID:248659 发表于 2020-3-11 17:19 | 只看该作者
panmingfu 发表于 2020-3-11 10:00
公式=采集到的值/1024*3.022,这个是对的

所以我的公式不用改对吧
但是为什么公式算出来得值和实际测量到得值有误差呢,是不是数据类型处理出了问题
回复

使用道具 举报

5#
ID:248659 发表于 2020-3-11 17:20 | 只看该作者
YYB_123456 发表于 2020-3-10 21:39
公式=采集到的值/1024*3.022,改成  采集到的值*3.022/1024

这样出来得答案和我得公式有什么区别呢,说实话没想通
回复

使用道具 举报

6#
ID:213173 发表于 2020-3-11 21:37 | 只看该作者
不要用浮点型数据计算,用整数计算为宜。
#define VCC_V  3.022                                //宏定义电源电压3.022V
uint ADC_RESX;                                //ADC转换结果
uint ADC_V;                                        //ADC mV
ADC_V=(VCC_V*(long)ADC_RESX*10000/1024+5)/10;        //强制转换数据类型(32位)运算,得到(4舍5入)mV
//毫伏=(参考电压*十位ADC结果*10000/1024+5)/10
回复

使用道具 举报

7#
ID:248659 发表于 2020-3-12 22:03 | 只看该作者
wulin 发表于 2020-3-11 21:37
不要用浮点型数据计算,用整数计算为宜。
#define VCC_V  3.022                                //宏定义电源电压3.022V
uint ADC_RES ...

其实我也是不想用的,单片机内存只有8k,浮点型数据太占内存了,单片机型号stm8s001j,这种处理方法精度和浮点运算数据相比,哪个要高一点呢,还有我才在网上看到了一段代码
        Temp_Integer = (unsigned char)(Temp>>4);        //计算出温度的整数部分
        Temp_Remainder = (Temp&0x000f) * 625;        //计算出温度的小数部分,并扩大1000倍,方便显示
对数据的移位操作并不是特别明白,恳请大佬帮我看看这三段代码哪种更适合
回复

使用道具 举报

9#
ID:401564 发表于 2020-3-13 09:42 | 只看该作者
不会C,也没有用过STM8
但单片机的原理是一样的:C代码是先转换(编译)成汇编,然后再烧录进单片机的
单片机C数据类型并不是标准C的长度,不同的编译器有着不同的数据类型的长度,对于超过长度的,编译器就不要那多出来的部分了,多次运算之后,不要数据越来越多,误差就越来越大了
浮点型数据的长度要比整型的长,运算结果误差是要大一点的
对于10位的ADC,你直接使用整型运算就可以了
865*3022/1024,这样最多使用到一32位的整型数据,/1024放后面,这会是一个位移的运算,也许误差会小点
运算结果2552.7左右,能有2552就很好了,要是我的话,后面就直接加小数点,不再运算了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表