柔性OLED低功耗编程:动态调整刷新率延长穿戴设备续航
穿戴设备里屏幕常是整机耗电大头,柔性OLED省电不是只调背光,而是“该动时才刷”。LTPO背板把LTPS和氧化物TFT放一起,漏电低,静态画面能撑到1Hz自刷,刷新率按内容在1/10/30/60Hz之间切,才是AOD长续航的底子。
一、刷新率档位按场景分
别全程60Hz。状态机大致三档:
垂腕/AOD:只显示时间、心率、步数 → 1Hz
静态表盘查看:无动画 → 10~15Hz够用
抬腕滑动/动画/计时器跳动 → 30~60Hz
亮屏主界面 → 60Hz
DDIC切档通常不是标准DCS一条命令通吃,而是屏厂私有时序命令:进Doze、选内部timing group、配VFP/TE周期。 驱动层封装成set_panel_fps(mode)即可,应用别碰裸命令。
二、切档时机:别在帧中间切
最容易出现闪一下、暗场抖、Gamma偏移,就是刷新率切换没对齐TE。
规则:
切档前先停新帧下发
等TE上升沿(DDIC允许主机发数的窗口)
发doze/exit-doze命令
恢复MIPI时钟和HS/VS
再开始送图
typedef enum { FPS_1HZ, FPS_10HZ, FPS_30HZ, FPS_60HZ } fps_mode_t;
static fps_mode_t cur_fps = FPS_60HZ;
void request_fps(fps_mode_t m){
if(m==cur_fps) return;
wait_te_high(); // 对齐帧边界
panel_send_seq(fps_seq[m]); // 屏厂私有命令表
cur_fps = m;
}
视频模式屏改的是VFP拉长;命令模式屏是DDIC从内部GRAM自刷,主机可以睡。
三、AOD只刷脏区域
1Hz不代表整屏重绘。时间秒跳才动秒针区,心率不变就别碰:
void aod_refresh(void){
if(time_sec_changed()){
dirty_rect(0, 0, 60, 20); // 时间区
draw_time();
}
if(hr_updated()){
dirty_rect(0, 40, 40, 16);
draw_hr();
}
flush_dirty();
}
柔性AMOLED黑色像素不发光,AOD亮度压到几十nit,只点亮10%像素时功耗能压得很低。
四、主控也跟着睡
刷新率降了,主机还60Hz轮询传感器就白省。配合:
主CPU进STOP/深睡,只留低功耗协处理器
陀螺仪/PPG中断唤醒
抬腕角度>阈值再request_fps(FPS_60HZ)
触摸/按钮事件同样升档
if(tilt_wrist()) request_fps(FPS_60HZ);
else if(idle_1s()) request_fps(FPS_1HZ);
MIPI在skip帧期间可降HS时钟,DDIC内部自刷,主机侧功耗再掉一截。
五、低刷闪烁与偏色
1Hz不是白给的,两个坑:
低亮Gamma漂移:低帧率下像素保持时间长,近黑灰阶会亮度脉动,需屏厂烧1Hz补偿LUT
切档瞬间跳亮:退出doze前先把亮度档降一级,稳定后再恢复
调试顺序:
先静态AOD 1Hz亮10分钟看有无闪
抬腕升60Hz看有无亮跳
暗场灰阶拍视频慢放
再测续航
六、落坑清单
全程60Hz跑AOD → 续航直接废
帧中间切fps → 闪屏/TE错位
私有命令照搬别家屏 → 初始化乱
AOD全屏重绘 → 省的那点全吐回去
主机不睡 → DDIC省了主控没省
1Hz不调Gamma补偿 → 暗灰闪
亮度不降档直接退doze → 肉眼亮跳
SPI小屏硬模仿 → 多数SPI OLED不支持DDIC自刷
七、落地顺序
确认屏支持LTPO/命令模式AOD
拿到屏厂fps切换命令表
封装request_fps(),只在TE边界切
AOD走脏矩形+1Hz
抬腕/触摸/动画升30~60Hz
主机配套深睡
暗场Gamma补偿标定
柔性OLED续航优化的本质就一句:像素自发光+刷新率跟着内容走。LTPO给的是能力,代码里不做场景分级、不在TE边界切、不脏区域刷新,屏再贵也省不下电。AOD不是“常亮”而是“常静”——静态时1Hz自刷,动一下才拉满,这才是穿戴设备续航能多撑一两天的真正杠杆。





