找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

使用回差迟滞比较切换LED闪烁模式

[复制链接]
ID:1155837 发表于 2025-7-2 16:58 | 显示全部楼层 |阅读模式
最近在做电量显示功能,但是遇到了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模式
    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表