久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2086|回復: 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;

說實話這段我也不是太明白是怎么回事

在此感謝每個幫我的大佬!!!

回復

使用道具 舉報

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,這個是對的

所以我的公式不用改對吧
但是為什么公式算出來得值和實際測量到得值有誤差呢,是不是數據類型處理出了問題
回復

使用道具 舉報

ID:248659 發表于 2020-3-11 17:20 | 顯示全部樓層
YYB_123456 發表于 2020-3-10 21:39
公式=采集到的值/1024*3.022,改成  采集到的值*3.022/1024

這樣出來得答案和我得公式有什么區別呢,說實話沒想通
回復

使用道具 舉報

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
回復

使用道具 舉報

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倍,方便顯示
對數據的移位操作并不是特別明白,懇請大佬幫我看看這三段代碼哪種更適合
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 大象视频一区二区 | 亚洲精品乱码久久久久久蜜桃91 | 伦理午夜电影免费观看 | 黄色av网站在线观看 | 午夜网站视频 | 日韩一级在线 | 精品视频国产 | 国产91在线精品 | 亚洲精品国产一区 | 成年人免费在线视频 | 亚洲精品白浆高清久久久久久 | 狠狠的干| 99久久久99久久国产片鸭王 | 亚洲美女一区二区三区 | 国产精品日日做人人爱 | 亚洲 中文 欧美 日韩 在线观看 | 欧美黄视频 | 在线观看中文字幕 | 99re在线视频 | 国产精品一区二区在线播放 | av手机免费在线观看 | 日韩一区二区三区在线观看视频 | 国产精品视频免费观看 | 亚洲av毛片 | 国产在线一区二区三区 | 国产人成精品一区二区三 | 人人鲁人人莫人人爱精品 | 日本在线网址 | 国产一级在线观看 | 日韩av在线免费 | 精品久久香蕉国产线看观看亚洲 | 精品免费在线 | 好姑娘影视在线观看高清 | 国产精品不卡视频 | 成人免费影院 | 国产成人高清 | 国产精品欧美一区二区三区 | 午夜一级大片 | 久久精片 | www国产精 | 免费在线观看成人 |