不知道大家是否观察到过这样一种现象? 使用手机视频拍摄OLED屏幕时,总是会拍摄到OLED屏幕产生倾斜的黑色条纹。就像下面这个样子 拍摄会带有条纹的OLED
产生这个现象的问题是什么呢?其实要从两个方面来看,首先是OLED本身上的,因为OLED同时点亮所有像素点会造成功耗非常高,所以OLED其实是使用的逐个点点亮。在选通一列后,通过一个1/64duty的脉冲快速扫描一遍,将显存中的数据显示出来。我们可以通过一个照片来观察这个现象。 高快门速度下的OLED显示屏 上面讲的另一个方面就是手机曝光,因为手机摄像头是从上到下的逐行曝光,可以看到每一行都有一个像素(实际是刷新了一整行)。这也就解释了上面普通拍摄时候的斜条纹是怎么产生的了。 所以,想要让这个拍摄起来不产生这种条纹,有两种解决方式: 一种是顺应OLED屏幕刷新的方向,将手机横过来拍摄,条纹自然而然的就消失掉了。 另一种方式,就是提高OLED的实际刷新帧率,让手机摄像头捕获不到这个频闪。而这篇文章,将从OLED的技术手册入手,手把手的来教学如何对OLED屏幕进行合理的“超频”。 首先我们需要直接移植一个屏幕厂家给的驱动初始化代码,这里我使用了中景园的51版本OLED驱动进行移植。
首先是找到一个STC的官方例程进行“移花接木”,这里使用了AI8051U实验箱程序“77-DMA SPI刷新OLED12864显示屏程序,SSD1306驱动,0.96寸”,因为我买的是1.3寸OLED屏幕,所以需要稍微进行一些改造。如果是OLED 0.96寸的,可以直接像我这样直接查找对应技术手册和例程。 直接移植初始化程序,发现虽然OLED能正常点亮了,但是却有两列显示花屏了。
在添加了偏移后,屏幕已经正常显示了,接下来,就开始干初始化部分的寄存器!
这里我推荐使用Windows自带的Edge浏览器打开数据手册PDF,用来翻译还是很方便的。 想要让显示帧率提高,首先想到的就是让OLED内部的时钟频率变高,所以我们直接在整篇文档内搜索“pll”“clk”这样的关键词。 经过一番搜索,我们看到这个0xD5指令显然就是设置内部时钟的频率,通过翻译文档得知,0xD5 后面的这个参数,就可以设置分频系数和系统时钟。 首先是A3~A0为分频系数,因为我们是想让这个时钟频率变得更快,所以也就不需要取动这个选项了,因为默认的(POR)值就是1分频。 接下来就是高四位A7~A4,可以看到如果为0101时,系统时钟是默认的fosc,但是如果设置为1111,则会变成150%的fosc。显然,这就是我们所需要的提高时钟频率参数。 综合下来,0xD5指令后面的这个参数,在0xf0的情况下可以将时钟频率拉到最高。
所以我们改动一下这个初始化函数中有关0xD5关键指令的后方数据。 改造完成后,编译程序,烧录,打开手机相机高级模式。 160帧无频闪测试 很好,这下录视频就可以感受到没有频闪条纹的OLED了。同时,因为实际显示帧率的上升,对OLED显存的更高刷新频率也并就并不是毫无提升的事情了。是实实在在会让人感觉到流畅的。
像这样同时提升实际显示帧率和刷写速度,“里应外合”才能得到更好的效果。
|