标题:
使用回差迟滞比较切换LED闪烁模式
[打印本页]
作者:
千早爱音爱玩51
时间:
2025-7-2 16:58
标题:
使用回差迟滞比较切换LED闪烁模式
最近在做电量显示功能,但是遇到了LED模式会在切换阈值附近反复震荡的问题,于是就写了一段回差迟滞比较的代码,在这里分享出来,做类似功能的可以参考
unsigned char ledmode = 0;//ledmode全局变量声明
//电压比较,ledmode切换函数,实现20mv窗口的回差迟滞比较,避免在阈值震荡
bit initcurrentseg = 0;//ledmode函数中上电时或初始化时,是否给current赋值为ideal的标志,休眠时清空
void LED_MODE(void){
static unsigned char currentseg = 0;//当前电压段
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){//如果当前电压跌到2750mv以下,且没有充电
//如果在充电,就不进入亏电状态,实际上充电时并不会调用这个函数,但不影响功能,所以保留
outpower = 1;
return;//不执行后面的程序
}
else{
outpower = 0;}
if(!initcurrentseg){//检测初始化标志,防止分支无命中
currentseg = idealseg;//将当前值赋值为理想值
initcurrentseg = 1;//已初始化
}
if(idealseg == currentseg){
ledmode = idealseg;//直接赋值
return;//不执行下面的switch和ledmode赋值操作
}
switch(idealseg){//如果需要切换ledmode,执行下面的
case 0://idealseg=0
if(currentseg==1 && vcc>=4020){//电压差20mv以上才恢复到mode0状态
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模式
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1