亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 想問(wèn)下MCU adc數(shù)據(jù)的處理和顯示程序問(wèn)題 [打印本頁(yè)]

作者: xda    時(shí)間: 2020-3-10 19:55
標(biāo)題: 想問(wèn)下MCU adc數(shù)據(jù)的處理和顯示程序問(wèn)題
本帖最后由 xda 于 2020-3-10 20:54 編輯

這里兩天做了adc顯示實(shí)驗(yàn),由于使用單片機(jī)內(nèi)存太小,每次使用sprintf函數(shù)就要報(bào)錯(cuò),所以只好按照常規(guī)方法處理(這種方法根本沒(méi)用熟),現(xiàn)在遇到了問(wèn)題
1、用oled顯示出來(lái)的數(shù)據(jù)小數(shù)位不對(duì),和實(shí)際計(jì)算結(jié)果不一樣,就是說(shuō),我的ad是1024,10位精度的,比如我采到的值是865,理論計(jì)算以后是2.55左右,引腳上也是這個(gè)電壓,但是通過(guò)c語(yǔ)言計(jì)算出來(lái)就是2.8幾的電壓,公式=采集到的值/1024*3.022
2、如何制作光標(biāo)和翻頁(yè)呢3、假如說(shuō),我想把處理后的值做一個(gè)判斷呢,比如我處理過(guò)后得到是1.23,我想加一個(gè)判斷,當(dāng)是1的時(shí)候做出一些動(dòng)作

下面貼代碼,請(qǐng)各位大俠不吝賜教

顯示部分
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;//整數(shù)處理,雖然我覺(jué)得這句可以不要
    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);


我采集到的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換位浮點(diǎn)型數(shù)據(jù),然后/1024,再乘3.022(我單片機(jī)的基準(zhǔn)源用的是vcc的基準(zhǔn)源,vcc電源是3.022)然后將處理過(guò)的數(shù)據(jù)傳給無(wú)符號(hào)整形,這樣,整數(shù)部分就出來(lái)了,然后顯示再處理小數(shù),小數(shù)是我抄的代碼,貼出來(lái)
Conversion_Value-=Conversion_Value;
     Conversion_Value*=1000;

說(shuō)實(shí)話(huà)這段我也不是太明白是怎么回事

在此感謝每個(gè)幫我的大佬!!!


作者: YYB_123456    時(shí)間: 2020-3-10 21:39
公式=采集到的值/1024*3.022,改成  采集到的值*3.022/1024
作者: panmingfu    時(shí)間: 2020-3-11 10:00
公式=采集到的值/1024*3.022,這個(gè)是對(duì)的
作者: xda    時(shí)間: 2020-3-11 17:19
panmingfu 發(fā)表于 2020-3-11 10:00
公式=采集到的值/1024*3.022,這個(gè)是對(duì)的

所以我的公式不用改對(duì)吧
但是為什么公式算出來(lái)得值和實(shí)際測(cè)量到得值有誤差呢,是不是數(shù)據(jù)類(lèi)型處理出了問(wèn)題
作者: xda    時(shí)間: 2020-3-11 17:20
YYB_123456 發(fā)表于 2020-3-10 21:39
公式=采集到的值/1024*3.022,改成  采集到的值*3.022/1024

這樣出來(lái)得答案和我得公式有什么區(qū)別呢,說(shuō)實(shí)話(huà)沒(méi)想通

作者: wulin    時(shí)間: 2020-3-11 21:37
不要用浮點(diǎn)型數(shù)據(jù)計(jì)算,用整數(shù)計(jì)算為宜。
#define VCC_V  3.022                                //宏定義電源電壓3.022V
uint ADC_RESX;                                //ADC轉(zhuǎn)換結(jié)果
uint ADC_V;                                        //ADC mV
ADC_V=(VCC_V*(long)ADC_RESX*10000/1024+5)/10;        //強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類(lèi)型(32位)運(yùn)算,得到(4舍5入)mV
//毫伏=(參考電壓*十位ADC結(jié)果*10000/1024+5)/10
作者: xda    時(shí)間: 2020-3-12 22:03
wulin 發(fā)表于 2020-3-11 21:37
不要用浮點(diǎn)型數(shù)據(jù)計(jì)算,用整數(shù)計(jì)算為宜。
#define VCC_V  3.022                                //宏定義電源電壓3.022V
uint ADC_RES ...

其實(shí)我也是不想用的,單片機(jī)內(nèi)存只有8k,浮點(diǎn)型數(shù)據(jù)太占內(nèi)存了,單片機(jī)型號(hào)stm8s001j,這種處理方法精度和浮點(diǎn)運(yùn)算數(shù)據(jù)相比,哪個(gè)要高一點(diǎn)呢,還有我才在網(wǎng)上看到了一段代碼
        Temp_Integer = (unsigned char)(Temp>>4);        //計(jì)算出溫度的整數(shù)部分
        Temp_Remainder = (Temp&0x000f) * 625;        //計(jì)算出溫度的小數(shù)部分,并擴(kuò)大1000倍,方便顯示
對(duì)數(shù)據(jù)的移位操作并不是特別明白,懇請(qǐng)大佬幫我看看這三段代碼哪種更適合
作者: wulin    時(shí)間: 2020-3-13 09:29
xda 發(fā)表于 2020-3-12 22:03
其實(shí)我也是不想用的,單片機(jī)內(nèi)存只有8k,浮點(diǎn)型數(shù)據(jù)太占內(nèi)存了,單片機(jī)型號(hào)stm8s001j,這種處理方法精度 ...

對(duì)于不同的數(shù)據(jù)類(lèi)型和數(shù)據(jù)含義要采取相適應(yīng)的解析方法:
一般原則是能用整數(shù)計(jì)算就不要用小數(shù)計(jì)算,能用移位計(jì)算就不要用算術(shù)計(jì)算。
前述是解析10位ADC的方法,如不考慮四舍五入通常采用
#define VCC_V  3022  //宏定義電源電壓3022mV
uint ADC_RESX;       //10位ADC轉(zhuǎn)換結(jié)果
uint ADC_V;          //ADC mV
ADC_V=VCC_V*(long)ADC_RESX/1024;

再談DS18B20溫度傳感器的數(shù)據(jù)解析
Temp_Integer = (unsigned char)(Temp>>4);        //計(jì)算出溫度的整數(shù)部分
Temp_Remainder = (Temp&0x000f) * 625;        //計(jì)算出溫度的小數(shù)部分,并擴(kuò)大1000倍,方便顯示

我們來(lái)看Temp的數(shù)據(jù)含義:它是int型溫度值數(shù)據(jù),其最高位表示正負(fù),次高3位空閑,依次低8位表示整數(shù),最低4位表示小數(shù)。
        f=+/- z=整數(shù) x=小數(shù) f000 zzzz zzzz xxxx
如果全部化為整數(shù),數(shù)字太大,所以把整數(shù)和小數(shù)分開(kāi)處理最合理。通常方法:
        unsigned char TempH; //整數(shù)
        unsigned char TempL; //小數(shù)
        bit  negative;//負(fù)數(shù)標(biāo)志
        if(temp&0x8000)//判斷正負(fù)
        {
                negative=1;                //負(fù)數(shù)
                temp=~temp;                //取反加1
                temp +=1;
        }
        else negative=0;        //正數(shù)

        TempH=temp>>4;                //分解出整數(shù)
        TempL=temp&0x000F;//分解出小數(shù)
        TempL=TempL*6/10;        //保留一位小數(shù),通常保留2~3位意義不大
后續(xù)處理就方便多了。
總之沒(méi)有一招通吃天下的方法,只有更適合方法。
作者: Y_G_G    時(shí)間: 2020-3-13 09:42
不會(huì)C,也沒(méi)有用過(guò)STM8
但單片機(jī)的原理是一樣的:C代碼是先轉(zhuǎn)換(編譯)成匯編,然后再燒錄進(jìn)單片機(jī)的
單片機(jī)C數(shù)據(jù)類(lèi)型并不是標(biāo)準(zhǔn)C的長(zhǎng)度,不同的編譯器有著不同的數(shù)據(jù)類(lèi)型的長(zhǎng)度,對(duì)于超過(guò)長(zhǎng)度的,編譯器就不要那多出來(lái)的部分了,多次運(yùn)算之后,不要數(shù)據(jù)越來(lái)越多,誤差就越來(lái)越大了
浮點(diǎn)型數(shù)據(jù)的長(zhǎng)度要比整型的長(zhǎng),運(yùn)算結(jié)果誤差是要大一點(diǎn)的
對(duì)于10位的ADC,你直接使用整型運(yùn)算就可以了
865*3022/1024,這樣最多使用到一32位的整型數(shù)據(jù),/1024放后面,這會(huì)是一個(gè)位移的運(yùn)算,也許誤差會(huì)小點(diǎn)
運(yùn)算結(jié)果2552.7左右,能有2552就很好了,要是我的話(huà),后面就直接加小數(shù)點(diǎn),不再運(yùn)算了




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1