亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
STC8G直接讀取flash中校準(zhǔn)過的帶隙電壓值直接測(cè)量VCC無需外部連線
[打印本頁]
作者:
千早愛音愛玩51
時(shí)間:
2025-7-2 17:18
標(biāo)題:
STC8G直接讀取flash中校準(zhǔn)過的帶隙電壓值直接測(cè)量VCC無需外部連線
下面的代碼實(shí)現(xiàn)了,通過讀取STC8G1K08A FLASH中記錄的出廠校準(zhǔn)過的帶隙電壓值,直接計(jì)算VCC,過程完全在單片機(jī)內(nèi)部進(jìn)行,不需要外部連線!可以用于單節(jié)鋰電池的應(yīng)用場(chǎng)合直接測(cè)量VCC。
復(fù)用的話直接在定時(shí)器中斷中調(diào)用VCC_CAL函數(shù),給vcc賦值。
代碼調(diào)用后會(huì)在for循環(huán)中采樣8次,輸出數(shù)組,并通過冒泡排序取中間的四個(gè)值,然后四舍五入求平均,不需要測(cè)量頻率很高,100ms一次就行了。
測(cè)量原理:stc單片機(jī)內(nèi)部有一個(gè)電壓接近1.19v的帶隙基準(zhǔn)電壓(后文簡稱BG),出廠校準(zhǔn)值直接存儲(chǔ)在flash中,具體位置可以在手冊(cè)中“存儲(chǔ)器”章節(jié)尋找。通過讀取這個(gè)電壓,再使用ADC測(cè)量15通道的回報(bào)值,就可以直接計(jì)算VCC,這一過程完全在單片機(jī)內(nèi)部實(shí)現(xiàn),不需要外部連線。
具體原理為,adc測(cè)量電壓后會(huì)回報(bào)一個(gè)數(shù)值,叫做碼數(shù),adc是靠比較測(cè)量電壓的,參考源是vcc。如果是十位adc,碼數(shù)范圍為0~1023,12位為4096。stc單片機(jī)adc的15通道固定測(cè)量內(nèi)部bg電壓值,讀取這個(gè)電壓,可以得到1.19v bg電壓對(duì)應(yīng)的碼數(shù),通過除法計(jì)算,可以直接得到毫伏每碼這個(gè)值。而adc測(cè)量vcc,由于參考的就是vcc,所以回報(bào)的是滿量程值,那么就可以省去測(cè)量vcc的過程,直接用滿量程碼數(shù)1024乘以毫伏每碼,直接得到vcc電壓。
而bg電壓是一個(gè)在1.19v左右的值,會(huì)因?yàn)橹圃爝^程產(chǎn)生差異,燒錄程序時(shí)我們可以看到軟件會(huì)回報(bào)帶隙電壓校準(zhǔn)值,實(shí)際上這個(gè)值就是直接存儲(chǔ)在flash中的,所以可以手動(dòng)讀取。這個(gè)值為一個(gè)分為高八位和低八位的十六位二進(jìn)制數(shù),高字節(jié)在前,分為4個(gè)四位二進(jìn)制組,讀取之后可以直接組合為毫伏整數(shù)值。可以直接用于計(jì)算。
//計(jì)算VCC用的變量(全局)
unsigned int bgv = 0;//多個(gè)函數(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; // 啟動(dòng)ADC轉(zhuǎn)換
_nop_(); _nop_(); _nop_(); _nop_(); // 短暫延時(shí)
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個(gè)樣本
for(i = 0; i < 8; i++) {
nADC_BUFF[ i] = ADC_READ(); //存入數(shù)組對(duì)應(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個(gè)值(索引3~6)求平均
for(i = 3; i <= 6; i++) {
sum += nADC_BUFF[ i];[ i]
}
sum = (sum + 2) / 4; // 四舍五入并求平均
// 計(jì)算VCC(使用帶隙電壓bgv),1024對(duì)應(yīng)10位ADC
vccvlaue = (unsigned int)(1024UL * bgv / sum);
return vccvlaue;
}
void VCC_CAL(void) {
// 初始化ADC
//P_SW2 = 0x80; //允許訪問擴(kuò)展寄存器。但是IO配置中已經(jīng)打開
ADCTIM = 0x3F; //設(shè)置ADC采樣時(shí)間
ADCCFG = 0x2F; //ADC時(shí)鐘 = 系統(tǒng)時(shí)鐘/2/16
ADC_CONTR = 0x8F; //使能ADC,選擇通道15(帶隙電壓)
//讀取帶隙電壓
if (bgv == 0) {
bgv = BGV_READ();
}
// 計(jì)算VCC
vcc = ADC_FILTER();//在中斷中調(diào)用這個(gè)vcccal函數(shù),而不是調(diào)用adcfilter或者adcread
}
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1