
【常亮24天】 低功耗-迷你桌面时钟(降本版)
简介
本项目是基于传说中的32位51单片机STC32G12K128芯片作为主控的低功耗桌面时钟,在5V 255亮度下在TV模式(出厂默认设置)平均功耗为1.7378mA(6.8593mW),可运行大约24天
简介:本项目是基于传说中的32位51单片机STC32G12K128芯片作为主控的低功耗桌面时钟,在5V 255亮度下在TV模式(出厂默认设置)平均功耗为1.7378mA(6.8593mW),可运行大约24天开源协议
:CC BY-NC-SA 4.0
(未经作者授权,禁止转载)描述
闪屏和拖影为压缩了视频和摄影的问题,实际看不会这样
实际效果可以参考初代的GIF图(下图)或者视频
▎更新计划
√2024.06.27 发布工程 开源PCB 【控制板4.0.4降本】【电源板2.8.5降本】
上传开源工程+源码(不带闹钟)
发布版固件20240627A 升级程序
开源外壳STL、STP文件
√2024.07.03 上传淘宝BOM、立创商城BOM
⚫2024.07.10 上传SOP作业手册(未更新,因为没见有人复刻,就搁置了)
成本
立创商城下单:¥200+ = 150+10(邮费)+30(淘宝买电池、OLED、RTC电池、震动开关、FFC线)+12(3D外壳+运费)
淘宝下单:¥120+ =109+12(3D外壳+运费)
找怨种作者拿料:¥70 = 52(均摊了个数和运费)+ 9(均摊运费3D外壳) + 10运费
发车
本项目第三批16个时钟正在制作中,之前太多人问了,根本忙不过来,工程没敢更新,消息也没敢回,根本不敢吱声
因为很多人留言或者私信我表示想要,而且本项目焊接难度较大,看群里小伙伴制作不成功我非常emo,如果真的想要的话可以私信我(阅读下文注意后),63包邮亏个外壳钱交个朋友,但交期可能要等久一点,作者当黑奴制作需要一些时间
QQ群
基本上是死人群了,没几个人说话,群号:427651038
项目展示视频
降本版功能演示及运行功耗展示:https://www.bilibili.com/video/BV1hZ421g7mz
项目说明
本项目是基于【常亮24天】 低功耗-迷你桌面时钟 https://oshwhub.com/yq-qvq/low-power-consumption-for-24-days-desktop-clock 工程的降本大改改进型,降低成本,目前批量成本大概在¥50+,单个制作成本会在因为邮费无法分摊而上升
本项目是基于传说中的32位51单片机STC32G12K128芯片作为主控的低功耗桌面时钟,在5V 255亮度下在TV模式(出厂默认设置)平均功耗为1.7378mA(6.8593mW),可运行大约24天,搭载RTC、温湿度、磁强、加速度、气压、光强传感器可供开发
注意
本项目供电为软包锂电池,使用时切记请注意安全,充电时人员不要离开,避免对电池造成物理性损伤,避免过充过放短路,避免置于高温或低温等恶劣环境
烧屏问题
本项目使用OLED屏幕,本身如果某个像素长时间点亮,会产生光衰,导致屏幕上留一个“印子”,下图为使用6~7个月后烧屏情况,横线为相机拍摄问题,可以看到经常显示的地方会留有印子,但正常显示时间界面几乎看不出来,除非是进到菜单或者纯白画面。
因此屏幕基本上属于消耗品,每隔一年或者一年半就可以选择更换,如果有介意者请勿复刻或购买
项目变更点
- OLED屏幕通信由原来的SPI改为I8080总线
- 逻辑供电从2.8V下调至2.7V
- 贴片电阻电容从0402换成0603、轻触开关、FFC座子、RTC电池、均进行了跟换,电容统一使用MLCC,PCB重新布局,引脚进行了调整,复位按钮放到屏幕下面,底层驱动全部对应修改
- 降压芯片从TPS62740DSSR改成了ETA3425S2F
- 去掉了熔断保险丝、锂电池保护芯片ME4211AM6、完全依赖软包电池的保护板进行保护
- 去掉4K方波产生电路,改为单片机PWM口直驱,实现音调和音量的调整
- CH340去掉,改为USB直接下载
- RTC增加封装预留,兼容DS3231MZ
- 光强计由原来的BH1745换成OPT3001
- 外壳重新设计
- MCU从STC32F12K54换成STC32G12K128,速度虽然降低,但flash大了一倍,解决32F写满的问题
- 取消OLED对比度电流基准电阻,使用内部基准,但焊盘保留
- 修复程序框架中申请长时间等待任务会导致堵塞的问题
项目硬件资源
●主控:STC32G12K128
●1.3寸OLED:SSD1315
●温湿度计:SHT40
●气压计:SPL-06
●RTC:INS5699(预留DS3231MZ封装)
●光强计:OPT3001
●磁强计+加速度计:BMC050
●蜂鸣器
●震动开关
●按键X5:+、-、确定键、退出键、复位键
项目历史
2020-9月
- 开始项目构思
2020-11-18
- 打样2.0版本的电源管理板,并焊接、测试
2020-12-16
- 打样2.0版本核心板,并焊接、测试
- 打样迭代2.0版本的电源管理板,并焊接、测试
2020-12-25
- 打样2.0版本传感器板,并焊接、测试
2021-01-02
- 打样迭代2.0版本的核心板,并焊接、测试
- 完成代码编写
2021-01-14
- 打样迭代2.0版本的核心板,并焊接、测试
2021-01-17
- 打样迭代2.0版本的核心板,并焊接、测试
2022-6月
- 开始构思低功耗UI框架,并使用开发版进行程序基础框架验证(梦开始的地方)
2022-10-18
- 打样4.0电源板(全新设计),并焊接、测试
2022-12-06
- 打样迭代4.0电源板,并焊接、测试
- 打样4.0控制板(融合2.0核心板+2.0传感器板),并焊接、程序编写、测试
- 开始设计、验证、完事。优化任号务栈入栈出栈、快速批量装填、主菜单、二级菜单、三级菜单等程序的编写
- 开始啃英文手册,写传感器驱动
- 和朋友沉迷MC
2023-10-10
- 打样迭代4.0电源板,并焊接、测试
2023-10-19
- 打样迭代4.0电源板,并焊接、测试
2023-10-23
- 打样迭代4.0电源板(钰泰方案),并焊接、测试
2023-10-27
- 打样迭代4.0电源板(德州仪器方案),并焊接、测试
2023-12-25
- 打样迭代4.0电源板(德州仪器方案2),并焊接、测试
2024-01-16
- 打样迭代4.0电源板V2.8.4(德州仪器方案),并焊接、测试
2024-01-25
- 发布于立创开源社区
2024-01-26
- 打样迭代4.0控制板(I8080总线方案),并焊接、程序编写、测试
2024-03-06
- 打样迭代4.0电源板V2.8.5,并焊接、测试
2024-03-14
- 打样迭代4.0控制板V4.04(SPI方案),并焊接、程序编写、测试
2024-04-29
- 打样迭代4.0控制板(I8080总线方案2),并焊接、程序编写、测试
2024-05-05
- 全新设计4.0电源板V2.8.5(降本),并焊接、测试
2024-06-01
- 迭代设计4.0电源板V2.8.5(降本2),并焊接、测试
- 全新设计4.0控制板V4.0.4(降本I8080总线方案),并焊接、程序编写、测试
2024-06-23
- 试图修复程序框架中申请长时间等待任务会导致堵塞的问题,正在测试,目前未出现异常
功耗
使用合宙CC表进行测试,测试条件为出厂初始设置(OLED 5V 255亮度、电池供电3.84V,降本版电池供电为3.94V,但自动调光关闭)
5V满亮度可以坚持22天,如果打开自动调光的话能坚持更久,可达24天以上
UI展示
主菜单(滚动3.94V 2.5mA):
二级菜单(滚动3.94V 4.3mA):
三级菜单:
TV模式(时钟显示界面):
TV模式(环境显示界面):
TV模式(电源显示界面):
休眠屏显模式:
指南针UI:
UI操作逻辑:
低功耗思路
熟悉PC设备的朋友应该都知道,我们的电脑在闲置的时候,功耗一般比较低,这是因为CPU降频了,处于一种“怠速”的状态。同样,在降低设备功耗的时候,大多数人会采用降频的策略。很多朋友看到我用30M的主频时都会发出疑问:为什么不降频?
不分情况的一味降频,反而会增加设备的功耗。下图测试了STC32G12K128单片机在各个主频下的运行电流
这里我测试了各个主频下单片机运行65535次while(i--)所需的时间,这个是想证明,单片机在处理固定任务量的任务时,所需时间和主频成固定反比,35M主频是5M主频的7倍,那么5M主频处理任务需要的时间也应该是35M主频处理任务需要的时间的7倍,事实上也是如此:79200/11340 = 6.984
但5M主频下消耗的电流却不是35M主频下消耗电流的1/7(0.1428),而是2.287/10.88 = 0.21,这就说明低频执行同样任务量的任务反而会更耗电,也就是uA/MHz更大。
像本项目需要执行的UI刷新,UI刷新的点阵计算就是固定的任务量,uA/MHz越低,就越省电,所以需要高主频去执行这些任务或者计算,完成后无任务,这个时候就进入休眠模式。
软件介绍
软件部分,一些底层的配置采用了STC厂家范例代码,OLED初始化参考了淘宝附赠代码,反三角函数Atan的CORDIC算法参考了红石电路吧的代码,其余部分均为本人自行开发,程序框图如下,使用任务号栈+任务等待时间栈进行任务的预约与执行,中间的等待时间进入掉电模式进行过渡
之所以可以这么省电的缘故是因为MCU不会干多余的事情,有任务的时候才会运行,其他时间都在休眠。因为之前做第一代第二代时钟的时候,就发现一个事情,就是MCU在执行任务的时候,很多时候都在delay,例如滚动数字的时候,平移32格像素,需要平移32次,每次平移后间隔6毫秒才能执行下一次的平移,这个时候,空跑的的时间就是31x6=186ms,这是非常致命的,如果一秒刷新一次,就有18.6%的时间浪费在等待上。再例如给传感器发送测量指令后,需要等待一段时间才能读取测量后的值,这一段时间也是需要等待的。
为了解决MCU在等待时摸鱼的情况,可以让MCU在等待的时候进入掉电模式,从而降低功耗
但这样又不得不面临一个新的问题,就是MCU怎么知道自己什么时候醒过来?因为MCU在进入掉电模式之后主时钟停震,就真的睡死了,怎么知道自己下一次什么时候起来上班就成为一个问题
针对这个问题,像打工人可以预定一个闹钟一样,可以使用掉电唤醒定时器,通过设置掉电唤醒定时器的时间,控制MCU休眠后在我们指定的时间醒过来,然后我们可以再进一步,例如平移32格像素,就定下31个闹钟
为此,我引入两个数组,一个是“休眠时间数组”,一个是“任务号数组”(每个bit代表一个任务),两个数组的值一一对应。例如执行一个32格像素的平移,要执行32次,我就先在“休眠时间数组”和“任务号数组”中预约32个任务,如下图所示。
每次MCU检测数组“休眠时间数组”[0]和“任务号数组”[0]中的数值,如果不等于0,则将“休眠时间数组”[0]的值装入掉电唤醒寄存器,进行休眠,唤醒后再根据“任务号数组”[0]的值匹配相应的任务。任务完成后整个数组的值向左移动一位。当检测到“休眠时间数组”[0]和“任务号数组”[0]中的数值为0时,说明UI刷新任务已经完成,掉电唤醒寄存器关闭,彻底进入休眠,等待外部按键中断任务的唤醒。
但项目中并非只有一个OLED屏幕刷新的任务,对于传感器测量等待的任务,为了尽可能保证时效性,不可能排在UI刷新完成之后再测量,我们当然希望能两不误,这时就需要写插入算法将任务插入任务队列中,例如在队列中插入一个气压测量的任务(“任务号数组”bit1 =1),需要等待15ms(6+6+3),插入上图的队列中,如下图。可以看到当数值不可以重合时,需要打断队列插入数值,3为bit0和bit1都为1
再例如,在上述基础上,再在队列中插入一个气压测量的任务,需要等待12ms,插入上图的队列中,如下图。可以看到当数值重合时,不需要打断队列插入数值。只需要添加任务号所对应的bit位。
通过上文的描述,我们知道单片机在刷新UI动画的时候,并不会一直刷新,像素每一次移动之间,一定是有一定的间隔时间的,否则就会运动过快。例如主菜单模式中,会显示3个32X32尺寸的图标,屏幕长128,图标之间间隔16,所以要完成一次滚动就需要平移48个像素,也就是平移48次,按照每次移动之间等待6ms,完成一次平移需要282ms(不算其他执行的时间),那这282ms的时间,如果单片机没有其他工作的话,那就是在空转。那么我们将等待空转的时间,用休眠代替,就可以把功耗降低了。这个时候就需要将48个间隔的UI刷新任务(任务号0x0001)和 6ms的间隔时间分布压进任务号栈、任务等待时间栈中,由任务休眠等待模块处理,那么单片机就会在接下来的时间里,按照6ms的间隔,从休眠中唤醒48次,每次执行一次UI刷新任务。
下列图片为测试PCB采集到的数据,测试环境为电源板+测试主板(只焊接FFC座子、MCU、按键),测试接入点为电池输出两端:
由于MCU供电是降压2.7V提供,实际2.7V电流最好*1.4换算,当然,最终是电池在供电,使用原始数据也是没什么毛病的
while(1)测试,模拟单片机全运行,可以看到电流大概在7mA左右
主菜单滚动测试,每隔1~2秒让主菜单UI移动一次,可以看到,电流均值在1mA左右,放大可以看到,电流为48个有间隔的尖峰,说明单片机间歇工作48次,完成48次像素移动,然后继续休眠
二级菜单滚动测试,每隔1~2秒让主菜单UI移动一次,可以看到,电流均值在2.9mA左右,放大可以看到,电流为24个有间隔的尖峰,说明单片机间歇工作24次,完成24次像素移动,然后继续休眠,由于需要计算的东西比主菜单移动多,所以看到电流尖峰的脉宽较大,所以耗电较多
由此可以证明,设计的低功耗UI架构已经满足设计的初衷,只有在有任务的时候才干活,而且整个程序中,几乎没有delay,避免了单片机空转,提高了效率。
之前的代码中,该框架存在一个比较严重的bug,就是插队算法,插了,但任务等待休眠的子模块不买账,并不会终止当前任务的休眠,会堵塞到当前任务结束为止。这就导致在等待一些预约时间较长的任务时,整个系统的阻塞会被察觉。例如开启光控后需要每秒获取环境光数据,每次测量后200mS后读数,如果此时位于菜单界面,而且正在进行读取传感器数据的等待中,按下按键,需要等待当前预约的等待时间完成后才能进行UI的滚动,宏观表现上就是按下按键之后会时不时有卡顿感。正确的效果应该是,按键按下后,如果任务等待休眠的子模块正在进行其他任务的休眠,则需要中止,将剩余时间读回并填入任务等待时间栈栈顶,然后再根据中断来源进行任务的插队。之前发现这个bug之后怎么改都不正常,结果2024年6月24号凌晨不死心随便改了一下,竟然改好了,目前测试没发现异常
主要硬件介绍
MCU
本设计使用的MCU为传说中的32位51 STC32G12K128,由于其他系列的单片机不会用,故只能选取该型号,最大主频35M,本项目最大稳定主频为30M,超过就会随机莫名其妙重启,这个问题曾困扰我两个星期
功耗大概在310uA/MHz,,休眠实测在2个uA左右,IO口中断在掉电模式下边缘触发有点硬件上的问题,触发一个可能联动另一个,很难绷得住
供电使用3.7V 1000mA 软包锂电池进行供电
主回路供电
MCU、传感器、蜂鸣器、OLED逻辑供电由ETA3425 DC-DC同步整流降压提供,供电电压设置为2.7V,该电压受限于还要给RTC电池充电,所以不能降的太低
OLED显示供电
OLED自带的电荷泵效率极其拉胯,推荐使用DC-DC升压,并且不推荐同步整流升压,因为效率少有超过80%的
OLED显示供电由MT3608L DC-DC异步整流升压提供,供电电压为5V、6V、7V、8V可选,由MCU控制OLEDV1(开漏)、OLEDV2(开漏)引脚切换
MT9700为限流芯片,防止输出短路
OLEDV1 1 OLEDV2 1 5V
OLEDV1 0 OLEDV2 1 6V
OLEDV1 1 OLEDV2 0 7V
OLEDV1 0 OLEDV2 0 8V
OLEDV1(准双向) 1 OLEDV2 (准双向) 1 13V+ 禁止,原本有隔离mos的,后来降本去掉了
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% |
锂电池充电
锂电池充电由ME4059ASPG-N负责,使用DC-DC同步整流降压进行充电,充电电流约为550mA,可大幅度降低线性充电带来的温升,预留控制脚位EN_2和GHRG
EN_2为ME4059ASPG-N使能脚,可以在充电中测量电池电源的时候,短暂关闭使能,获取真实电池电压
GHRG为充电状态指示端口,可以判断电池状态、有无电池
锂电池保护
完全依赖电池自带的保护板,未预留保护器件焊盘,降本降掉了
锂电池充电电流检测
由INA181A2IDBVT芯片提供50倍差分放大,采样电阻放在低侧,防止漏电(放在高侧会产生11uA左右的漏电流)
其余查看开源原理图即可
目前功能介绍
标准模式
- 烧屏保护
- 时间显示
- 温湿气压
- 电源状态
- 整点报时
- 设置
休眠模式
- 时间显示
- 温湿气压
- 电源状态
- 整点报时
- 深度休眠
- 休眠屏显
- 设置
环境信息
- 温度
- 湿度
- 气压
- 光强
亮度设置
- 屏幕亮度
- 电压档位
- 自动调节
- UI动态
- UI静态
- 极暗模式
- TV静态
- 联动电压
- 亮度倍率
指南针
水平尺
时间设置
- 秒
- 分
- 时
- 星期
- 日
- 月
- 年
- 设置
闹钟(10个闹钟)
- 秒
- 分
- 时
- 日
- 月
- 周六休
- 周天休
- 闹钟时长
- 开关
增量闹钟
秒表
声音设置
- 按键声音
- 声音长度
- 总开关
- 音调调整
- 音量调整
手电筒
电源管理
- 外部供电
- 内部供电
- 供电电压
- 充电电流
- 剩余电量
- 寿命保护(暂无功能)
系统设置
- 保存参数
- 防误触(暂无功能)
- 12时制(暂无功能)
- 屏幕翻转(暂无功能)
- 休眠计划(暂无功能)
- 开始休眠 (暂无功能)
- 结束休眠(暂无功能)
系统信息
- 主控型号
- 温湿度计
- 气压计
- 光强计
- 加速度计
- 磁强计
- 时钟芯片
- 屏幕主控
- 按键数
- 版本号
- 机器型号
- 作者
工厂模式
- 传感器
- 温度补偿
- 湿度补偿
- 气压补偿
- ADC调整
结构介绍
重新建模外壳,复位按键改到屏幕下面,按下屏幕复位,装配稍微有些难度,后面会出作业手册供参考
3D打印使用嘉立创的光固化,半透明树脂
设计图

BOM


评论