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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8G直接讀取flash中校準(zhǔn)過的帶隙電壓值直接測量VCC無需外部連線

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1155837 發(fā)表于 2025-7-2 17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
下面的代碼實現(xiàn)了,通過讀取STC8G1K08A FLASH中記錄的出廠校準(zhǔn)過的帶隙電壓值,直接計算VCC,過程完全在單片機內(nèi)部進行,不需要外部連線!可以用于單節(jié)鋰電池的應(yīng)用場合直接測量VCC。復(fù)用的話直接在定時器中斷中調(diào)用VCC_CAL函數(shù),給vcc賦值。
代碼調(diào)用后會在for循環(huán)中采樣8次,輸出數(shù)組,并通過冒泡排序取中間的四個值,然后四舍五入求平均,不需要測量頻率很高,100ms一次就行了。

測量原理:stc單片機內(nèi)部有一個電壓接近1.19v的帶隙基準(zhǔn)電壓(后文簡稱BG),出廠校準(zhǔn)值直接存儲在flash中,具體位置可以在手冊中“存儲器”章節(jié)尋找。通過讀取這個電壓,再使用ADC測量15通道的回報值,就可以直接計算VCC,這一過程完全在單片機內(nèi)部實現(xiàn),不需要外部連線。
具體原理為,adc測量電壓后會回報一個數(shù)值,叫做碼數(shù),adc是靠比較測量電壓的,參考源是vcc。如果是十位adc,碼數(shù)范圍為0~1023,12位為4096。stc單片機adc的15通道固定測量內(nèi)部bg電壓值,讀取這個電壓,可以得到1.19v bg電壓對應(yīng)的碼數(shù),通過除法計算,可以直接得到毫伏每碼這個值。而adc測量vcc,由于參考的就是vcc,所以回報的是滿量程值,那么就可以省去測量vcc的過程,直接用滿量程碼數(shù)1024乘以毫伏每碼,直接得到vcc電壓。
而bg電壓是一個在1.19v左右的值,會因為制造過程產(chǎn)生差異,燒錄程序時我們可以看到軟件會回報帶隙電壓校準(zhǔn)值,實際上這個值就是直接存儲在flash中的,所以可以手動讀取。這個值為一個分為高八位和低八位的十六位二進制數(shù),高字節(jié)在前,分為4個四位二進制組,讀取之后可以直接組合為毫伏整數(shù)值。可以直接用于計算。


//計算VCC用的變量(全局)
unsigned int bgv = 0;//多個函數(shù)調(diào)用,聲明為全局變量
unsigned int vcc = 0;//值超過256,不能用char,int可以到65536
//char為字符型,8位,int整數(shù)型,16位
// 從idata讀取帶隙電壓值
unsigned int BGV_READ(void) {
    unsigned int temp = *((unsigned int idata *)0xEF);
    return temp;//給BGV_READ賦值
}
// ADC讀取函數(shù)
unsigned int ADC_READ(void) {
    unsigned int res;
    ADC_CONTR |= 0x40;       // 啟動ADC轉(zhuǎn)換
    _nop_(); _nop_(); _nop_(); _nop_(); // 短暫延時
    while (!(ADC_CONTR & 0x20)); // 等待轉(zhuǎn)換完成
    ADC_CONTR &= ~0x20;      // 清除完成標(biāo)志
    res = (ADC_RES << 8) | ADC_RESL; // 合并高8位和低8位
    return res;
}
//ADC軟件濾波(連續(xù)讀取8次)
unsigned int ADC_FILTER(void) {
    unsigned char i, j;
    unsigned int k;
    unsigned long sum = 0;
    unsigned int vccvlaue = 0;
    unsigned int nADC_BUFF[8];  //改成數(shù)組
    // 采集8個樣本
    for(i = 0; i < 8; i++) {
        nADC_BUFF[ i] = ADC_READ(); //存入數(shù)組對應(yīng)位置
    }
    // 冒泡排序(升序)
    for(j = 0; j < 7; j++) {
        for(i = 0; i < 7 - j; i++) {
            if(nADC_BUFF[ i] > nADC_BUFF[i+1]) {
                k = nADC_BUFF[ i];
                nADC_BUFF[ i] = nADC_BUFF[i+1];
                nADC_BUFF[i+1] = k;
            }
        }
    }
    // 取中間4個值(索引3~6)求平均
    for(i = 3; i <= 6; i++) {
        sum += nADC_BUFF[ i];[ i]
    }
    sum = (sum + 2) / 4; // 四舍五入并求平均


    // 計算VCC(使用帶隙電壓bgv),1024對應(yīng)10位ADC
    vccvlaue = (unsigned int)(1024UL * bgv / sum);
    return vccvlaue;
}
void VCC_CAL(void) {
    // 初始化ADC
    //P_SW2 = 0x80; //允許訪問擴展寄存器。但是IO配置中已經(jīng)打開
    ADCTIM = 0x3F; //設(shè)置ADC采樣時間
    ADCCFG = 0x2F; //ADC時鐘 = 系統(tǒng)時鐘/2/16
    ADC_CONTR = 0x8F; //使能ADC,選擇通道15(帶隙電壓)


    //讀取帶隙電壓
    if (bgv == 0) {
        bgv = BGV_READ();
    }


    // 計算VCC
    vcc = ADC_FILTER();//在中斷中調(diào)用這個vcccal函數(shù),而不是調(diào)用adcfilter或者adcread
}



評分

參與人數(shù) 1黑幣 +10 收起 理由
wpppmlah + 10 贊一個!

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表