Linux系统下点亮Led点阵屏实现原理

1. 环境

驱动Led点阵屏一般的通用做法是使用单片机,其原因是单片机是裸机编程,无操作系统以及复杂的系统调度,扫描Led点阵屏的时间精度较高,因此扫屏时不会出现闪屏或者行亮度不一的情况(若闪屏,则表示行扫间隔太久;若某一行特别亮,则表示每行的扫描时间相差太大)。

当前的实现环境为Linux系统,需要考虑操作系统以及程序调度带来的时间延迟,时间精度不准会造成上述两个问题。

 

2. 实现原理

考虑两种自然而然的做法:

1. 在内核开驱动线程,不停的进行数据移位和行扫。但是这种做法有一个问题,就是线程必须让出时间片,否则系统会整个死掉,但是让出时间片意味着线程需要休眠,由于系统调度,又会导致线程唤醒的时间长度不一,很容易就会导致行亮度不一的情况。

2. 内核提供ioctl接口,用户层开线程不停的数据移位和行扫。这种方式无需考虑让出时间片,但是在用户层进行如此高频率的操作会导致cpu占用很高,同时由于需要在用户层和内核之间切换,系统调度也会带来行亮度不一的问题。

上述两个自然而然的方法都无法控制行扫的时间间隔,有很多行扫是多余的。在Linux下控制Led点阵屏需要解决两个问题:cpu占用率高以及时间精度不准的问题。

 

Led点阵屏显示时需要不停地依次扫描每一行,如果扫描行的时间长度相差太大,就会出现行亮度不一的问题,但通常cpu又无法专门提供一个稳定的时钟用于驱动Led屏。解决办法是中断 + PWM 来驱动Led屏进行扫描,大致过程如下:

1. 将Led屏的数据使能OE脚与两个GPIO相接,GPIO设置为输入,OE复用为PWM。通过PWM,OE脚上能输出周期性的高低电平,且时间精度很高。当电平转换时,两个GPIO脚就能检测到变化,并产生相应的中断,由此进入到中断回调函数

2. 根据Led屏控制的时序,在中断回调函数中进行锁存和行扫。当OE脚电平有效时进行行扫,当OE脚无效时进行锁存。由于PWM电平变化的间隔稳定且精确,每次行扫的间隔也就能稳定,因此也就解决了行亮度不一的问题。

3. 使用PWM作为时钟源还有伸缩性:

(一) 通过控制PWM的周期个数,可控制产生中断的速率,以此来控制屏扫的帧率,帧率可视不同的平台进行不同的设置,不会进行无用的屏扫,以达到降低和控制CPU占用率的问题。

(二) 通过控制PWM的占空比,可实现LED屏的亮度控制,不同硬件可实现不同的亮度等级

 

3. 总结

该方法是操作系统下驱动Led屏的一种通用方法,简单且易用。

 

 

 

 

 

你可能感兴趣的:(Linux系统下点亮Led点阵屏实现原理)