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