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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 241|回復: 0
收起左側(cè)

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

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

測量原理:stc單片機內(nèi)部有一個電壓接近1.19v的帶隙基準電壓(后文簡稱BG),出廠校準值直接存儲在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)生差異,燒錄程序時我們可以看到軟件會回報帶隙電壓校準值,實際上這個值就是直接存儲在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;      // 清除完成標志
    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 贊一個!

查看全部評分

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级免费看 | 国产精品伦一区二区三级视频 | 日韩在线中文 | 国产欧美日韩在线观看 | 精品一区二区三 | 亚洲视频在线观看一区 | 少妇综合| 日韩免费看 | 成人免费看片视频 | av黄页 | 亚洲久久久久 | 天天射影院 | 色www| 久久综合伊人 | 又色又爽又黄18网站 | 四虎精品视频 | 亚洲成人黄色 | 狠狠躁日日躁夜夜躁2022麻豆 | 国产亚洲欧美在线 | 亚洲高清视频在线 | 在线观看视频国产 | 欧美激情第二页 | 天天草天天 | 日韩一区二区免费视频 | 成年人黄色大片 | 国产毛片毛片 | www午夜| 精品国产乱码久久久久久88av | av免费网 | 色影视| 日日夜夜人人 | 黑森林av| 免费中文字幕 | 日本黄色视| 伊人久久中文字幕 | 青青国产在线 | 91爱爱爱 | 国产午夜三级 | 在线观看av不卡 | 日韩毛片视频 | 欧美在线观看一区二区三区 |