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