欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2297|回復: 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 單片機教程網

快速回復 返回頂部 返回列表