社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1498|回复: 1

【PSoC4心得】LED全彩显示屏

[复制链接]

82

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-12-1 01:14:24 | 显示全部楼层 |阅读模式
1硬件分析
我这里有一块32*32的全彩LED单元板,共计1024个点,假如一个点分为RGB三种颜色,一种颜色要是显示1个字节(256)的灰度值,这样的话一个点至少需要3字节,如果想要显示完一张板子就是3Kbyte的存储空间。再看看PSoC 4 的存储外设RAM和FLASH分别为4Kbyte和32Kbyte,另外4K的SROM不能为我们所用(至少现阶段不能)。如此显示图片只能固化到FLASH中,有之前的一个实验PSOC 4的SRAM估计不够用。
再看看单元板的接口:
  
R1
  
G1
B1
GND
R2
G2
B2
GND
A
B
C
D
CLK
STB
OE
GND
之前做过介绍,在此简单的做一些说明:R1、G1、B1为上半屏数据输入,R2、G2、B1为下半屏数据输入。A、B、C、D为行选择端。CLK为时钟信号,STB为所存输入,OE为输出使能。GND大家都知道是什么。

2解决问题
在选题之前我只是想按自己的想法实现对一张P6全彩板子的控制,至少能实现显示一幅图片。在实现自己想法的过程中,自己有很多疑惑,很多问题想不明白。借助网络资源,我还是学到了很多东西。
2.1灰度的实现
之前的一篇心得写的有点简单了。只是实现了对板子的基本控制,但是LED显示屏如何显示出那么多颜色,这个让我困惑很久,在拿到这个板子之前我就对这个问题想了很久,却不知道从何处下手去找。拿到板子之后,自己收集很多资料,终于知道了实现彩色的原理,虽然有点简单,但却让人难以想象的到。
实现一个LED 实现256*256*256种颜色(16万色)我们都知道使用PWM调节,但是对于LED显示屏来说用逐个实现这个方法很耗时间,而且时间间隔很长,这样显示效果很差。因此可以采用逐位点亮的灰度算法实现对LED显示屏。有了解的人知道LED显示屏是串行数据进行数据传输的,当ABCD四个行显示控制端都为0时选择的是第一行和第十七行。一个LED在一个时间内只能显示一种状态,要么关闭要么打开,我们要实现对LED屏灰度调节最好的方式就是逐位调节。假设传输一行的周期是T,如果那一位为1,则相应的亮对应的几个周期;反之为0则相应的几个周期中为关闭。例如D3为1的在这位后边的8个周期中都是亮,D4为0,后边的16T都为不亮。
  
数据位数
  
占据周期数
D0(最低位)
T
D1
2T
D2
4T
D3
8T
D4
16T
D5
32T
D6
64T
D7(最高位)
128T
假定这个T很小这样的话人的视觉暂留原理人眼可以当成一种固定的颜色。但是这些周期加起来是255T。我们可以计算一下。加入时钟最快PSOC4实验板,的最大时钟24MHz约为42ns这样传输一张板子所需要的时间为32*42ns*255*16=5.48352ms(255指的是255T,42ns指的是一个时钟周期,32指一行所需的时钟周期数,16指的是行数)。虽然只有5点多毫秒,但是不包括其他的一些计算数据的时间,而且要显示的让人感觉正常,这个频率还远不够,人眼总感到闪烁(我曾看300Hz的屏时就感觉到屏在闪),此外真正的实际中不会单独控制一块板子的。这样的唯一好处就是可以达到最大发光效率(100%)。有时候我们不得不舍弃一些东西而且实现另一些东西,比如这里我们就需要牺牲发光效率而实现速度。再看一张表吧。
  
数据位数
  
有效周期数
周期
D0(最低位)
T/8
T
D1
T/4
T
D2
T/2
T
D3
T
T
D4
2T
2T
D5
4T
4T
D6
8T
8T
D7(最高位)
16T
16T
这样的话我们写一行数据总共需要的周期数为34T,发光周期为32T,发光效率为ƞ=32/34 .约为94%,和100%相差不了多少,但是周期缩短了将近7.5倍。常用的还有19T的算法,原理和这个差不多,只是发光效率为84%,扫描周期缩短了13.4倍。
除了这些外还有颜色校正算法,这个牵涉的东西很多,在此不作考虑了。
2.1数字逻辑的实现
   在接触PSOC4之前我用过Altera公司的FPGA,会使用Verilog硬件描述语言,感觉这一点没有什么难的。但是接触UDB模块之后就不这样想了,尤其是Datapath这个非常实用的东西,关于这个Datapath,让我很头疼。我查各种资料,但是介绍这个模块的都是一些英文文档,英语不好的我(大学考了6次四级都没过)只能硬着头皮学学习使用这个模块。
   最开始是在官网上找的视频(http://www.cypress.com/?id=1162&source=home_support),一句一句的听他们讲怎么使用Datapath和使用PSoC Creator。比葫芦画瓢,慢慢的就理解Datapath的用途和Creator的使用。我感觉如果想要掌握PSOC数字逻辑的,首先要掌握的就是这两样东西,在此我同时感到了PSOC的强大之处。
   我看得最多的还有就是这两个文档Components With UDB DatapathsPSoC® 4 ArchitectureTRM 这两个很详细的介绍了Datapath的使用方法。
    在我印象中Datapath基本上等同于一个带运算单元的微控制器,可能说微控制器有点过了,但是一个模块上可以实现加减运算,还可以实现移位、比较运算、屏蔽位、FIFO、级联等功能,这一点也是一个创新点。
最重要的就是这个图了,学习Datapath,这也是PSOC的灵活之处:

Datapath.png

3代码的编写

hh.png
                              
PSOC打开的StartPage上就有一个LED显示屏控制的程序,只不过那个是16*32的,和我要做的相比,少一个行显示控制信号D。当然了我肯定登录了那个网页去看过了,并下载了他的程序代码,通彻的研究过。其实发现他实现的方法和我想的差不多。因此感觉自己没有必要再重复别人的工作了,就算重复也有抄袭的嫌疑。只是在灰度值上原文作者使用的是5位深度的灰度值,3.2万色的,但是我想实现的是16万色。为此我自己有使用Verilog实现了一个元件。代码如下(时间有限,未使用过):

module LED_OE_PWM(
    input  Count0,
    input  Count1,
    input  Count2,// Count0Count2是当前显示的是那一位
    input   SIG,//这个信号输入主要是前级done的输出
    input  Reset,
    input  SysClock,
   
    output reg OE
);
reg [2:0 Count;
always @(posedge SysClock or negedge Reset)
begin
  if(!Reset)  
    Count <= 0;
  else
    Count <= {Count2,Count1,Count0};//汇集三个信号到Count
end
reg [7:0 Number;//为了防止Sum_Temp溢出,选择的这个做延长时间
reg [7:0 Sum_Temp;// 记录周期长度临时计数器
reg [7:0 Sum; //保留上一周期长度,因为现在记得周期数和在下一次才能用到
always @(posedge SysClock or negedge Reset)
begin
if(!Reset)
begin
  Number <= 0;
  Sum <= 0;
  Sum_Temp <= 0;
end
else
  if(!SIG)
  begin
    if(Number>100)
    begin
     Number <= 0;
     Sum_Temp <= Sum_Temp+1;//每隔100个时钟周期记一个数
    end
    else
     Number <= Number+1;// 每隔1个时钟周期记一个数
  end
  else
  begin
    Number <= 0;
    Sum <= Sum_Temp;//记录上一次的周期T
    Sum_Temp <= 0;
  end
end
reg [7:0 LOW;//OE使能时间
always @(posedge SIG or negedge Reset)
begin
  if(!Reset)
    LOW <= 0;
  else
  begin
    case(Count)
    3'b000 : LOW <= {1'b0,1'b0,1'b0,Sum[7:3]};//1/8T
    3'b001 : LOW <= {1'b0,1'b0,Sum[7:2]};//1/4T
    3'b010 : LOW <= {1'b0,Sum[7:1]};//1/2T
    default: LOW <= Sum[7:0];//剩下的就可以按照实例中的操作了
    endcase
  end
end
always @(posedge SysClock)
begin
  if(LOW >Sum_Temp)
    OE <= 0; //输出使能
  else
    OE <= 1;
end
endmodule
下图为内部结构图:

yl.png

在硬件编译时候出现如下错误:

err.png

大概意思就是内部资源不够,可见之前的作者选择是正确的。在此我也学习了很多。
4 PSOC4最后心得
可编程器件在未来的应用前途不可限量,Cypress可以把MCU和可编程模块(数字和模拟)这么完美的集合在一起,发挥了MCU和可编程器件的各自优势。我从内心上喜欢这款PSOC器件。当然也有些地方感觉不足之处,例如内部存储小了点,UBD也就4个,不能做一些更为复杂的功能。如果PSOC4拥有PSOC3一样的价格和UBD个数该有多好啊。CapSense也是一个很好用的模块,是触摸按键变得更为简单,更为实用。此次试用没有涉及到模拟部分的,感觉很遗憾,我会在以后的工作学习中继续探索这个套件的使用,而并不以这个比赛的结束而结束。
5.结束语
比赛结束了,感觉自己总有各种事情要去做,自己只能在夜深人静的时候去学习,去看点资料,进行自己的梦想。白天的工作真的很无聊。在小公司中,工程师都是万能的,什么活都得干,而且干的和自己技术一点关系都没有。不抱怨了,这次比赛的确是自己在仓促中进行的,正赶上我买房子,花了不少时间。
    时间总会过去的,这不又凌晨了。

构造全彩控制器.docx (351.54 KB, 下载次数: 17)


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2016-2-2 13:03:04 | 显示全部楼层
就是需要這個,謝謝


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-19 14:45 , Processed in 0.100670 second(s), 19 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表