历史上的今天
返回首页

历史上的今天

今天是:2024年12月26日(星期四)

正在发生

2019年12月26日 | 关于OELD屏显示电池电量的简易方法

2019-12-26 来源:eefocus

如何采集电源电压大家可能都熟悉,stm32的ADC+DMA能很方便迅速的帮我们采集到自己想要的电压数据。使用DMA进行数据搬运也能很好的减轻CPU的一部分压力。但是这样只是第一步——数据。


用户想看到的有时候并不是数据,他们想要更直观方便的看到自己设备的电量。这就要求我们能在显示屏上通过更直观的方法显示电量。(怎么样,下面这样够直观吧。)

这也是现在嵌入式设备中常用的方法,用一个小电池图标表示,不同的电量里面就是不同的填充度。这样可以很直观的看到设备的剩余电量。


其实说是电量,实际就是用采样来的电压除以总电压,得到一个百分比,然后根据这个百分比显示不同的电池模式,就可以实现不同电量的刷新。一开始看到有人用一个小框框,然后框框里面用一个百分数表示当前的电量百分比,但我觉得那种方法不是很好。还是电池的饱和度更直观一点。


关于stm32的ADC采集电源电压可以看我的上一篇博客,或者网上也有很多优秀的文章,这里暂且假设我们已经获取了电源电压了。而获取电源电压只是第一步,还需要对电源电压进行一下简单的均值滤波。这里我每次在DMA中断里面每30个数取一个平均,得到较为稳定的电源电压。


static void ADC_filter(void)  

{  

    int sum = 0;  

    u8 i = 0;  

    for(i = 0;i < N;i++)  

    {  

        sum+= AD_value[i];  

    }  

    after_filter = sum / N;    //每一次调用这个函数after_filter就更新一次;  

}


上面得到的实际上是ADC的16位原始数据,需要进一步处理成我们需要的实际电压值:


float ADC_cal_aveg(void)  

{  

    float temp = 0;  

    temp = (float)(after_filter) * (3.3 / 4096);//计算电压  

    return temp;  

}  


这样就完成了第一阶段。后面就是利用OLED的显示操作把数字显示成更直观的电池图标。

我的OLED屏是128*64分辨率的,我想在右上角显示一个电池小图标,用PCtoLCD2002取模软件进行图片取模。我选取电池规格为8*16的像素,(我不会告诉你上面这些点都是我一点点点上去的。。)

然后在这个电池里面进行填充,每填充一格就取一次模,所以一共可以取14个模型出来,也就是说电池可以14级电量显示。
这是取出来的部分模型:

3.3V的电压用14级显示出来,那么每3.3/14 = 0.24V就可以刷新一次电池。


所以我就想了可以这样处理,就是把采集来的电压,先除以0.24,得数的整数部分就是他的级数,

3.3V / 0.24 = 13  级,也就是满电量。

2.8V / 0.24 = 11  级

这个级数正好可以被显示函数使用,显示函数就是根据不同的电量级数显示不同的电池模型的。


void OLED_Show_RealTime_Battery(u8 x,u8 y)  

{  

    float ADC_Val = 0;  

    unsigned int ADC_Int = 0;     

    ADC_Val = ADC_cal_aveg();  

    ADC_Int = (int)(ADC_Val / 0.24);  //这个0.24为 3.3/14 得来的数,就是每一级的步长,然后采样电压值除以步长就是级数  

    OLED_Show_Battery(x,y,ADC_Int);   //上面的级数直接在这里面使用,配合电池模型顺序即可。     

 

最后一个函数为OLED的显示函数,可以在屏上显示自己取出的字模。


最后吧这个函数放在主函数的while循环里,不断采样电池电压,不断根据电压刷新电池模型的显示。目前的问题就是不知道这个方法获得的电压是不是稳定。可能还是需要更精确的ADC滤波算法。


到此,就可以在显示屏上面显示不同的电池图标了

推荐阅读

史海拾趣

泽耀科技(Ashining)公司的发展小趣事

泽耀科技(Ashining)深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,泽耀科技还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。

FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC与意法半导体(STMicroelectronics)的合作是其发展史上的又一重要篇章。两家公司共同研发了一种非接触式个性化设置系统,该系统能够在短时间内完成对托盘上有意法半导体ST25DV NFC动态标签的货品的个性化设置,无需打开产品电源或包装。这一创新技术不仅大大提高了产品生产效率,还为客户提供了更加便捷、高效的服务体验。

Gamewell-FCI ( Honeywell )公司的发展小趣事

FEIG ELECTRONIC成立于1978年,作为德国射频识别(RFID)系统的先驱,公司从一开始就专注于RFID技术的研发与制造。在创立初期,FEIG凭借其独特的技术视角和对市场需求的敏锐洞察,成功开发了一系列RFID系统,为物流、零售等行业提供了有效的解决方案。通过不断的技术创新和市场拓展,FEIG逐渐在RFID领域崭露头角。

明微公司的发展小趣事

在全球芯片市场不断扩大的背景下,明微公司面临着原材料供应紧张、价格波动等挑战。为了应对这些挑战,公司积极优化供应链管理,与供应商建立长期稳定的合作关系,确保原材料的稳定供应。同时,公司还加强了对市场需求的预测和分析能力,提前布局产能和库存,有效应对市场变化。这些措施的实施使明微公司在市场竞争中更加稳健。

Amkor公司的发展小趣事

明微公司自创立以来,始终坚持以技术创新为核心竞争力。在数字电视芯片领域,明微团队通过深入研发,成功推出了一款具有高性能、低功耗特点的芯片产品,该产品凭借其卓越的性能和合理的价格,迅速在市场上获得了认可。此后,明微公司继续加大研发投入,不断推出具有竞争力的新产品,逐步在电子行业中崭露头角。

Consolidated Wire公司的发展小趣事

在电子行业的早期,Consolidated Wire公司以其出色的技术研发能力崭露头角。公司投入大量资源研发新型导电材料,成功推出了一种具有更高导电性能和更低电阻的新型线材。这一技术突破不仅提升了电子设备的性能,还降低了能耗,赢得了市场的广泛认可。随着新型线材的普及,Consolidated Wire公司的业务规模迅速扩大,逐渐在电子线材市场占据了领先地位。

问答坊 | AI 解惑

苹果iPod touch拆解分析

iPod touch播放器是苹果iPod家族系列中的最新一员。iPod Touch播放器与iPhone手机极为相似,被认为是“没有通话功能的iPhone”,另外,同iPhone相比,iPod Touch没有蓝牙功能。但是,iPhone手机用户的一些核心体验在iPod touch上都仍然保留,比如,iP ...…

查看全部问答>

在晒一块官方网上的开发板NXP LPC1768

  mbed NXP LPC1768     哈哈,这个按键太帅了,像颗宝石!…

查看全部问答>

SD卡保护

如何获取SD卡特征码? 现在SD卡都是当作存储介质用,其实据说它是有安全特征码的,不知道如何获取呢。…

查看全部问答>

Linux学习讨论,嵌入式开发,加群74459776

Linux学习讨论,嵌入式开发,加群74459776 请注意发色情内容、广告、诅咒类信息 踢!!! 看见请回复顶起!谢谢…

查看全部问答>

为什么在wince上无法用directdraw创建OFFSCREENPLAIN?

我要在一个板上用directdraw显示yuv图象,我是定制系统有把ddraw加到系统上, wince的例程能运行(ddex1,2 3都能运行,就那个蚊子没有什么动静),说明我的版是有支持ddraw. 但我在创建OFFSCREENPLAIN的时候,不能创建成功, 我参数设置如下:   &n ...…

查看全部问答>

提供一个汇编的集成环境MASM611

怎样安装到网上搜去(注意安装完了改那个后缀名,至于有些文档里说的改环境变量什么的,我觉得没有必要) 安装完注意的问题:调试的时候调试窗口不是自己写的源程序时 在编辑状态的点击OPTIONS--->Build OPTIONS在弹出的窗口选中use debug optio ...…

查看全部问答>

UIP学习笔记1

8962的开发板用FlashUserGet()函数并不能从内部得到MAC地址,所以在uip的例程里要直接赋值给ulUser0和ulUser1.为了方便和明显,我这里在FlashUserGet(&ulUser0, &ulUser1);这一语句之后直接设置MAC地址:    ulUser0=0xaaaaaa;&nbs ...…

查看全部问答>

万利的板子现在还能199买到吗?人在深圳。

                                 Re:…

查看全部问答>

运放输出稳定,AD采集结果向一个方向漂移

我用AD8551跨导方式放大光电二极管输出电流(I-V),用万用表检测AD8551输出端结果非常稳定,但是用MAX1304做AD采集,结果却一直向小的方向漂移,大约一个小时漂移10mv(8551输出3v左右时)。现在AD8551输出直接接了AD的输入端。原来曾试过加RC滤波 ...…

查看全部问答>