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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3615|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

STC15W單片機(jī)測(cè)量電壓數(shù)值跟實(shí)際電壓不符

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:956872 發(fā)表于 2021-10-12 20:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
內(nèi)部參考電壓是1243mV,3位數(shù)碼管顯示1.24。這個(gè)程序也是范例程序加了數(shù)碼管顯示。P1.1腳我用充電寶通過可調(diào)電阻輸入。顯示的電壓與實(shí)際輸入電壓不符
實(shí)際電壓是0V到5.02V,數(shù)碼管顯示只有0.00調(diào)到0.29又從0.00開始循環(huán)



WORD idata Vbg_RAM _at_ 0xef;   

WORD code Vbg_ROM _at_ 0x1ff7;            //8K程序空間的MCU



sfr ADC_LOW2    =   0xBE;                   //ADC低2位結(jié)果

#define ADC_POWER   0x80                    //ADC電源控制位
#define ADC_FLAG    0x10                    //ADC完成標(biāo)志
#define ADC_START   0x08                    //ADC起始控制位
#define ADC_SPEEDLL 0x00                    //540個(gè)時(shí)鐘
#define ADC_SPEEDL  0x20                    //360個(gè)時(shí)鐘
#define ADC_SPEEDH  0x40                    //180個(gè)時(shí)鐘
#define ADC_SPEEDHH 0x60                    //90個(gè)時(shí)鐘
void Timer0Init(void);
/*----------------------------
軟件延時(shí)
----------------------------*/
void Delay(WORD n)
{
    WORD x;

    while (n--)
    {
        x = 5000;
        while (x--);
    }
}

BYTE GetADC(BYTE ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                               //ADC上電并延時(shí)
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                                //等待4個(gè)NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));        //等待ADC轉(zhuǎn)換完成
    ADC_CONTR &= ~ADC_FLAG;                 //清除ADC標(biāo)志

    return ADC_RES;
}

void main()
{
    BYTE ADCbg;
    BYTE ADCx;
    WORD Vx;
    Timer0Init();

while (1)
{//第一步:通過ADC的第2通道測(cè)試外部輸入電壓的ADC測(cè)量值
    ADC_RES = 0;                            //清除結(jié)果寄存器
    P1ASF = 0x02;                           //設(shè)置P1.1口為模擬通道
    GetADC(1);
    GetADC(1);
    ADCx = GetADC(1);

//第二步:通過ADC的第9通道測(cè)試Bandgap電壓的ADC測(cè)量值
    ADC_RES = 0;                            //清除結(jié)果寄存器
    P1ASF = 0x00;                           //不設(shè)置P1ASF,即可從ADC的第9通道讀取內(nèi)部Bandgap電壓的ADC測(cè)量值
    GetADC(1);
    GetADC(1);
    ADCbg = GetADC(1);

//第三步:通過公式計(jì)算外部輸入的實(shí)際電壓值
    Vx = Vbg_RAM * ADCx / ADCbg;            //使用RAM中的Bandgap電壓參數(shù)進(jìn)行計(jì)算
   // Vx = Vbg_ROM * ADCx / ADCbg;          //使用ROM中的Bandgap電壓參數(shù)進(jìn)行計(jì)算
    ledbuf[0]=(Vx/1000%10)+10;
    ledbuf[1]=Vx/100%10;
    ledbuf[2]=Vx/10%10;
               
}
}

void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0x66;                //設(shè)置定時(shí)初始值
        TH0 = 0xFC;                //設(shè)置定時(shí)初始值
        TF0 = 0;                //清除TF0標(biāo)志
        ET0=1;
        EA=1;
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
}


void Timer0_Init() interrupt 1
{      TR0 =0;
        display();                   //數(shù)碼管顯示
        TL0 = 0x66;                //設(shè)置定時(shí)初始值
        TH0 = 0xFC;                //設(shè)置定時(shí)初始值
        TR0 = 1;
}

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

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2021-10-12 22:08 | 只看該作者
STC15W系列不能直接通過內(nèi)部參考電壓來測(cè)量VCC電壓,直接測(cè)量不一定準(zhǔn)確,數(shù)據(jù)手冊(cè)898頁面有重要說明

但這誤差不會(huì)很大,像你這種有幾V的誤差,應(yīng)該是你自己代碼的問題

回復(fù)

使用道具 舉報(bào)

板凳
ID:624769 發(fā)表于 2021-10-12 22:19 | 只看該作者
void main()
{
    BYTE ADCbg;
    BYTE ADCx;
    WORD Vx;                    <==== 這個(gè)用unsinged Long
    Timer0Init();

然后,第三步用 ROM去算而且分部算
Vx = Vbg_ROM;
Vx *= ADCx;
Vx /= ADCbg;

這樣算,
然后看看結(jié)果。
回復(fù)

使用道具 舉報(bào)

地板
ID:959346 發(fā)表于 2021-10-12 22:27 | 只看該作者
檢查一下數(shù)據(jù)長度是否滿足?包括定義的數(shù)據(jù)類型長度、計(jì)算步驟內(nèi)的數(shù)據(jù)長度等。
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2021-10-13 06:16 | 只看該作者
//第一步:通過ADC的第2通道測(cè)試外部輸入電壓的ADC測(cè)量值
    ADC_RES = 0; //清除結(jié)果寄存器
    P1ASF = 0x02;//設(shè)置P1.1口為模擬通道
    ADCx = GetADC(1);

//第二步:通過ADC的第9通道測(cè)試Bandgap電壓的ADC測(cè)量值
    ADC_RES = 0; //清除結(jié)果寄存器
    P1ASF = 0x00; //不設(shè)置P1ASF,即可從ADC的第9通道讀取內(nèi)部Bandgap電壓的ADC測(cè)量值
    ADCbg = GetADC(0);//第9通道!!!

//第三步:通過公式計(jì)算實(shí)際電源電壓值Vx
//  Vx = Vbg_RAM * ADCx / ADCbg;            //使用RAM中的Bandgap電壓參數(shù)進(jìn)行計(jì)算
    Vx = 5.0 * Vbg_RAM / ADCbg;   

//第四步:通過公式計(jì)算外部輸入的實(shí)際電壓值
    Vin = Vx * ADCx / 256;
回復(fù)

使用道具 舉報(bào)

6#
ID:956872 發(fā)表于 2021-10-13 18:01 | 只看該作者
wulin 發(fā)表于 2021-10-13 06:16
//第一步:通過ADC的第2通道測(cè)試外部輸入電壓的ADC測(cè)量值
    ADC_RES = 0; //清除結(jié)果寄存器
    P1ASF = ...

5.0換成500,VX的值跟單片機(jī)電壓相符。那個(gè)Vin通道1輸入的實(shí)際電壓還是不對(duì)
回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2021-10-13 19:06 | 只看該作者
PEB188 發(fā)表于 2021-10-13 18:01
5.0換成500,VX的值跟單片機(jī)電壓相符。那個(gè)Vin通道1輸入的實(shí)際電壓還是不對(duì)

不知你是否改正 ADCbg = GetADC(0);//第9通道!!!
回復(fù)

使用道具 舉報(bào)

8#
ID:956872 發(fā)表于 2021-10-14 15:59 | 只看該作者
wulin 發(fā)表于 2021-10-13 19:06
不知你是否改正 ADCbg = GetADC(0);//第9通道!!!

這個(gè)改正過來了。所以第三步測(cè)得電壓沒問題。第四步外部輸入的電壓值不正確。
//第一步:通過ADC的第2通道測(cè)試外部輸入電壓的ADC測(cè)量值
    ADC_RES = 0; //清除結(jié)果寄存器
    P1ASF = 0x02;//設(shè)置P1.1口為模擬通道
    ADCx+= GetADC(1);
//第二步:通過ADC的第9通道測(cè)試Bandgap電壓的ADC測(cè)量值
    ADC_RES = 0; //清除結(jié)果寄存器
    P1ASF = 0x00; //不設(shè)置P1ASF,即可從ADC的第9通道讀取內(nèi)部Bandgap電壓的ADC測(cè)量值
    ADCbg += GetADC(0);//第9通道!!!
    i++;
        if(i>=15)
        {
                i=0;               
                Vx = (500 * Vbg_RAM / ((long)ADCbg/15));     
                Vin= ((long)(ADCx/15)*Vx/256);
                ADCx=0;
                ADCbg=0;
                ledbuf[0]=Vin/100%10+10;
    ledbuf[1]=Vin/10%10;
    ledbuf[2]=Vin/1%10;
回復(fù)

使用道具 舉報(bào)

9#
ID:956872 發(fā)表于 2021-10-14 16:14 | 只看該作者
wulin 發(fā)表于 2021-10-13 19:06
不知你是否改正 ADCbg = GetADC(0);//第9通道!!!

1通道輸入的電壓有誤差最大0.6V多,而且不能超過電源電壓.電源電壓3.9V的時(shí)候,那輸入檢測(cè)的電壓就無法超過這個(gè)值.這屬于正常的嗎.誤差應(yīng)該怎么調(diào)校.
回復(fù)

使用道具 舉報(bào)

10#
ID:213173 發(fā)表于 2021-10-14 20:19 | 只看該作者
PEB188 發(fā)表于 2021-10-14 16:14
1通道輸入的電壓有誤差最大0.6V多,而且不能超過電源電壓.電源電壓3.9V的時(shí)候,那輸入檢測(cè)的電壓就無法超過 ...

輸入電壓=當(dāng)前VCC電壓*轉(zhuǎn)換結(jié)果/256
使用第九通道的目的是為了利用芯片內(nèi)部基準(zhǔn)電壓推算出當(dāng)前VCC電壓。
當(dāng)輸入電壓大于VCC需要用分壓電阻按比例降低到VCC以內(nèi),經(jīng)轉(zhuǎn)換后再按同比例放大顯示。
回復(fù)

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2021-10-16 16:45 | 只看該作者
PEB188 發(fā)表于 2021-10-14 16:14
1通道輸入的電壓有誤差最大0.6V多,而且不能超過電源電壓.電源電壓3.9V的時(shí)候,那輸入檢測(cè)的電壓就無法超過 ...

正常誤差0.02V。
        i++;
        if(i>=15)
        {
                i=0;               
                Vx=500*Vbg_RAM/(ADCbg/15);     
                Vin=Vx*(long)ADCx/256/15;
                ADCx=0;
                ADCbg=0;
                ledbuf[0]=Vin/100%10;
                ledbuf[1]=Vin/10%10;
                ledbuf[2]=Vin%10;
        }
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久伊人久久 | 日韩午夜激情 | 一级片在线观看视频 | 久久久久久久久久久久久9999 | 精品国产乱码久久久久久牛牛 | 日本一区二区影视 | www.亚洲精品 | 国产视频三级 | 一级毛片视频 | 日韩在线视频播放 | 日日夜夜av| 欧美一区二区视频 | 中文字幕视频在线免费 | 日韩在线欧美 | 91精品国产91久久综合桃花 | 亚洲www啪成人一区二区麻豆 | 天天操天天射天天舔 | 天天草天天 | 亚洲毛片一区二区 | 美女精品一区 | 国产精品无码专区在线观看 | 中文字幕在线观看国产 | 国产精品视频入口 | 国产91综合一区在线观看 | 亚洲成人www | 毛片网站在线观看视频 | av手机在线 | 国产在线小视频 | 久久综合色综合 | 中文字幕在线观 | 国产精品毛片一区二区三区 | 91一区 | 狠狠插天天干 | 国产中文字幕在线 | 国产精品成人品 | 日韩精品在线免费 | 欧美国产91 | 欧美一级片 | 色本道 | 中日av | 国产高清精品网站 |