在上一篇博文中,我介绍了让人着迷的Adafruit NeoPixel RGB LED,并且大概描述了NeoPixel驱动设计的基本要点。(参见” 亚当泰勒玩转MicroZed连载31:系统模块驱动NeoPixel RGB LED阵列”)在这篇博文中,我将要描述这个设计方案的硬件部分,然后在下一篇博文中描述该方案的整体架构。这个设计方案用到了Zynq SoC中的PS(处理器系统)和PL(可编程逻辑)。
在这个例子中,我选择了去驱动一个1米的NeoPixel LED条,LED密度是是每米30个NeoPixel。数据手册显示可以用5V的电压来驱动NeoPixel阵列工作。但是,仔细阅读数据手册,你会发现最高的工作电压只能在3.2V到3.4V之间,该电压是用来驱动蓝色LED工作的。这样,我们将要采用的MicroZed I/O载体卡输出的3.3V电压正好在这个范围之内。
MicroZed I/O载体卡有两个板级电压稳压器,在Zynq SoC上可以用来给I/O bank34和bank35供电(如果使用Zynq Z7020,还可以给bank13供电)。这两个稳压器的输出电压可以在1.8V、2.5V和3.3V中选择。跟bank35相关联的稳压器有一个比较高的额定电流(2.8A),而跟bank34相关联的稳压器的额定电流为2.3A。因为我们将要驱动的LED数量比较多,因此我将要采用与bank35相关的稳压器来给1米长的NeoPixel阵列供电。
一个NeoPixel中,每一个独立的LED需要的最大电流为20mA,而每个NeoPixel中有三个LED,因此每个RGB像素需要的电流为60mA。每米又有30个NeoPixel,所以在3.3V电压供电情况下,需要的最大电流为1.8A,I/O载体卡提供的两个额定电流都能满足这个要求,但我们选择那个具有高额定电流的稳压器来实现供电。
这意味着连接在NeoPixel阵列上的Pmod线端适配器插头将要插在I/O载体卡的JE、JF、JG或者JH这四个PMOD连接器的其中一个上,因为这四个Pmod连接器是和bank35稳压器连接在一起的。下图描绘了一个Pmod接口的引脚分配。
Pmod连接器的引脚
我使用的Digilent公司的PmodCON1线端适配器仅输出电源、地和四个I/O信号,这些引脚足以用来驱动NeoPixel阵列,因为这个阵列仅仅需要电源、电源回复和数据输入引脚。
我们通过Din引脚来对一个像素的颜色进行编程。每一个NeoPixel需要一个24-bit控制字,包括8位绿色、8位红色和8位蓝色,排列的顺序见下图:
24位数据的组成
NeoPixel没有时钟输入,而采用一个独特的自同步,不归零码的波形来表明位(bit)的值,见下图:
NeoPixel位时钟信号图
通过波形周期和占空比的变化来表明这个位(bit)的值是1还是0,周期时间为:T0H = 0.35微秒, T0L = 0.8微秒, T1H = 0.7微秒, and T1L = 0.6微秒。所有时间值都有± 150纳秒的容差。从这些时间来看,低(0)位(1.15微秒)和高(1)位(1.3微秒)相比,在周期上略有不同。在以后描述软件驱动的博文中,我们将详细分析这个串行通信的机制。
在一个NeoPixel接收到所有24位数据字之后,如果在50微秒内还没有开始接收另外一个数据字,那么它就会把接收到的24位数据字加载到一个内部寄存器中,并使用这个24位值来点亮它的三个LED。然而,如果在50微秒超时周期内,这个NeoPixel又开始接收另一个24位数据字,那么它就把之前接收到的数据字传送到它的Dout端口,而不是把数据字加载到内部寄存器。这个机制可以让你只使用一根串行信号线,通过一种非常简单的方式来控制很多像素。
在下一篇博文中,我将要介绍通过MicroZed I/O载体卡驱动NeoPixel所需要的Zynq PS和PL的架构。同时,为了激起你的兴趣,这是已经完成的方案所输出的波形示例,分别代表输出一个高(1)和低(0)位。
NeoPixel高位输出
NeoPixel低位输出
原文链接:
http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chro...
© Copyright 2014 Xilinx Inc.
如需转载,请注明出处