
【常亮24天】 低功耗-迷你桌面时钟
简介
STC32F12K54作为主控的低功耗桌面时钟,TV模式平均功耗为1.6mA(6.2mW),可运行大约24天,搭载RTC、温湿度、磁强、加速度、气压、光强传感器可供开发
简介:STC32F12K54作为主控的低功耗桌面时钟,TV模式平均功耗为1.6mA(6.2mW),可运行大约24天,搭载RTC、温湿度、磁强、加速度、气压、光强传感器可供开发开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
【低功耗】桌面时钟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结构展示
==========================================================================================
控制板上搭载了一些传感器,可以方便大家做一下别的功能的开发,目前STC32F的flash比较小,正在等待2024年老姚上新的单片机
●主控:STC32F12K54
●1.3寸OLED:SSD1315(使用SPI)
●温湿度计:SHT40
●气压计:SPL-06
●RTC:INS5699
●光强计:BH1745
●磁强计+加速度计:BMC050
●无源蜂鸣器(但有独立4K方波产生电路,不占用MCU资源)
●震动开关
●按键X5:+、-、确定键、退出键、复位键
==========================================================================================
电源板2.8V空载,5V OFF的情况下,待机电流1.6uA(电池3.83V)
ME4059ASPG-N(温度低,最热只有40多度,如果用线性充电的话温度爆炸)
ME4211AM6G(一般锂电池自带保护,可以不焊)
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% |
可以通过配置引脚选择自己喜好的电压:
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芯片
INA181A2IDBVT+50mΩ电阻
==========================================================================================
在上电时,默认进入TV模式,该模式为40秒显示时间,10秒显示温度、湿度、气压,10秒显示电池状态循环(持续时间可按喜好调整),平均功耗为1.6mA
①时间显示界面:时间显示界面会以32x16大小显示当前时、分、秒(滚动!滚动的!),以16x8大小显示当前年、月、日、星期,还会显示电池电量,当充电接入时电池侧边会显示充电接头标志,该界面总功耗为1.7~1.9mA左右
(GIF卡顿的话刷新网页)
②环境显示界面:环境显示界面会以32x16大小显示当前温度,以16x8大小显示当前时、分、秒、湿度,以8x8大小显示当前时气压,还会显示电池电量,当充电接入时电池侧边会显示充电接头标志(肉眼看漏光没这么离谱)
(GIF卡顿的话刷新网页)
③电池显示界面:电池显示界面会以16x8大小显示当前时、分、秒,并显示大号电池图标,并显示现在的电压和充电电流,充电的时候会显示一个很丑的充电动画(电压4.3V是因为我换了个芯片还没有校准)
(GIF卡顿的话刷新网页)
预设16个二级菜单,滚动时总功耗大约为2mA(以下为进度,(×)表示还未开发或未支持):
●标准模式(√)
●休眠模式(√)
●环境信息(√)
●亮度设置(能用)
●指南针(√)
●水平尺(×)
●时间设置(√)
●闹钟(√)
●增量闹钟(×)
●秒表(×)
●声音设置(√)
●手电筒(√)
●电源管理(√)
●系统设置(×)
●系统信息(√)
●工厂模式(×)
(GIF卡顿的话刷新网页)
按确定可以设置,参数滚动时总功耗大约为4mA
(GIF卡顿的话刷新网页)
二级菜单下按确定可以设置,此时总功耗大约为1.4mA
没有固化校准,细节比如角度显示的位置没有调节,使用时需要先原地慢慢转一圈校准,此模式下目前功耗为1.3mA
==========================================================================================
之所以可以这么省电的缘故是因为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 发送完成后再唤醒执行别的程序。
这样功耗就可以进一步降低。
除此之外,还有各种优化局部刷新,一点点抠功耗
==========================================================================================
本次使用三明治结构,及电源板和主板包夹电池,使用电池隔开充电时的热量(但温度传感器不可避免会上升几度),电源板和控制板都尽量将元器件放置在同一面,高度大的元件也进行了沉板设计,进一步降低高度,
最后整机尺寸相较于3.0版本厚度减少了3mm,目前尺寸为(不含按键): 38.93mm X 23.72mm X 30.28mm 结构件为光固化3D打印,挤出式的可能做不了这么薄
底层
顶层
总体
6开源QQ群
设计图

BOM


评论