黑白CMOS图像传感器OV9120的原理及应用
扫描二维码
随时随地手机看文章
关键词:CMOS图像传感器;OV9120;图像采集
1 概述
随着CMOS技术的发展及市场需求的增加,CMOS图像传感器得以迅速发展。CMOS图像传感器具有高度集成化、成本低、功耗低、单一工作电压、局部像素可编程、随机读取等优点,适用于超微型数码相机、便携式可视电话、PC机电脑眼、可视门铃、扫描仪、摄像机、安防监控、汽车防盗、机器视觉、车载电话、指纹识别、手机等图像领域。本文介绍的是由美国OmniVision技术公司生产的OV9120黑白CMOS图像传感器,它采用独特的传感器专利工艺技术和先进的算法(algorithms)解决了先前CMOS感光器件固定图像噪声(FPN)的限制。因而可广泛应用于数字静止摄像、视频会议、视频电话、计算机视觉、生物测量等领域。
2 引脚功能
OV9120采用48脚LCC封装,其引脚排列如图1所示。
3 结构性能及工作原理
3.1 内部结构
OV9120内置1312×1036分辨率的镜像阵列、10位A/D转换器、可调视频窗、SCCE接口、可编程帧速率控制、可编程/自动曝光增益控制、内外帧同步、亮度均衡计数器、数字视频端口、定时产生器、黑电平校准及白平衡控制等电路。其内部结构如图2所示。
3.2 性能特点
OV9120是135万像素(1312×1036)、1/2英寸的CMOS图像传感芯片,它采用SXGA/VGA格式,最大帧速率可达到30帧/s(VGA),该芯片将CMOS光感应核与外围辅助电路集成在一起,同时具有可编程控制功能。OV9120芯片的基本参数如下?
●图像尺寸:6.66mm×5.32mm,像素尺寸,5.2μm×5.2μm;
●信噪比>54dB;
●增益调整范围:0~24dB;
●SXGA输出时,阵列大小为1280×1024,VGA输出时,阵列大小为640×480;
●供电电源电压为直流3.3V和2.5V;
●暗电流: 28mV/s;
●动态范围:60dB。
3.3 工作原理
CMOS镜像阵列的设计主要建立在逐行传送的扫描场读出系统和带同步像素读出电路的电子快门之上。而电子曝光控制算法(或系统规则)则建立在整个图(物)像亮度基础之上。在景像(或布景)正常时,一般曝光都比较理想。但在景像光线不适当时,则应通过自动曝光控制(AEC)白/黑比调节来使其满足应用要求。对于VGA格式的输出,OV9120图像传感器的视窗尺寸范围从2×2到640×480,而对于SXGA格式的输出,视窗范围则从2×4到1280×1024,同时可以在内部1312×1036边界内的任何地方定位。变动窗口尺寸或位置不会使帧速(或数据速率)发生变化。帧速可通过主时钟下行(down)、插入垂直同步定时、或采用跳读技术的QVGA格式使其发生变动。
OV9120内部嵌入了一个10位A/D转换器,因而可以同步输出10位的数字视频流D[9..0]。在输出数字视频流的同时,还可提供像素同步时钟PCLK、水平参考信号HREF以及垂直同步信号VSYNC,以方便外部电路读取图像。
ZV端口就是相机(镜头)的焦距调节视频端口。OV9120的ZV功能能使相机透镜变焦而急速移向(或移离)目标。OV9120可利用外部主导机构(master device)设定曝光时间。当FREX被置位于1时,像素阵列被迅速充电,传感器保持为高以拍摄图像(或物像)。在FREX转换到0时,视频数据流(data stream)用逐行读出方式交付到输出端口。当数据从OV9120视频输出端输出时,应特别注意防止图像阵列曝光影响拍摄图像数据的完整性。与画面曝光速率同步化的自动快门能够将这种影响降到最小程度。
当OV9120的RESET脚拉高至VCC时,全部硬件将复位。同时OV9120将清除全部寄存器,并复位到它们的默认值。实际上,也可以通过SCCB接口触发来实现复位。
由于SCCE端口能够访问内部所有寄存器,所以,OV9120的内部配置可以通过SCCE串行控制端口来进行。SCCB的接口有SCCE 、SIO_C 、SIO_D三条引线,其中SCCE是串行总线使能信号,SIO_C是串行总线时钟信号,SIO_D是串行总线数据信号。SCCB对总线功能的控制完全是依靠SCCE、SIO_C、SIO_D三条总线上电平的状态以及三者之间的相互配合来实现的。控制总线规定的条件如下:当SCCE由高电平变为低电平时,数据传输开始。当SCCE由低电平转化为高电平时,数据传输结束。为了避免传送无用的信息位,可分别在传输开始之前和传输结束之后将SIO_D设置为高电平。在数据传输期间,SCCE始终保持低电平,此时,SIO_D上的数据传输由SIO_C来控制。当SIO_C为低电平时,SIO_D上的数据有效,SIO_D为稳定数据状态。而当SIO_C上每出现一正脉冲时,系统都将传送一位数据。
OV9120有两种工作方式:主模式和从模式。主模式下,OV9120作为主导设备,此时XCLK上的外部晶振输入经过内部分频后可得到PCLK信号。当OV9120采集到图像后,在PCLK的下降沿到来时,系统便可依次将像素值输出,此时外部只是被动的接收信号。而在从模式下,OV9120则可作为从属设备,此时XCLK不能与外部晶振相接,但可以受外部器件,也就是主设备信号的控制。即由主导设备发送一个MCLK时钟信号,并在此信号的同步下依次发送像素值。
4 OV9120在图像采集系统中的应用
整个图像采集系统主要由OV9120图像传感芯片、CPLD控制模块、RAM存储器、DSP信号处理器、晶振电路等几部分组成。
在本系统中,OV9120作为系统的图像传感器,首先在其内部将获取的图像采样量化,然后在外部逻辑的控制下输出数字图像,并存入图像存储器。CPLD作为采集系统核心控制逻辑的主控模块,可用来协调其它各模块的工作。OV9120的SCCB总线参数配置是整个控制逻辑模块执行的起点,只有利用SCCB总线将OV9120配置完毕后,才能进行图像采集工作。OV9120采集得到的图像数据可存储到SRAM中以供DSP使用,从而完成图像采集系统与DSP识别系统之间的交互操作。其系统原理图如图3所示。
系统上电后,应首先对CMOS图像采集芯片进行初始化,以确定采集图像的开窗位置、窗口大小和黑白工作模式等。这些参数均受OV9120内部相应寄存器值的控制。由于内部寄存器的值可以通过OV9120芯片上提供的SCCB串行控制总线接口来存取,所以,CPLD就可以通过控制SCCB总线来完成参数的配置。
配置的具体方法可采用三相写数据的方式,即在写寄存器过程中先发送OV9120的ID地址,然后发送写数据的目地寄存器地址,接着是要写的数据。如果连续给寄存器写数据,那么,写完一个寄存器后,OV9120会自动把寄存器地址加1,然后在程序控制下继续向下写,而不需要再次输入地址,这样,三相写数据就变成了两相写数据。由于本系统只需对有限个不连续寄存器的数据进行更改,而对全部寄存器都加以配置会浪费很多时间和资源,所以,可以只对需要更改数据的寄存器进行写数据。而对于每一个变化的寄存器,则都采用三相写数据的方法。
系统配置完毕后,将进行图像数据的采集。在采集图像的过程中,最主要的是判别一帧图像数据的开始和结束时刻。在仔细研究了OV9120输出同步信号(VSYNC是垂直同步信号、HREF是水平同步信号、PCLK是输出数据同步信号)的基础上,用VHDL语言便可实现采集过程起始点的精确控制。
VSYNC的上升沿表示一帧新的图像的到来,下降沿则表示一帧图像数据采集的开始(CMOS图像传感器是按列采集图像的)。HREF是水平同步信号,其上升沿表示一列图像数据的开始。PCLK是输出数据同步信号。HREF为高电平即可开始有效地数据采集,而PCLK下降沿的到来则表明数据的产生,PCLK每出现一个下降沿,系统便传输一位数据。HREF为高电平期间,系统共传输1280位数据。也就是说:在一帧图像中,即VSYNC为低电平期间,HREF会出现1024次高电平。而下一个VSYNC信号上升沿的到来则表明分辨率1280×1024的图像采集过程的结束。
实现采集的软件设计可在MAX+plusII环境中实现。软件设计的主要工作是CPLD对OV9120的配置。在开始充电时,首先对系统进行初始化。CPLD的全局时钟可用24MHz的晶振电路产生。配置时首先配置SCCB,配置完毕后将SCCE置1。当接收到DSP的开始采集信号后,根据同步信号的状态来判定是否开始采集数据,采集数据的同时可将数据送往SRAM。当DSP接收到CPLD的读取信号后,即可开始读取数据,并在DSP中完成图像的处理。采集处理的部分主程序如下:
reset2:process(reset_i,n1,clk)
begin
if reset_i=‘0’then scce_p<=‘1’;
else
if(n1=‘1’ or m1=‘1’)then
scce_p<=‘1’;
else scce p<=‘0’;
end if;
end if;
end process reset2;
clk1: process(n1,clk)
variable a: integer range 254 to 0;
begin
if(sio_c_start=‘0’ OR n1=‘1’) then
q<=‘1’;a:=0;
else
if(clk'event and clk=‘1’) then
if(sio_c start=‘1’ and n1=‘0’) then
if a<254 then; a:=a+1;
else a:=1;
end if;
if a<127 then q<=‘0’;
else q<=‘1’; end if;
end if;
end if;
end if;
end process clk1;
lock:process(sio_c_start,q)
variable n: integer range 8 to 0;
begin
if( sio_c_start=‘0’ then load<=‘1’;n:=0;
else
if (q 'event and q=‘0’) then
if n<8 then n?=n+1;
load<=‘0’;
else n:=0;load<=‘1’;
end if;
end if;
end if;
end process lock;
reg1: process(n1,q,load)
variable pp:std_logic_vector(7 downto 0);?
variable b:integer range 7 to 0;
variable c:integer range 13 to 0;
begin
if(n1=‘1’or reset_i=‘0’) then p<=‘1’;c:=0; b:=0;QB<=‘0’;
else
if(q'event and q=‘0’)then
if load=‘1’ then;
c:=c+1?
if c<13 then
if c=1 then
pp:=″11000010″;
elsif c=2 then
pp:=″00001100″;
elsif c=3 then
pp:=″00101001″;
elsif c=4 then
pp?=″11000010″;
elsif c=5 then
pp:=″00001101″;
elsif c=6 then
pp:=″10000000″;
elsif c=7 then
pp:=″11000010″;
elsif c=8 then
pp:=″00010001″;
elsif c=9 then
pp:=″10000000″;
elsif c=10 then
pp:=″11000010″;
elsif c=11 then
pp:=″00010011″;
elsif c=12 then
pp:=″00010111″?
end if;
b:=0;p<=pp(7);
elsif c=13 then
p<=‘0’; QB<=‘1’;
end if;
else
if b<7 then b:=b+1;
pp(7 downto 1):=pp(6 ownto 0);?
p<=pp(7);?
else p<=‘1’;
end if;
end if;
end if;
end if;
end process reg1;