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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 354|回復: 11
打印 上一主題 下一主題
收起左側

ADC采集精度為什么只有0.2V

[復制鏈接]
跳轉到指定樓層
樓主
ID:705846 發表于 2025-12-9 13:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STC15W408AS
利用bandgap作為參考電壓,10位采集,什么原因導致測量的電壓總是精度為0.2V,有沒有哪位大佬處理過類似問題。

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


//獲取芯片出廠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的結果
        delay_us(2);                                       
        ADC_CONTR = 0x88|0x00;                                                                                //啟動ADCbg第九通道的轉換
        delay_us(5);
        while(!(ADC_CONTR & ADC_FLAG));                        //等待轉換完成
        ADC_CONTR &= ~ADC_FLAG;                                                        //關閉ADC
        ADCbg = (ADC_RES*256+ADC_RESL);
}



//獲取芯片出廠bandgap的電壓值(bandgap)
void bdgp()
{
        uchar idata *iptr;                                //定義RAM內存區指針
        iptr = ID_ADDR_RAM;
        bandgap=*iptr++;
        bandgap<<=8;
        bandgap+=*iptr;                                                //從內存區讀取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復位
                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_();        //等待四個機器周期
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:705846 發表于 2025-12-9 13:59 | 只看該作者
用萬用表測量輸出電壓步進是0.1,但ADC采集數碼管確是0.2的步進
回復

使用道具 舉報

板凳
ID:1034262 發表于 2025-12-9 21:04 | 只看該作者
沒有量程,只說精度,沒有意義。
比如量程100V,誤差0.2V,那精度就是0.2%。量程10V,誤差0.2V,那精度就是2%!
回復

使用道具 舉報

地板
ID:1128898 發表于 2025-12-10 05:58 | 只看該作者
用萬用表測量輸出電壓? are you suer?
回復

使用道具 舉報

5#
ID:705846 發表于 2025-12-10 09:41 | 只看該作者
也就是ADC 0.1的變化測不出來,每次變化都是0.2V ,而實際電壓只變化了0.1V
回復

使用道具 舉報

6#
ID:283207 發表于 2025-12-10 14:26 | 只看該作者
量程的問題,10位AD分辨率高是1024,極限來說:如果測100V就是0.1V精度,測200V就是0.2V步進。還有就是“用萬用表測量輸出電壓步進是0.1”,這句沒明白?AD轉換器,你測的是什么?輸入電壓?
回復

使用道具 舉報

7#
ID:1164475 發表于 2025-12-10 15:33 | 只看該作者
hyzqq 發表于 2025-12-10 14:26
量程的問題,10位AD分辨率高是1024,極限來說:如果測100V就是0.1V精度,測200V就是0.2V步進。還有就是“用 ...

我認為他想表達的意思是0.1V,萬用表能分辨的出來,而他的ADC 需要0.2V的壓差才能分辨的出來
回復

使用道具 舉報

8#
ID:705846 發表于 2025-12-10 15:58 | 只看該作者
hyzqq 發表于 2025-12-10 14:26
量程的問題,10位AD分辨率高是1024,極限來說:如果測100V就是0.1V精度,測200V就是0.2V步進。還有就是“用 ...

我測試的13-48V的電壓。 ADC也是從輸出電壓采樣,萬用表測的輸出電壓,比如萬用表測輸出電壓是15.0,15,2,15,3,15.4V,ADC采集數碼管只能顯示15.0.15.2,15.4
回復

使用道具 舉報

9#
ID:283207 發表于 2025-12-12 09:57 | 只看該作者
samxon 發表于 2025-12-10 15:58
我測試的13-48V的電壓。 ADC也是從輸出電壓采樣,萬帽聿獾氖涑齙繆梗熱繽蠐帽聿饈涑齙繆故�15.0,15,2, ...

是的,請看我上面的回答。要提高分辨率,就要減小量程。也就是說在量程最大電壓值時,要把AD輸入的電壓分壓后輸入單片機端口,該電壓值,調到和基準一致。假設輸入100V時你用萬用表測IO輸入的電壓值應是1.2V左右(內部基準一致性不好,有偏差),此時你測的分辨率就是100/1023約0.1V(理想狀態)。如想測量分辨率是0.01V,那就把10V(超過10V就超量程了)輸入時,IO端口的分壓值調到基準值即可。
回復

使用道具 舉報

10#
ID:283207 發表于 2025-12-12 10:02 | 只看該作者
newton1207 發表于 2025-12-10 15:33
我認為他想表達的意思是0.1V,萬用表能分辨的出來,而他的ADC 需要0.2V的壓差才能分辨的出來

確實。那這就是量程的問題了。
回復

使用道具 舉報

11#
ID:705846 發表于 2025-12-13 09:29 | 只看該作者
hyzqq 發表于 2025-12-12 09:57
是的,請看我上面的回答。要提高分辨率,就要減小量程。也就是說在量程最大電壓值時,要把AD輸入的電壓分 ...

謝謝各位大佬解答。我的理解是10位ADC,參考電壓5V,分辨率就是0.00488V。 如果電壓是1-100V,就是每次ADC采集變動必須小于分辨率電壓才能步進0.1V。經過實際驗證測試,問題解決。再次感謝。
回復

使用道具 舉報

12#
ID:624769 發表于 2025-12-13 16:12 | 只看該作者
samxon 發表于 2025-12-13 09:29
謝謝各位大佬解答。我的理解是10位ADC,參考電壓5V,分辨率就是0.00488V。 如果電壓是1-100V,就是每次ADC ...

你的理解并不對, 分辨率不僅僅由參考電壓決定的,還取決于你的分壓電阻。
假定,你的分壓電阻是10K 和 990K(1:100), 那么,分辨率就得 0.488V 了。
你想要分辨率小于 0.1,那么分壓電阻一般需要選擇 20k 和 383K(1:20.15) 這個比例才可以。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

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