|
最近在做電量顯示功能,但是遇到了LED模式會(huì)在切換閾值附近反復(fù)震蕩的問題,于是就寫了一段回差遲滯比較的代碼,在這里分享出來,做類似功能的可以參考
unsigned char ledmode = 0;//ledmode全局變量聲明
//電壓比較,ledmode切換函數(shù),實(shí)現(xiàn)20mv窗口的回差遲滯比較,避免在閾值震蕩
bit initcurrentseg = 0;//ledmode函數(shù)中上電時(shí)或初始化時(shí),是否給current賦值為ideal的標(biāo)志,休眠時(shí)清空
void LED_MODE(void){
static unsigned char currentseg = 0;//當(dāng)前電壓段
static unsigned char idealseg = 0;//理想電壓段
if(vcc>=4000){//為理想電壓段賦值
idealseg = 0;}
else if(vcc>=3800){
idealseg = 1;}
else if(vcc>=3400){
idealseg = 2;}
else if(vcc>=2750){
idealseg = 3;}
else{
idealseg = 4;}
if(idealseg == 4 && !charging){//如果當(dāng)前電壓跌到2750mv以下,且沒有充電
//如果在充電,就不進(jìn)入虧電狀態(tài),實(shí)際上充電時(shí)并不會(huì)調(diào)用這個(gè)函數(shù),但不影響功能,所以保留
outpower = 1;
return;//不執(zhí)行后面的程序
}
else{
outpower = 0;}
if(!initcurrentseg){//檢測(cè)初始化標(biāo)志,防止分支無命中
currentseg = idealseg;//將當(dāng)前值賦值為理想值
initcurrentseg = 1;//已初始化
}
if(idealseg == currentseg){
ledmode = idealseg;//直接賦值
return;//不執(zhí)行下面的switch和ledmode賦值操作
}
switch(idealseg){//如果需要切換ledmode,執(zhí)行下面的
case 0://idealseg=0
if(currentseg==1 && vcc>=4020){//電壓差20mv以上才恢復(fù)到mode0狀態(tài)
currentseg = 0;}
break;
case 1://idealseg=1
if(currentseg==0 && vcc<4000){
currentseg = 1;}
else if(currentseg==2 && vcc>=3820){
currentseg = 1;}
break;
case 2://idealseg=2
if(currentseg==1 && vcc<3800){
currentseg = 2;}
else if(currentseg==3 && vcc>=3420){
currentseg = 2;}
break;
case 3://idealseg=3
if(currentseg==2 && vcc<3400){
currentseg = 3;}
else if(currentseg==4 && vcc>=2770){
currentseg = 3;}
break;
case 4://idealseg=4
if(currentseg==3 && vcc<2750){
currentseg = 4;}
break;
}
ledmode = currentseg;//輸出led模式
}
|
評(píng)分
-
查看全部評(píng)分
|