黑白CMOS圖像傳感器OV9120的原理及應(yīng)用
關(guān)鍵詞:CMOS圖像傳感器;OV9120;圖像采集
1 概述
隨著CMOS技術(shù)的發(fā)展及市場需求的增加,CMOS圖像傳感器得以迅速發(fā)展。CMOS圖像傳感器具有高度集成化、成本低、功耗低、單一工作電壓、局部像素可編程、隨機(jī)讀取等優(yōu)點(diǎn),適用于超微型數(shù)碼相機(jī)、便攜式可視電話、PC機(jī)電腦眼、可視門鈴、掃描儀、攝像機(jī)、安防監(jiān)控、汽車防盜、機(jī)器視覺、車載電話、指紋識別、手機(jī)等圖像領(lǐng)域。本文介紹的是由美國OmniVision技術(shù)公司生產(chǎn)的OV9120黑白CMOS圖像傳感器,它采用獨(dú)特的傳感器專利工藝技術(shù)和先進(jìn)的算法(algorithms)解決了先前CMOS感光器件固定圖像噪聲(FPN)的限制。因而可廣泛應(yīng)用于數(shù)字靜止攝像、視頻會(huì)議、視頻電話、計(jì)算機(jī)視覺、生物測量等領(lǐng)域。
2 引腳功能
OV9120采用48腳LCC封裝,其引腳排列如圖1所示。
3 結(jié)構(gòu)性能及工作原理
3.1 內(nèi)部結(jié)構(gòu)
OV9120內(nèi)置1312×1036分辨率的鏡像陣列、10位A/D轉(zhuǎn)換器、可調(diào)視頻窗、SCCE接口、可編程幀速率控制、可編程/自動(dòng)曝光增益控制、內(nèi)外幀同步、亮度均衡計(jì)數(shù)器、數(shù)字視頻端口、定時(shí)產(chǎn)生器、黑電平校準(zhǔn)及白平衡控制等電路。其內(nèi)部結(jié)構(gòu)如圖2所示。
3.2 性能特點(diǎn)
OV9120是135萬像素(1312×1036)、1/2英寸的CMOS圖像傳感芯片,它采用SXGA/VGA格式,最大幀速率可達(dá)到30幀/s(VGA),該芯片將CMOS光感應(yīng)核與外圍輔助電路集成在一起,同時(shí)具有可編程控制功能。OV9120芯片的基本參數(shù)如下?
●圖像尺寸:6.66mm×5.32mm,像素尺寸,5.2μm×5.2μm;
●信噪比>54dB;
●增益調(diào)整范圍:0~24dB;
●SXGA輸出時(shí),陣列大小為1280×1024,VGA輸出時(shí),陣列大小為640×480;
●供電電源電壓為直流3.3V和2.5V;
●暗電流: 28mV/s;
●動(dòng)態(tài)范圍:60dB。
3.3 工作原理
CMOS鏡像陣列的設(shè)計(jì)主要建立在逐行傳送的掃描場讀出系統(tǒng)和帶同步像素讀出電路的電子快門之上。而電子曝光控制算法(或系統(tǒng)規(guī)則)則建立在整個(gè)圖(物)像亮度基礎(chǔ)之上。在景像(或布景)正常時(shí),一般曝光都比較理想。但在景像光線不適當(dāng)時(shí),則應(yīng)通過自動(dòng)曝光控制(AEC)白/黑比調(diào)節(jié)來使其滿足應(yīng)用要求。對于VGA格式的輸出,OV9120圖像傳感器的視窗尺寸范圍從2×2到640×480,而對于SXGA格式的輸出,視窗范圍則從2×4到1280×1024,同時(shí)可以在內(nèi)部1312×1036邊界內(nèi)的任何地方定位。變動(dòng)窗口尺寸或位置不會(huì)使幀速(或數(shù)據(jù)速率)發(fā)生變化。幀速可通過主時(shí)鐘下行(down)、插入垂直同步定時(shí)、或采用跳讀技術(shù)的QVGA格式使其發(fā)生變動(dòng)。
OV9120內(nèi)部嵌入了一個(gè)10位A/D轉(zhuǎn)換器,因而可以同步輸出10位的數(shù)字視頻流D[9..0]。在輸出數(shù)字視頻流的同時(shí),還可提供像素同步時(shí)鐘PCLK、水平參考信號HREF以及垂直同步信號VSYNC,以方便外部電路讀取圖像。
ZV端口就是相機(jī)(鏡頭)的焦距調(diào)節(jié)視頻端口。OV9120的ZV功能能使相機(jī)透鏡變焦而急速移向(或移離)目標(biāo)。OV9120可利用外部主導(dǎo)機(jī)構(gòu)(master device)設(shè)定曝光時(shí)間。當(dāng)FREX被置位于1時(shí),像素陣列被迅速充電,傳感器保持為高以拍攝圖像(或物像)。在FREX轉(zhuǎn)換到0時(shí),視頻數(shù)據(jù)流(data stream)用逐行讀出方式交付到輸出端口。當(dāng)數(shù)據(jù)從OV9120視頻輸出端輸出時(shí),應(yīng)特別注意防止圖像陣列曝光影響拍攝圖像數(shù)據(jù)的完整性。與畫面曝光速率同步化的自動(dòng)快門能夠?qū)⑦@種影響降到最小程度。
當(dāng)OV9120的RESET腳拉高至VCC時(shí),全部硬件將復(fù)位。同時(shí)OV9120將清除全部寄存器,并復(fù)位到它們的默認(rèn)值。實(shí)際上,也可以通過SCCB接口觸發(fā)來實(shí)現(xiàn)復(fù)位。
由于SCCE端口能夠訪問內(nèi)部所有寄存器,所以,OV9120的內(nèi)部配置可以通過SCCE串行控制端口來進(jìn)行。SCCB的接口有SCCE 、SIO_C 、SIO_D三條引線,其中SCCE是串行總線使能信號,SIO_C是串行總線時(shí)鐘信號,SIO_D是串行總線數(shù)據(jù)信號。SCCB對總線功能的控制完全是依靠SCCE、SIO_C、SIO_D三條總線上電平的狀態(tài)以及三者之間的相互配合來實(shí)現(xiàn)的??刂瓶偩€規(guī)定的條件如下:當(dāng)SCCE由高電平變?yōu)榈碗娖綍r(shí),數(shù)據(jù)傳輸開始。當(dāng)SCCE由低電平轉(zhuǎn)化為高電平時(shí),數(shù)據(jù)傳輸結(jié)束。為了避免傳送無用的信息位,可分別在傳輸開始之前和傳輸結(jié)束之后將SIO_D設(shè)置為高電平。在數(shù)據(jù)傳輸期間,SCCE始終保持低電平,此時(shí),SIO_D上的數(shù)據(jù)傳輸由SIO_C來控制。當(dāng)SIO_C為低電平時(shí),SIO_D上的數(shù)據(jù)有效,SIO_D為穩(wěn)定數(shù)據(jù)狀態(tài)。而當(dāng)SIO_C上每出現(xiàn)一正脈沖時(shí),系統(tǒng)都將傳送一位數(shù)據(jù)。
OV9120有兩種工作方式:主模式和從模式。主模式下,OV9120作為主導(dǎo)設(shè)備,此時(shí)XCLK上的外部晶振輸入經(jīng)過內(nèi)部分頻后可得到PCLK信號。當(dāng)OV9120采集到圖像后,在PCLK的下降沿到來時(shí),系統(tǒng)便可依次將像素值輸出,此時(shí)外部只是被動(dòng)的接收信號。而在從模式下,OV9120則可作為從屬設(shè)備,此時(shí)XCLK不能與外部晶振相接,但可以受外部器件,也就是主設(shè)備信號的控制。即由主導(dǎo)設(shè)備發(fā)送一個(gè)MCLK時(shí)鐘信號,并在此信號的同步下依次發(fā)送像素值。
4 OV9120在圖像采集系統(tǒng)中的應(yīng)用
整個(gè)圖像采集系統(tǒng)主要由OV9120圖像傳感芯片、CPLD控制模塊、RAM存儲(chǔ)器、DSP信號處理器、晶振電路等幾部分組成。
在本系統(tǒng)中,OV9120作為系統(tǒng)的圖像傳感器,首先在其內(nèi)部將獲取的圖像采樣量化,然后在外部邏輯的控制下輸出數(shù)字圖像,并存入圖像存儲(chǔ)器。CPLD作為采集系統(tǒng)核心控制邏輯的主控模塊,可用來協(xié)調(diào)其它各模塊的工作。OV9120的SCCB總線參數(shù)配置是整個(gè)控制邏輯模塊執(zhí)行的起點(diǎn),只有利用SCCB總線將OV9120配置完畢后,才能進(jìn)行圖像采集工作。OV9120采集得到的圖像數(shù)據(jù)可存儲(chǔ)到SRAM中以供DSP使用,從而完成圖像采集系統(tǒng)與DSP識別系統(tǒng)之間的交互操作。其系統(tǒng)原理圖如圖3所示。
系統(tǒng)上電后,應(yīng)首先對CMOS圖像采集芯片進(jìn)行初始化,以確定采集圖像的開窗位置、窗口大小和黑白工作模式等。這些參數(shù)均受OV9120內(nèi)部相應(yīng)寄存器值的控制。由于內(nèi)部寄存器的值可以通過OV9120芯片上提供的SCCB串行控制總線接口來存取,所以,CPLD就可以通過控制SCCB總線來完成參數(shù)的配置。
配置的具體方法可采用三相寫數(shù)據(jù)的方式,即在寫寄存器過程中先發(fā)送OV9120的ID地址,然后發(fā)送寫數(shù)據(jù)的目地寄存器地址,接著是要寫的數(shù)據(jù)。如果連續(xù)給寄存器寫數(shù)據(jù),那么,寫完一個(gè)寄存器后,OV9120會(huì)自動(dòng)把寄存器地址加1,然后在程序控制下繼續(xù)向下寫,而不需要再次輸入地址,這樣,三相寫數(shù)據(jù)就變成了兩相寫數(shù)據(jù)。由于本系統(tǒng)只需對有限個(gè)不連續(xù)寄存器的數(shù)據(jù)進(jìn)行更改,而對全部寄存器都加以配置會(huì)浪費(fèi)很多時(shí)間和資源,所以,可以只對需要更改數(shù)據(jù)的寄存器進(jìn)行寫數(shù)據(jù)。而對于每一個(gè)變化的寄存器,則都采用三相寫數(shù)據(jù)的方法。
系統(tǒng)配置完畢后,將進(jìn)行圖像數(shù)據(jù)的采集。在采集圖像的過程中,最主要的是判別一幀圖像數(shù)據(jù)的開始和結(jié)束時(shí)刻。在仔細(xì)研究了OV9120輸出同步信號(VSYNC是垂直同步信號、HREF是水平同步信號、PCLK是輸出數(shù)據(jù)同步信號)的基礎(chǔ)上,用VHDL語言便可實(shí)現(xiàn)采集過程起始點(diǎn)的精確控制。
VSYNC的上升沿表示一幀新的圖像的到來,下降沿則表示一幀圖像數(shù)據(jù)采集的開始(CMOS圖像傳感器是按列采集圖像的)。HREF是水平同步信號,其上升沿表示一列圖像數(shù)據(jù)的開始。PCLK是輸出數(shù)據(jù)同步信號。HREF為高電平即可開始有效地?cái)?shù)據(jù)采集,而PCLK下降沿的到來則表明數(shù)據(jù)的產(chǎn)生,PCLK每出現(xiàn)一個(gè)下降沿,系統(tǒng)便傳輸一位數(shù)據(jù)。HREF為高電平期間,系統(tǒng)共傳輸1280位數(shù)據(jù)。也就是說:在一幀圖像中,即VSYNC為低電平期間,HREF會(huì)出現(xiàn)1024次高電平。而下一個(gè)VSYNC信號上升沿的到來則表明分辨率1280×1024的圖像采集過程的結(jié)束。
實(shí)現(xiàn)采集的軟件設(shè)計(jì)可在MAX+plusII環(huán)境中實(shí)現(xiàn)。軟件設(shè)計(jì)的主要工作是CPLD對OV9120的配置。在開始充電時(shí),首先對系統(tǒng)進(jìn)行初始化。CPLD的全局時(shí)鐘可用24MHz的晶振電路產(chǎn)生。配置時(shí)首先配置SCCB,配置完畢后將SCCE置1。當(dāng)接收到DSP的開始采集信號后,根據(jù)同步信號的狀態(tài)來判定是否開始采集數(shù)據(jù),采集數(shù)據(jù)的同時(shí)可將數(shù)據(jù)送往SRAM。當(dāng)DSP接收到CPLD的讀取信號后,即可開始讀取數(shù)據(jù),并在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;