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

標(biāo)題: ADC采集精度為什么只有0.2V [打印本頁(yè)]

作者: samxon    時(shí)間: 2025-12-9 13:51
標(biāo)題: ADC采集精度為什么只有0.2V
STC15W408AS
利用bandgap作為參考電壓,10位采集,什么原因?qū)е聹y(cè)量的電壓總是精度為0.2V,有沒(méi)有哪位大佬處理過(guò)類似問(wèn)題。

//初始化ADC
void AdInit()
{        
        P1ASF = 0x03;                                                                                                //00000011允許P1.0,P1.1執(zhí)行ADC
        ADC_RES = 0;        ADC_RESL = 0;                                        //清除ADC結(jié)果寄存器
        CLK_DIV = 0x20;                                                                                 //00100000、ADRJ 為 1,
                                                                                                                                                        //ADC_RES 存放高兩位結(jié)果,
                                                                                                                                                        //ADC_RESL 存放低 8 位結(jié)果
        ADC_CONTR = 0x88|0x01;                                                        //0x88是ADC_POWER|ADC_SPEEDLL|ADC_START的結(jié)果
        delay_ms(20);                                                                                                //等待ADC穩(wěn)定
        EADC = 1;                                                                                                 //允許AD轉(zhuǎn)換中斷
}


//獲取芯片出廠bandgap的ADC值(ADCbg)
void GetADCbg()
{
        P1ASF        =        0x00;
        ADC_RES = 0;        ADC_RESL = 0;
        CLK_DIV = 0x20;
        ADC_CONTR = 0x88;                                                                                //ADC_POWER|ADC_SPEEDLL|ADC_START的結(jié)果
        delay_us(2);                                       
        ADC_CONTR = 0x88|0x00;                                                                                //啟動(dòng)ADCbg第九通道的轉(zhuǎn)換
        delay_us(5);
        while(!(ADC_CONTR & ADC_FLAG));                        //等待轉(zhuǎn)換完成
        ADC_CONTR &= ~ADC_FLAG;                                                        //關(guān)閉ADC
        ADCbg = (ADC_RES*256+ADC_RESL);
}



//獲取芯片出廠bandgap的電壓值(bandgap)
void bdgp()
{
        uchar idata *iptr;                                //定義RAM內(nèi)存區(qū)指針
        iptr = ID_ADDR_RAM;
        bandgap=*iptr++;
        bandgap<<=8;
        bandgap+=*iptr;                                                //從內(nèi)存區(qū)讀取BandGap電壓值(單位毫伏
}


void adc_isr()interrupt 5 using 1
{
        static char VoCount,CrCount,m,ch;
        static uint VoResult,CrResult;
        ADC_CONTR &= !0x10; //CLOSE ADC ADC_FLAG復(fù)位
                if(ch==0){        
                                OPPCur = (float)bandgap*(ADC_RES*256+ADC_RESL)/ADCbg*cur_sampling/100; //
                                if(m==32){
                                        if(CrCount < ADC_TIMES){
                                                CrResult +=        (ADC_RES*256+ADC_RESL);
                                                CrCount++;
                                        }else{
                                                CFt = (float)bandgap*(CrResult/ADC_TIMES)/ADCbg*cur_sampling/100;
                                                CrCount = 0;
                                                CrResult = 0;
                                        }
                                }
                }
               
                if(ch==1){
                                OPPVol = ((float)bandgap*(ADC_RES*256+ADC_RESL)/ADCbg/vol_sampling)/100; //123V
                                if(m==32){
                                        if(VoCount < ADC_TIMES){
                                                VoResult +=        (ADC_RES*256+ADC_RESL);
                                                VoCount++;
                                        }else{
                                                VFt = ((float)bandgap*(VoResult/ADC_TIMES)/ADCbg/vol_sampling)/100+voloffset;
                                                VoCount = 0;
                                                VoResult = 0;
                                        }
                                }
                }
               
        if((m%33)==32) ch++;
        m++;
        if(m>32) m = 0;
        if(ch>1)ch=0;
        ADC_CONTR = 0x88|ch;
        _nop_();_nop_();_nop_();_nop_();        //等待四個(gè)機(jī)器周期
}



作者: samxon    時(shí)間: 2025-12-9 13:59
用萬(wàn)用表測(cè)量輸出電壓步進(jìn)是0.1,但ADC采集數(shù)碼管確是0.2的步進(jìn)
作者: coody_sz    時(shí)間: 2025-12-9 21:04
沒(méi)有量程,只說(shuō)精度,沒(méi)有意義。
比如量程100V,誤差0.2V,那精度就是0.2%。量程10V,誤差0.2V,那精度就是2%!
作者: chchking    時(shí)間: 2025-12-10 05:58
用萬(wàn)用表測(cè)量輸出電壓? are you suer?
作者: samxon    時(shí)間: 2025-12-10 09:41
也就是ADC 0.1的變化測(cè)不出來(lái),每次變化都是0.2V ,而實(shí)際電壓只變化了0.1V
作者: hyzqq    時(shí)間: 2025-12-10 14:26
量程的問(wèn)題,10位AD分辨率高是1024,極限來(lái)說(shuō):如果測(cè)100V就是0.1V精度,測(cè)200V就是0.2V步進(jìn)。還有就是“用萬(wàn)用表測(cè)量輸出電壓步進(jìn)是0.1”,這句沒(méi)明白?AD轉(zhuǎn)換器,你測(cè)的是什么?輸入電壓?
作者: newton1207    時(shí)間: 2025-12-10 15:33
hyzqq 發(fā)表于 2025-12-10 14:26
量程的問(wèn)題,10位AD分辨率高是1024,極限來(lái)說(shuō):如果測(cè)100V就是0.1V精度,測(cè)200V就是0.2V步進(jìn)。還有就是“用 ...

我認(rèn)為他想表達(dá)的意思是0.1V,萬(wàn)用表能分辨的出來(lái),而他的ADC 需要0.2V的壓差才能分辨的出來(lái)
作者: samxon    時(shí)間: 2025-12-10 15:58
hyzqq 發(fā)表于 2025-12-10 14:26
量程的問(wèn)題,10位AD分辨率高是1024,極限來(lái)說(shuō):如果測(cè)100V就是0.1V精度,測(cè)200V就是0.2V步進(jìn)。還有就是“用 ...

我測(cè)試的13-48V的電壓。 ADC也是從輸出電壓采樣,萬(wàn)用表測(cè)的輸出電壓,比如萬(wàn)用表測(cè)輸出電壓是15.0,15,2,15,3,15.4V,ADC采集數(shù)碼管只能顯示15.0.15.2,15.4
作者: hyzqq    時(shí)間: 2025-12-12 09:57
samxon 發(fā)表于 2025-12-10 15:58
我測(cè)試的13-48V的電壓。 ADC也是從輸出電壓采樣,萬(wàn)帽聿獾氖涑齙繆梗熱繽蠐帽聿饈涑齙繆故�15.0,15,2, ...

是的,請(qǐng)看我上面的回答。要提高分辨率,就要減小量程。也就是說(shuō)在量程最大電壓值時(shí),要把AD輸入的電壓分壓后輸入單片機(jī)端口,該電壓值,調(diào)到和基準(zhǔn)一致。假設(shè)輸入100V時(shí)你用萬(wàn)用表測(cè)IO輸入的電壓值應(yīng)是1.2V左右(內(nèi)部基準(zhǔn)一致性不好,有偏差),此時(shí)你測(cè)的分辨率就是100/1023約0.1V(理想狀態(tài))。如想測(cè)量分辨率是0.01V,那就把10V(超過(guò)10V就超量程了)輸入時(shí),IO端口的分壓值調(diào)到基準(zhǔn)值即可。
作者: hyzqq    時(shí)間: 2025-12-12 10:02
newton1207 發(fā)表于 2025-12-10 15:33
我認(rèn)為他想表達(dá)的意思是0.1V,萬(wàn)用表能分辨的出來(lái),而他的ADC 需要0.2V的壓差才能分辨的出來(lái)

確實(shí)。那這就是量程的問(wèn)題了。
作者: samxon    時(shí)間: 2025-12-13 09:29
hyzqq 發(fā)表于 2025-12-12 09:57
是的,請(qǐng)看我上面的回答。要提高分辨率,就要減小量程。也就是說(shuō)在量程最大電壓值時(shí),要把AD輸入的電壓分 ...

謝謝各位大佬解答。我的理解是10位ADC,參考電壓5V,分辨率就是0.00488V。 如果電壓是1-100V,就是每次ADC采集變動(dòng)必須小于分辨率電壓才能步進(jìn)0.1V。經(jīng)過(guò)實(shí)際驗(yàn)證測(cè)試,問(wèn)題解決。再次感謝。
作者: 188610329    時(shí)間: 2025-12-13 16:12
samxon 發(fā)表于 2025-12-13 09:29
謝謝各位大佬解答。我的理解是10位ADC,參考電壓5V,分辨率就是0.00488V。 如果電壓是1-100V,就是每次ADC ...

你的理解并不對(duì), 分辨率不僅僅由參考電壓決定的,還取決于你的分壓電阻。
假定,你的分壓電阻是10K 和 990K(1:100), 那么,分辨率就得 0.488V 了。
你想要分辨率小于 0.1,那么分壓電阻一般需要選擇 20k 和 383K(1:20.15) 這個(gè)比例才可以。
作者: GlenXu    時(shí)間: 2026-1-2 08:58
理解有問(wèn)題,我看覺(jué)果是對(duì)的。
作者: hhh402    時(shí)間: 2026-1-21 15:42
數(shù)據(jù)溢出了:ADCbg = (ADC_RES*256+ADC_RESL);這樣只能得到8位數(shù)據(jù)。ADC_RES是8位,ADC_RES*256會(huì)數(shù)據(jù)溢出。
改為:ADCbg = ((int)ADC_RES*256+ADC_RESL);
作者: aking991    時(shí)間: 2026-1-22 08:47
5/1024約=0.00488,3.3/1024約=0.00322,即滿足刻度值即會(huì)加1,考慮電阻分壓系數(shù),就可能出現(xiàn)您說(shuō)的問(wèn)題很正常




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