为什么它能续航这么久?我做对了什么?(见第3章)
其有哪些功能?(见第1章)
硬件设计把稳事变?(见第2章)

下面就逐一为你解答!
一、时钟的功能/亮点展示
1.指南针功能
利用时先原地逐步转一圈即可校准。
此模式下功耗:1.3mA。
2.TV模式(时钟等根本显示)
40秒显示韶光,电池电量。
此模式下功耗:1.7~1.9mA
10秒显示温度、湿度、气压
10秒显示电池状态循环(持续韶光可按喜好调度)
3.菜单设置
设置了三级菜单。
主菜单:见图,这里预设了16个二级菜单。
滚动时总功耗:2mA
二级菜单:见图,按确定进行设置
滚动时总功耗:4mA
三级菜单:见图,按确定进行设置
页面总功耗:1.4mA
支持开拓:水平尺、增量闹钟、秒表、手电筒、系统设置、工厂模式
未来加入亮度自动调节机制,可坚持超过一个月
二、硬件解释
利用STC32F12K54芯片作为主控,在TV模式可运行大约24天,以下是干系电路图。
掌握板事理图
掌握板PCB图
电源板事理图
电源板PCB图
1.掌握板参数先容
主控:STC32F12K541.3寸OLED:SSD1315(利用SPI)温湿度计:SHT40气压计:SPL-06RTC:INS5699光强计:BH1745磁强计+加速度计:BMC050无源蜂鸣器(但有独立4K方波产生电路,不占用MCU资源)震撼开关按键X5:+、-、确定键、退出键、复位键2.电源板参数先容
电源板2.8V空载,5V OFF的情形下,待机电流1.6uA(电池3.83V)
DC-DC锂电池充电:ME4059ASPG-N)锂电池保护:ME4211AM6GDC-DC降压(主板供电):TPS62740DSSRDC-DC升压(OLED供电):MT9700+MT3608L,可以通过主板的两个IO口掌握反馈电阻,从而得到5V、6V、7V、8V充电电流检测:INA181A2IDBVT+50mΩ电阻三、续航24天,我做对了什么?本项目之以是可以这么省电,是由于MCU不会干多余的事情,有任务的时候才会运行,其他韶光都在休眠。
但,事情怎么会这么大略呢?
1.创造的第一个问题
之前做第一代第二代时钟的时候,就创造一个事情:
MCU在实行任务的时候,很多时候都在delay
例如滚动数字的时候,平移32格像素,须要平移32次,每次平移后间隔6毫秒才能实行下一次的平移,这个时候,空跑的的韶光便是31x6=186ms。
这是非常致命的。
如果一秒刷新一次,就有18.6%的韶光摧残浪费蹂躏在等待上。
再例如给传感器发送丈量指令后,须要等待一段韶光才能读取丈量后的值……
这一段韶光也是须要等待的。
办理思路
为理解决MCU在等待时摸鱼的情形,可以让MCU在等待的时候进入掉电模式,从而降落功耗。
2.第二个问题
但这样又不得不面临一个新的问题,便是
MCU怎么知道自己什么时候醒过来?
办理思路
针对这个问题,可以利用:
掉电唤醒定时器
通过设置掉电唤醒定时器的韶光,掌握MCU休眠后在我们指定的韶光醒过来
3.第三个问题
但这样又有一个问题,那便是:
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位。
4.第四个问题
到目前为止,低功耗任务预约的算法算是弄完了,但还有一个问题,便是:
在休眠的过程中,如果有外部中断输入,就会让MCU提前结束休眠。
这样可能会导致传感器采样非常,影响用户体验。
办理思路
这个时候,就须要:
优化就寝的算法
检测醒来的时候,如果掉电唤醒寄存器内的韶光还没有走完,就把值装填回去再次休眠,直到定时器内的值是0为止。
5.末了一步,将MCU性能榨干
事情还没有结束,我们还可以进一步降落功耗,争取榨干MCU性能!
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 发送完成后再唤醒实行别的程序。
这样功耗就可以进一步降落。
除此之外,还有各种优化局部刷新,一点点抠功耗,直至榨干最大性能代价……
参考资料:
[1]开源资料https://oshwhub.com/yq-qvq/low-power-consumption-for-24-days-desktop-clock
— 完 —
嘉立创EDA·头条号
关注我,看一手优质开源项目