|
說起STC15通道ADC范例這個8次平均代碼,當(dāng)然沒有問題。
我之前用20腳STC8G1K08又多出好多腳感覺不爽,近期改8腳STC8G1K08A (練練多腳復(fù)用,體積沒小多少,還厚一些,才便宜幾毛,好手工焊而已)。雙路ADC(因引腳不夠,其中1路直接改用15通道先測MCU供電電壓VCC,再換算電池電壓了,另外一路P55腳復(fù)用,P30P31串口調(diào)試ISPLED復(fù)用等等)。之前2個通道ADC代碼全部放在一起共用不少代碼,只順序切換通道讀取轉(zhuǎn)換一下,沒有刻意中間隔一段時間(之前2個空操作,這次有地方就多加了3個),也沒用8次平均方法,每次都一次順利讀取轉(zhuǎn)換成功。可能是我之前測的內(nèi)置2個都是電池電壓,比較穩(wěn)定或者精度要求沒那么高吧(這次另外一路測的光敏電阻和1M大電阻分壓值,光敏電阻還并聯(lián)了一個LED,罕見見的。。。。玩唄)!
void BAT() //VCC電壓ADC15,P55電壓ADC5,低電量告警及充電指示等(早晚光控代碼另列); P3031P55三腳復(fù)用最簡方案用 230523;
{
u16 res, *BGV; //res:ADC結(jié)果(分辨率); *BGV:指針變量;
res=0; // 230524:int全改為u16沒有問題(但得同時改!);
BGV = (u16 idata *)0xef; //獲取內(nèi)部電壓(1次即可),內(nèi)部1.19V參考源值存放在idata中,EFH高字節(jié)F0H低字節(jié);單位mV;
P5IE=P5M1=0x20, R=G=b=1; //1、ADC前:P55允許輸入短暫置高阻,關(guān)彩燈可提高ADC穩(wěn)定準(zhǔn)確度!
//2. ADC設(shè)置(2句共用):
ADCCFG = 0x2f; //設(shè)置ADC時鐘為系統(tǒng)時鐘/2/16 (含右對齊);
ADCTIM = 0x3f; //設(shè)置ADC內(nèi)部時序:(手冊建議3f,2A~3F);
//3、ADC15: VCC和Vbat電壓檢測;
ADC_CONTR = 0xcf; //使能ADC模塊,并選擇第15通道,啟動轉(zhuǎn)換3合1;
_nop_(),_nop_(),_nop_(),_nop_(),_nop_(); //參考手冊2個空操作
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標(biāo)志
ADC_CONTR &= ~0x20; //清完成標(biāo)志
// ADC_CONTR &= 0x7F; //ADC轉(zhuǎn)換完即斷電更省電; (這里后面再一起關(guān));
res = (ADC_RES << 8) | ADC_RESL; //讀取ADC結(jié)果 (右對齊:高2位低8位,前面自動補(bǔ)0);
VCC =(u16)(1024L * *BGV/res); //先算1次后面再分好; 再處理Vbat修正值+150;
Vbat=VCC+150L; //
//4、ADC5: VP55電壓檢測/早晚判斷;
ADC_CONTR = 0xc5; //使能ADC模塊,并選擇第15通道,啟動轉(zhuǎn)換3合1;
_nop_(),_nop_(),_nop_(),_nop_(),_nop_(); //參考手冊2個空操作
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標(biāo)志
ADC_CONTR &= ~0x20; //清完成標(biāo)志
ADC_CONTR &= 0x7F; //ADC轉(zhuǎn)換完即斷電更省電; (這里后面再一起關(guān));
res = (ADC_RES << 8) | ADC_RESL; //讀取ADC結(jié)果 (右對齊:高2位低8位,前面自動補(bǔ)0);
VP55 =(u16)((u32)VCC*(u32)res >>10); //220524:/1024改右移10位快,注意變量運(yùn)算轉(zhuǎn)換避免溢出錯誤等;
if(CHG==0) //5、低電量告警/自動待機(jī); 未充電有效; 230518;
{
if(Vbat>=3438 && Vbat<=3480) //1-5%告警:紅燈PD2秒快慢閃1遍;同時關(guān)大燈;
{W=R=G=b=1, dl_ms(100),R=0,dl_ms(50),R=1,dl_ms(100),R=0,dl_ms(100),R=1;}
if(Vbat<3438) { W=R=G=b=1, status=2;} //<1%燈全滅轉(zhuǎn)狀態(tài)2:自動待機(jī);
}
else //6、充電狀態(tài)指示:4種; 不進(jìn)PD不待機(jī)! 230516;
{status=3, R=G=b=1; //轉(zhuǎn)狀態(tài)3:充電指示;先滅彩燈;
if (Vbat>4132) {G=0,dl_ms( 100),G=1, dl_ms( 500);} // 100%:綠燈常閃; 可當(dāng)提醒; (95%當(dāng)充滿保護(hù),全按0℃,+5mV);
else
{if (Vbat>4077) {G=0,dl_ms(1000),G=1, dl_ms( 100);} // > 90%:綠燈亮1秒, 閃1次;
else
{if (Vbat>3918) {G=0,dl_ms(1000),G=1, R=0,dl_ms( 100), R=1;} // > 75%:綠燈亮1秒,紅燈閃1次; 230502 增加1檔;
else
{if(Vbat>3716) {R=0,dl_ms(1000),R=1, G=0,dl_ms( 100), G=1;} // > 50%:紅燈亮1秒,綠燈閃1次;
else {R=0,dl_ms(1000),R=1, dl_ms( 100);} //<= 50%:紅燈亮1秒, 閃1次;
}}}}
}
|
評分
-
查看全部評分
|