【常亮24天】 低功耗-迷你桌面时钟 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 【常亮24天】 低功耗-迷你桌面时钟

  • 7.8k
  • 50
  • 188

简介:STC32F12K54作为主控的低功耗桌面时钟,TV模式平均功耗为1.6mA(6.2mW),可运行大约24天,搭载RTC、温湿度、磁强、加速度、气压、光强传感器可供开发

开源协议: GPL 3.0

(未经作者授权,禁止转载)

已参加:“暖冬造物迎新年”征集令

创建时间: 2024-01-25 17:05:08
更新时间: 2024-05-09 18:51:11
描述

【低功耗】桌面时钟4.0

   

  ▎更新日志

        ⚫2024.01.25 发发布工程 开源PCB 【控制板4.0.2】【电源板2.8.4】

        ⚫2024.03.02 更新PCB 【控制板4.0.3】【电源板2.8.5】

                                 发布公版固件YQ-240229A

                                 开源外壳STL、STP文件

        ⚫2024.03.06 更新PCB 【控制板4.0.4】:

                                        ①修改RTC电池电路,适配替代料RX8900CE

                                        ②更正SHT40为SHT41

                                 上传BOM

        ⚫2024.03.14 上传开源工程+源码(不带闹钟)

                                 上传2.8.5电源板作业指导书SOP

                                 订正BOM中50mR电阻的封装,并更改了50mR电阻和200mR电阻的店铺


 

    经历了无数的bug与调试,打板和焊板,终于将我的低功耗桌面时钟做到勉强可以开源的状态。

    首先是大家关心的功耗问题,目前只做了两个方案的对比(OLED 5V  255亮度下测试),因为加了代码和闹钟、静音UI的显示导致功耗变高,只能降一下亮度

【md,由于增加了闹钟显示,年份完整显示,星期UI完整显示和其他功能的算法,导致功耗从1.69mA上升至1.85mA,后续优化代码】

主控 测试固件版本 稳定主频 方案(包含电源板)整体待机电流 3.84V运行功耗(TV模式30分钟平均) 休眠理论坚持时间(1000mAH) 运行理论坚持时间(1000mAH)
STC32G12K128 / 30M 7.8uA 2.1mA(8.2mW) 14.1年 18.8天
STC32F12K54 YQ-240229A 52M 30uA 1.85mA(7.067mW) 3.66年 21.81天
STC8H8K64U / / / / / /

 未来加入亮度自动调节机制,晚上的时候自动最低亮度,或者进入休眠模式,理论上可以坚持超过一个月

这个具体是使用时间,其实还是和亮度关系很大,因为正常显示(非滚菜单)的话,功耗基本在屏幕上,MCU耗电很少,目前已经实验过8080通信方案,结果还是SPI的方案比较省电

所以具体使用的时间,还是已大家设置的亮度,以及显示内容而定。上下文测试数据、展示图片均以出厂初始设置为测试条件(OLED 5V  255亮度、电池供电3.84V)

刚开始我还沉迷STC32G的7.8uA忍痛割爱放弃了STC32F,后来发现我™的电池大啊,1000mAH,算了一下待机,发现就算30uA待机电流,也能练习三年半

目录

  • 1控制板参数介绍
  • 2电源板参数介绍

2.1DC-DC锂电池充电

2.2锂电池保护

2.3DC-DC降压(MCU+传感器供电)

2.4DC-DC升压(OLED供电)

2.5充电电流检测

2.6FFC接口定义

  • 3功能展示

3.1UI操作框图

3.2TV模式

3.3主菜单

3.4二级菜单

3.5三级菜单

3.6指南针

  • 4程序思路架构
  • 5结构展示

 

 

 

==========================================================================================

1控制板参数介绍

控制板上搭载了一些传感器,可以方便大家做一下别的功能的开发,目前STC32F的flash比较小,正在等待2024年老姚上新的单片机

●主控:STC32F12K54

●1.3寸OLED:SSD1315(使用SPI)

●温湿度计:SHT40

●气压计:SPL-06

●RTC:INS5699

●光强计:BH1745

●磁强计+加速度计:BMC050

●无源蜂鸣器(但有独立4K方波产生电路,不占用MCU资源)

●震动开关

●按键X5:+、-、确定键、退出键、复位键

 

==========================================================================================

 

2电源板参数介绍

电源板2.8V空载,5V OFF的情况下,待机电流1.6uA(电池3.83V)

2.1DC-DC锂电池充电

ME4059ASPG-N(温度低,最热只有40多度,如果用线性充电的话温度爆炸)

 

●2.2锂电池保护

ME4211AM6G(一般锂电池自带保护,可以不焊)

 

●2.3DC-DC降压(主板供电)

TPS62740DSSR(10uA有90%的效率,待机电流Iq=360nA)

TPS62740DSSR测试
输出电压(V) 输出电流(mA) 功率(mW) 输入电压(V) 输出电流(mA) 功率(mW) 效率
2.816 0.858536585 2.417639024 3.81 0.664 2.52984 95.56%
2.816 28.16 79.29856 3.81 22.75 86.6775 91.48%
2.809 280.9 789.0481 3.686 244.5 901.227 87.55%

可以通过配置引脚选择自己喜好的电压:

 

●2.4DC-DC升压(OLED供电)

MT9700+MT3608L(升压没有限流保护,单独加一颗限流保护芯片MT9700,自信的可以去掉)

可以通过主板的两个IO口控制反馈电阻,从而获得5V、6V、7V、8V(其实是应该针对OLED最亮和最暗的电流区间做四档覆盖比较合理,后续在改善)

下面是我测试了一些升压芯片的效率

TLV61048(纹波300mV)10uf
输出电压(V) 输出电流(mA) 输出功率(mW) 输入电压(V) 输入电流(mA) 输入功率(mW) 效率
5 1.515  7.576  3.880  2.360  9.157  82.73%
5 3.030  15.150  3.841  4.600  17.669  85.75%
5.037 156.250  787.031  3.740  247.000  923.780  85.20%
MT3608(纹波200mV)22uf
输出电压(V) 输出电流(mA) 输出功率(mW) 输入电压(V) 输入电流(mA) 输入功率(mW) 效率
5 1.042  5.208  3.863  1.610  6.219  83.74%
5 16.667  83.333  3.856  24.130  93.045  89.56%
MT3608L(纹波72mV)10uf
输出电压(V) 输出电流(mA) 输出功率(mW) 输入电压(V) 输入电流(mA) 输入功率(mW) 效率
5.018 1.521  7.630  3.873  2.230  8.637  88.35%
4.986 3.030  15.108  3.873  4.360  16.886  89.47%
5.037 156.250  787.031  3.740  247.000  923.780  85.20%
TPS61041(纹波250mV)22uf
输出电压(V) 输出电流(mA) 输出功率(mW) 输入电压(V) 输入电流(mA) 输入功率(mW) 效率
5.021 1.046041667 5.252175208 3.853 1.593 6.137829 85.57%
5.021 16.73666667 84.03480333 3.853 24.647 94.964891 88.49%
5 1.5151 7.5755 3.841 2.16 8.29656 91.31%
5 3.03 15.15 3.841 4.31 16.55471 91.51%
MIC2251
输出电压(V) 输出电流(mA) 输出功率(mW) 输入电压(V) 输入电流(mA) 输入功率(mW) 效率
5 16.65 83.25 3.861 24.762 95.606082 87.08%

可以看到TPS61041和MT3608效率较高,但是这两个芯片,轻载PFM模式的时候,电压跳动的很厉害,差不多快有1V,所以折中选择了MT3608L芯片

 

 

●2.5充电电流检测

INA181A2IDBVT+50mΩ电阻

●2.6FFC接口定义

 

 

 

==========================================================================================

 

3功能展示

●3.1UI操作框图

●3.2TV模式

    在上电时,默认进入TV模式,该模式为40秒显示时间,10秒显示温度、湿度、气压,10秒显示电池状态循环(持续时间可按喜好调整),平均功耗为1.6mA

        ①时间显示界面:时间显示界面会以32x16大小显示当前时、分、秒(滚动!滚动的!),以16x8大小显示当前年、月、日、星期,还会显示电池电量,当充电接入时电池侧边会显示充电接头标志,该界面总功耗为1.7~1.9mA左右

(GIF卡顿的话刷新网页)

        ②环境显示界面:环境显示界面会以32x16大小显示当前温度,以16x8大小显示当前时、分、秒、湿度,以8x8大小显示当前时气压,还会显示电池电量,当充电接入时电池侧边会显示充电接头标志(肉眼看漏光没这么离谱)

(GIF卡顿的话刷新网页)

        ③电池显示界面:电池显示界面会以16x8大小显示当前时、分、秒,并显示大号电池图标,并显示现在的电压和充电电流,充电的时候会显示一个很丑的充电动画(电压4.3V是因为我换了个芯片还没有校准)

(GIF卡顿的话刷新网页)

●3.3主菜单

    预设16个二级菜单,滚动时总功耗大约为2mA(以下为进度,(×)表示还未开发或未支持):

        ●标准模式(√)

        ●休眠模式(√)

        ●环境信息(√)

        ●亮度设置(能用)

        ●指南针(√)

        ●水平尺(×)

        ●时间设置(√)

        ●闹钟(√)

        ●增量闹钟(×)

        ●秒表(×)

        ●声音设置(√)

        ●手电筒(√)

        ●电源管理(√)

        ●系统设置(×)

        ●系统信息(√)

        ●工厂模式(×)

 

(GIF卡顿的话刷新网页)

●3.4二级菜单

    按确定可以设置,参数滚动时总功耗大约为4mA

 

(GIF卡顿的话刷新网页)

●3.5三级菜单

 

    二级菜单下按确定可以设置,此时总功耗大约为1.4mA

●3.6指南针

    没有固化校准,细节比如角度显示的位置没有调节,使用时需要先原地慢慢转一圈校准,此模式下目前功耗为1.3mA

 

 

==========================================================================================

4程序思路架构

        之所以可以这么省电的缘故是因为MCU不会干多余的事情,有任务的时候才会运行,其他时间都在休眠。因为之前做第一代第二代时钟的时候,就发现一个事情,就是MCU在执行任务的时候,很多时候都在delay,例如滚动数字的时候,平移32格像素,需要平移32次,每次平移后间隔6毫秒才能执行下一次的平移,这个时候,空跑的的时间就是31x6=186ms,这是非常致命的,如果一秒刷新一次,就有18.6%的时间浪费在等待上。再例如给传感器发送测量指令后,需要等待一段时间才能读取测量后的值,这一段时间也是需要等待的。

 

        为了解决MCU在等待时摸鱼的情况,可以让MCU在等待的时候进入掉电模式,从而降低功耗

        但这样又不得不面临一个新的问题,就是MCU怎么知道自己什么时候醒过来?

        针对这个问题,可以使用掉电唤醒定时器,通过设置掉电唤醒定时器的时间,控制MCU休眠后在我们指定的时间醒过来

        但这样又有一个问题,那就是MCU怎么知道下次什么时候醒过来?例如执行一个32格像素的平移,要执行32次,MCU执行了第一次,它怎么知道还要执行32次间隔6ms的任务?

        为了解决这个问题,我想了个办法,就是引入两个数组,一个是“休眠时间数组”,一个是“任务号数组”(每个bit代表一个任务),两个数组的值一一对应。例如执行一个32格像素的平移,要执行32次,我就先在“休眠时间数组”和“任务号数组”中预约32个任务,如下图所示。

 

        每次MCU检测数组“休眠时间数组”[0]和“任务号数组”[0]中的数值,如果不等于0,则将“休眠时间数组”[0]的值装入掉电唤醒寄存器,进行休眠,唤醒后再根据“任务号数组”[0]的值匹配相应的任务。任务完成后整个数组的值向左移动一位。当检测到“休眠时间数组”[0]和“任务号数组”[0]中的数值为0时,说明UI刷新任务已经完成,掉电唤醒寄存器关闭,彻底进入休眠,等待外部按键中断任务的唤醒。

 

        但项目中并非只有一个OLED屏幕刷新的任务,对于传感器测量等待的任务,为了尽可能保证时效性,不可能排在UI刷新完成之后再测量,我们当然希望能两不误,这时就需要写插入算法将任务插入任务队列中,例如在队列中插入一个气压测量的任务(“任务号数组”bit1 =1),需要等待15ms(6+6+3),插入上图的队列中,如下图。可以看到当数值不可以重合时,需要打断队列插入数值。

        再例如在队列中插入一个气压测量的任务,需要等待12ms,插入上图的队列中,如下图。可以看到当数值重合时,不需要打断队列插入数值。只需要添加任务号所对应的bit位。

        到目前为止,低功耗任务预约的算法算是弄完了,但还有一个问题,就是在休眠的过程中,如果有外部中断输入,就会让MCU提前结束休眠,这样可能会导致传感器采样异常,影响用户体验。这个时候,就需要优化睡眠的算法,检测醒来的时候,如果掉电唤醒寄存器内的时间还没有走完,就把值装填回去再次休眠,直到定时器内的值是0为止。

 

        事情还没有结束,为了进一步降低功耗,还需要进一步降低功耗,MCU最耗电的任务其实是在刷屏的时候,这时候使用SPI发送数据,需要MCU参与其中,不能去干别的事情,这个时候我们可以使用DMA功能,使用双缓冲区,先装填1区,DMA发送1区的数据,在1区发送的时候,装填2区,轮流发送,循环往复,提高MCU的工作效率。

       但单纯DMA发送数据的话,其实还是会更耗电,因为需要将数据从flash搬到XRAM里面,再通过DMA发出去是需要时间的,效率上不如把flash的数据直接发送出去

       这个时候可以利用MCU进入停IDLE模式时,MCU停止工作,但外设还在可以工作的特点,如果在2区填充完成,但1区还没发完的情况下,还可以让MCU进入停IDLE模式,这个时候MCU停止工作,但外设还在可以工作,在IDLE模式等待SPI DMA 发送完成后再唤醒执行别的程序。

        这样功耗就可以进一步降低。

除此之外,还有各种优化局部刷新,一点点抠功耗

 

 

==========================================================================================

 

5结构展示

    本次使用三明治结构,及电源板和主板包夹电池,使用电池隔开充电时的热量(但温度传感器不可避免会上升几度),电源板和控制板都尽量将元器件放置在同一面,高度大的元件也进行了沉板设计,进一步降低高度,

        最后整机尺寸相较于3.0版本厚度减少了3mm,目前尺寸为(不含按键): 38.93mm X 23.72mm X 30.28mm          结构件为光固化3D打印,挤出式的可能做不了这么薄

 

          底层

          顶层

          总体

 


6开源QQ群

 

 

 

 

 

 

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP