Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1204603
  • 博文数量: 232
  • 博客积分: 7563
  • 博客等级: 少将
  • 技术积分: 1930
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-21 11:17
文章分类

全部博文(232)

文章存档

2011年(17)

2010年(90)

2009年(66)

2008年(59)

分类:

2009-05-26 16:32:24

如果想好一些的页面格式或者下载源代码可以到我的个人网站:

做这个摄像头本来也很无奈.
因为买不到好的模块啊.
不是太贵就是质量太差,要不就是又贵又差.
所以就想,不如自己做一个好了.
事情就这样定下来了.
 
从淘宝寄来OV7640的当天就把硬件完成了.
麻烦的其实是软件.OV官方说"为了给第三方开发者空间,所以不提供例程".
所以我只好抱着一个标记着"preliminary"的OV7640文档.看着含糊不清的说明慢慢的尝试.


电路原理图:

 (原文件名:OV7640电路原理图.gif) 



做完的实物:

 (原文件名:实物图.JPG) 



在Linux上编写了上位机的程序来采集图象,采用串口 115200,n,8,1 进行通信.


OV7640拍摄的图象:

 (原文件名:样片.jpg) 



左图为RGB565,QVGA,右图为255级灰度.
 
 
 关于SCCB的总线协议:
 
SCCB协议充分展现了产商的协议不统一是一件多么麻烦的事情.
SCCB协议就是 Serial Camera Control Bus. 不晓得它和I2C哪个先出生.
这里只说明单字节操作.
 
SCCB的单字节写操作协议完全和I2C一样:
 
起始位 ---> 器件地址(0x42) ---> ACK ---> 内部寄存器地址 ---> ACK ---> 写入数据 ---> ACK ---> 结束位
 
在I2C总线当中,器件地址的最后一位为 0 时表示为写操作的开始,最后一位为 1 时表示读操作的开始.
所以在使用ARM9例如 AT91系列的TWI总线接口时,器件地址应该等于 0x21(7位),再根据读写操作的选择补充最后一位为1或者为0.
 
SCCB协议的单字节随机地址读协议比I2C的多出了一个停止位:
 
起始位 --> 器件地址(0x42) --> ACK --> 内部寄存器地址 --> ACK --> 结束位 --> 起始位 --> 器件地址(0x43) -->ACK --> 数据 --> NOACK --> 停止位 
 
而I2C的单字节随机地址读操作为:
 
起始位 --> 器件地址(0x42) --> ACK --> 内部寄存器地址 --> ACK --> 起始位 --> 器件地址(0x43) -->ACK --> 数据 --> NOACK --> 停止位 
 
红色标记的读协议就是SCCB总线所特有的.
不管怎样,如果用现成的ARM9外设的I2C接口,只能执行写操作.如果需要读操作需要自己编写SCCB的模拟总线,加上SCCB多生出来的一个停止位.
 
 
 
 
关于OV系列的寄存器设置:
 
这个要怪OV,你说不给例程也就罢了吧,连个寄存器的使用说明都没有.许多设置含含糊糊的让人不知所错.
我只好一一尝试.不管怎样,下面的这些寄存器对于采集图象来说是常用的(针对OV7640):
 
              地址                                          主要用途                                                                  范例值  
              0x11               OV器件时钟分频                                                      0x3f  时钟分频到最大,其余选项为默认 
              0x28               选择黑白模式(OV7141)或者彩色模式(OV7640)            0x60 选择黑白模式,其余选项为默认(系统默认为彩色模式)
              0x14               QVGA格式或者VGA格式选择                                    0x24 QVGA输出, 0x04 VGA输出
              0x1F               RGB565或者RGB555格式选择                                  0x11 RGB565输出
              0x12               自动白平衡,RGB和YUV设置                                      0x18 关闭自动白平衡,其余默认
 
如果在OV7141~黑白模式下设置OV7640彩色模式用到的寄存器会造成图象黑屏.
有一些寄存器的功能有重叠,例如在0x1F设置了RGB565或者RGB55输出,就不需要在0x12中选择RGB输出.
 
 
 
 
关于硬件的连接方法(for ARM):
 
   输入线:         HREF   VSYNC   PCLK   Y[7:0]
   输出线:         PWDN  RESET  
   外部时钟:      CLK
   SCCB总线:   TWI等I2C总线(只能写),或者模拟SCCB总线(读写)
 
 
 
 
关于图象采集:
 
 对于图象的采集需要用到 HREF   VSYNC   PCLK   Y[7:0]
 其中  HREF 为行同步, VSYNC为帧同步,PCLK为数据输出的时钟,Y[7:0]为数据总线.
 VSYNC出现一次正脉冲说明一帧图象已经准备好,HREF由0-->1说明1行图象数据已经准备好.
 采集顺序为:
 
 等待VSNYC的正脉冲 ---> (循环)等待HREF由 0 到 1 ---> (循环)当PCLK由 0--->1的时候采集Y[7:0]上的数据 --> HREF由 1 到 0(一行结束)
 
 
 
关于采集图象的质量:
 
 CMOS的30万摄像头,我本来也不对图象质量报太高期望.
 不管怎么说,问题出现在两个方面:
 
 1. 所用的镜头滤镜
 2. 图象采集的频率
 
 很难找到和手头芯片一致符合的镜头,某些不合适的镜头的滤镜可能会造成图象的色彩失真.
 采集的频率决定了自动白平衡和自动增益的参数设定,如果采集的频率很小,例如1秒钟只采集一幅图象,那么自动白平衡有可能得不到足够的参数而使得图象失 真.这个时候关闭自动白平衡反而会比较好.
 
 
 
 
 关于输出图象格式:
 
 采集到的图象通常有几种格式:  黑白,RGB565,RGB555,RGB原始图象
 
 黑白图象为 255 级灰度,每一个字节的数据对应一个象素.不需要转换.
 RGB565的输出顺序为:                             第一字节                     第二字节                 
                                          R4 R3 R2 R1 R0 G5 G4 G3      G2 G1 G0 B4 B3 B2 B1 B0
 
转换为RGB24:                         R                              G                               B
                            (R4 R3 R2 R1 R0) * 8        (G5 G4 G3  G2 G1 G0) * 4          (B4 B3 B2 B1 B0) * 8
 
 也就是说RGB565的两个字节数据对应一个象素.
 
RGB555的输出顺序为:                                第一字节                     第二字节                 
                                             X R4 R3 R2 R1 R0 G4 G3      G2 G1 G0 B4 B3 B2 B1 B0
 


例程:
 
图象采集:

 (原文件名:图象读取代码.GIF) 
阅读(4564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~