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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15W單片機測量電壓數值跟實際電壓不符

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



WORD idata Vbg_RAM _at_ 0xef;   

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



sfr ADC_LOW2    =   0xBE;                   //ADC低2位結果

#define ADC_POWER   0x80                    //ADC電源控制位
#define ADC_FLAG    0x10                    //ADC完成標志
#define ADC_START   0x08                    //ADC起始控制位
#define ADC_SPEEDLL 0x00                    //540個時鐘
#define ADC_SPEEDL  0x20                    //360個時鐘
#define ADC_SPEEDH  0x40                    //180個時鐘
#define ADC_SPEEDHH 0x60                    //90個時鐘
void Timer0Init(void);
/*----------------------------
軟件延時
----------------------------*/
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上電并延時
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                                //等待4個NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));        //等待ADC轉換完成
    ADC_CONTR &= ~ADC_FLAG;                 //清除ADC標志

    return ADC_RES;
}

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

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

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

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

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


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

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

使用道具 舉報

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

但這誤差不會很大,像你這種有幾V的誤差,應該是你自己代碼的問題

回復

使用道具 舉報

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

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

這樣算,
然后看看結果。
回復

使用道具 舉報

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

使用道具 舉報

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

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

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

//第四步:通過公式計算外部輸入的實際電壓值
    Vin = Vx * ADCx / 256;
回復

使用道具 舉報

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

5.0換成500,VX的值跟單片機電壓相符。那個Vin通道1輸入的實際電壓還是不對
回復

使用道具 舉報

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

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

使用道具 舉報

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

這個改正過來了。所以第三步測得電壓沒問題。第四步外部輸入的電壓值不正確。
//第一步:通過ADC的第2通道測試外部輸入電壓的ADC測量值
    ADC_RES = 0; //清除結果寄存器
    P1ASF = 0x02;//設置P1.1口為模擬通道
    ADCx+= GetADC(1);
//第二步:通過ADC的第9通道測試Bandgap電壓的ADC測量值
    ADC_RES = 0; //清除結果寄存器
    P1ASF = 0x00; //不設置P1ASF,即可從ADC的第9通道讀取內部Bandgap電壓的ADC測量值
    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;
回復

使用道具 舉報

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

1通道輸入的電壓有誤差最大0.6V多,而且不能超過電源電壓.電源電壓3.9V的時候,那輸入檢測的電壓就無法超過這個值.這屬于正常的嗎.誤差應該怎么調校.
回復

使用道具 舉報

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

輸入電壓=當前VCC電壓*轉換結果/256
使用第九通道的目的是為了利用芯片內部基準電壓推算出當前VCC電壓。
當輸入電壓大于VCC需要用分壓電阻按比例降低到VCC以內,經轉換后再按同比例放大顯示。
回復

使用道具 舉報

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

正常誤差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;
        }
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区在线免费观看 | av一区在线 | 久久久久国产精品一区三寸 | 91视在线国内在线播放酒店 | 欧美成视频| 亚洲网在线 | 日韩精品一区二区三区视频播放 | 激情在线视频网站 | 欧美精品片 | 精品乱码一区二区三四区视频 | 日韩免费在线视频 | 免费看国产精品视频 | 三级视频在线观看电影 | 亚洲欧美一区二区三区国产精品 | 国产视频久久 | 精品麻豆剧传媒av国产九九九 | 国产精品激情 | 一区二区三区视频在线观看 | 99日韩 | 精品国产乱码久久久久久闺蜜 | 欧美成人免费在线视频 | 99亚洲| 国产精品精品视频一区二区三区 | 欧美在线a | 国产精品视频500部 a久久 | 欧美日韩在线观看一区 | 日韩精品一区二区在线观看 | 亚洲欧美中文字幕在线观看 | 亚洲精品电影网在线观看 | 视频二区在线观看 | 精品免费国产一区二区三区四区介绍 | 成人福利视频 | 网站黄色在线 | 久久国产综合 | 1级毛片 | 国产二区在线播放 | 亚洲国产欧美一区二区三区久久 | 欧美日韩视频 | 国产成人一区二区三区电影 | 色婷婷av99xx | 国产一区二区三区久久久久久久久 |