李紅波,李 盛,黃 健
(1.西京學院 理學院,陜西 西安 710123;2.西京學院 信息工程學院,陜西 西安 710123)
光立方體顯示是三維立體顯示[1-4]的一種基本實現形式,近些年在教學科研[5-7]和亮化美化工程[8-9]中有較多應用研究。目前小型光立方體設計[10-12]比較成熟,由于其顯示點數少,電路簡單,能快速設計滿足一定需要的光立方體。但大中型光立方體設計存在較多困難,由于其顯示點數過大,硬件耗材消耗巨大,另外存在焊接工序過多、安裝調試困難等問題,使得鮮有研究者嘗試設計32×32×32點及以上的光立方體,在一定程度上阻礙了大中型光立方顯示器的設計。本文提出基于Proteus軟件的虛擬光立方體及驅動組件建模與設計,利用軟件設計的可重復性、可擴展性、可編程性為大中型光立方體設計帶來了全新的設計思路和工程驗證模型。本文以3D8光立方體為例,詳細闡述了其建模原理過程,并通過相同的設計方法實現了3D16、3D32、3D64光立方體模型建立和仿真驗證,為科研顯示、工程設計、三維虛擬仿真提供設計參考。
如圖1所示,光立方體系統由光立方體、顯示控制器、層驅動器、顯示緩沖器、行列驅動器陣列和3D模型庫組成。光立方體由LED面陣層疊而成,LED面陣由若干個LED燈排列成行列矩陣樣式,同一面陣相同行和相同列LED燈的陰極和陽極分別連在一起,同時把不同面陣相同行LED燈的陰極連在一起并引出,這樣共陰引腳的LED燈就組成了陰極顯示層,由層驅動器驅動,顯示層的全部LED燈陽極引腳作為數據引腳,連接到行列驅動器陣列,本文采用圖1這種常見的陰極顯示層驅動法。

圖1 光立方體系統框圖Fig.1 Block diagram of LED cube system
顯示控制器一般為MCU、DSP和FPGA等控制器,行列驅動器陣列由74HC573等鎖存驅動芯片組成。提供功率輸出的層驅動器由集成功率芯片組成,如ULN2803等。3D模型庫存放著要顯示的三維點數據。光立方體工作時,由顯示控制器通過循環掃描方式依次驅動顯示的層,并從模型庫中讀取該層點數據到顯示緩沖器,由行列驅動器陣列根據緩沖器數值具體控制顯示層LED燈的亮滅。由于人眼的視覺暫留特性,只要刷新頻率足夠大,就可呈現三維立體的顯示。
Proteus軟件支持SPICE、Schematic、Active和VSM四種仿真模型。其中Schematic模型是由Primitive電路元件設計而成的電路模型;VSM模型存在于C++ DLL動態鏈接庫文件中,該模型功能由軟件產生,設計靈活且支持高級仿真功能。本文所提及的模型由VSM模型和Schematic模型方法來設計。Proteus模型設計包括兩步:(1)模型原理圖符號設計[13-14];(2)模型功能設計[13-14]。模型原理圖符號是模型的Proteus電氣元件符號。模型功能反映模型具有的功能特點,可由電路功能或軟件功能實現。
Proteus模型原理圖符號是構建Proteus原理圖的基礎要素,是具有圖形外觀和電氣功能的元件符號。

在圖2(b)的基礎上,添加白背景框和字符名稱,重復操作4.1節最后兩步,符號命名為CUBE3D8_C。然后,添加9個BUS總線型輸入引腳L0[0..7]~L7[0..7]和P[0..7],分別代表行列驅動信號和層驅動信號。選中CUBE3D8_C符號和全部總線引腳,通過Make Device元件制作菜單,參照表1設置元件屬性值。最后,制作好的原理圖符號如圖3中的3D8(LED1)元件所示。

(a)光立方體設計圖(a) Drawing of LED cube

表1 元件屬性Tab.1 Component attribute

圖3 仿真電路圖Fig.3 Diagram of simulation circuit
根據光立方體驅動電路原理,新建原理設計圖,設計圖4(a)和圖4(b)的電路原理圖。

(a)層驅動器原理圖(a) Schematic diagram of floor drive
層驅動器電路由8路INVERTER(U1~U8)緩沖驅動器、DIODE(D1~D8)二極管和RESISTOR(R1~R8)限流電阻構成的子電路組成,模擬ULN2803芯片功能,A[0..7]是層驅動輸入信號,P[0..7]是層驅動輸出信號,二者信號邏輯值互補,且輸出低電平信號有效。
行列驅動陣列電路由8路LATCH_8(U9~U16)和若干RESISTOR限流電阻構成的子電路組成,模擬74HC573芯片功能,D[0..7]是輸入數據信號,L0[0..7]~L7[0..7]是輸出數據信號,C[0..7]是輸出鎖存信號,上升沿鎖存輸出。最后,編譯模型并命名為DRV3D8.MDF文件備用。
繪制如圖3中DRV3D8(U2)所示的原理圖符號,A[0..7]、C[0..7]和D[0..7]均為輸入總線引腳,L0[0..7]~ L7[0..7]和P[0..7]均為輸出總線引腳,用于連接光立方體3D8的輸入總線引腳。通過Make Device元件制作菜單,參照表1設置元件屬性值,其中:
“Device Name=DRV3D8”,
“Reference Prefix=U”,
“MODFILE/Default Value=DRV3D8.MDF”。
Proteus專為VSM模型支持了一套C++ DLL接口類虛函數,包括繪圖模型實例createactivemodel、initialize、animate、plot等函數,數字電氣模型實例createdsimmodel、setup、simulate、indicate、actuate等函數。元件建模時需要在DLL中實現繪圖模型(Graphical Model)接口虛函數和電氣模型(Electrical Model)接口虛函數。繪圖模型接口類用于實現動態人機接口功能,電氣模型接口類用于實現模擬信號和數字邏輯功能。
6.1.1 坐標系
以慣用右手的方式確立三維取模坐標系和二/三維繪圖坐標系,包括光立方體模型坐標系M(i′,j′,k′),光立方體繪圖坐標系D(i,j,k)和F(x,y),如圖5所示。模型坐標系由取模軟件定義,三維繪圖坐標系是光立方體的數據坐標系,二維坐標系是Proteus的顯示坐標系,三者的參考方向不統一,需要坐標轉換。為了方便分析三者坐標關系,現將D坐標系和F坐標系組合在一起,且坐標系O點都設在光立方體的ORIGIN符號原點處,模型坐標系O點固定設在模型的最下層且與ORIGIN符號原點相對處,如圖5所示。以3D8光立方體模型為例,光立方體繪圖三維坐標系D(i,j,k)和三維模型坐標系M(i′,j′,k′)的O點水平點距和垂直點距均為7。于是,M(i′)層數據對應D(j=7-i′)層數據,M(j′)層數據對應D(k=7-j′)層數據,M(k′)層數據對應D(i′=k′)層數據,所以數據坐標點轉換可由式(1)進行轉換,例如M(1,0,2)=D(2,6,7)。

圖5 坐標關系圖Fig.5 Diagram of coordinate relation
M(i′,j′,k′)=D(k′,7-i′,7-j′) .
(1)
同時,由于Proteus的顯示環境是二維的,不能直接顯示三維圖形。所以,利用圖形變換中的平行投影原理[15],把光立方體的各個點平行投影到軟件Proteus的二維顯示平面上,用二維平面點云顯示在視覺上來代替三維圖形,從圖5(a)中知,三維繪圖坐標系D的O點投影到二維顯示平面F的O點。在構建3D8原理圖符號時,已知行列上下層各點之間的數據關系為常量,不難推得三維數據點D(i,j,k)點映射到二維數據點F(x,y)的關系,見式(2)和式(3)。
Fx=80×j+ 120×k,
(2)
Fy=120×i- 80×j+ 40×k,
(3)
其中,式(2)中的80代表j行點的X方向偏移量,120代表k列點的X方向偏移量;式(3)中120代表i層點Y方向的偏移量,40代表k列點的Y方向偏移量,80代表j行點的Y方向偏移量。例如D(5,6,7)→F(1 320,400)。
6.1.2 數據結構
以3D8光立方體為例,模型共有512個點數據,需要64個字節存儲,于是建立unsigned char型模型庫數組CubeData[TYPENUM*64],TYPENUM為模型數量;同時建立unsigned char型光立方體顯示緩沖區RAM3D8[8][8],緩沖區共有8×8×8個位,對應需要點亮的LED燈的數量。
以常見的取模方式為例,如圖5(b)所示。三維模型坐標系M(i′,j′,k′)中,取模時按照坐標正方向依次遍歷i′ →遍歷j′ →遍歷k′,得到8×8×8個位數據,燈亮時位數據取二進制數1,燈滅時位數據取二進制數0,再將遍歷k′的數據位按照k′坐標軸正方向組合成字節數據(先遍歷的為低位,后遍歷的為高位),這樣,每i′層就有8個字節,共8層,總計8×8=64個字節,按照遍歷次序順序存儲在CubeData數組中。
光立方體繪圖三維坐標系D(i,j,k)中,按照坐標正方向依次遍歷i→遍歷j→遍歷k,得到8×8×8個位數據,再將遍歷k的數據位按照k坐標軸正方向組合成字節數據(先遍歷的為低位,后遍歷的為高位),這樣,每i層就有8個字節,共8層,按照遍歷層次序順序存儲在RAM3D[i][0..7]顯示層i的8個字節存儲單元中,共64個字節。
6.1.3 坐標轉換算法
根據數據結構原理和轉換公式,定義了模型數組CubeData,繪圖數組RAM3D和RAM2D,得出坐標轉換算法如表2所示。其中MatrixChange1函數算法(Step1~Step8)實現在顯示控制器中,MatrixChange2函數算法(Step9~Step10)實現在VSM DLL程序中。

表2 坐標轉換算法描述Tab.2 Description of coordinate transformation algorithm
Proteus模型中,光立方體中的LED燈用實心圓代替,所以,點亮控制可通過實心圓的顏色來表示,比如,紅色表示點亮,藍色表示熄滅。Proteus的VSM DLL模型中調用Draw3Dcube函數,通過語句drawcircle(X,Y,20)可以繪制半徑為20 th的實心點,調用語句setbrushcolour(RED)選擇繪圖顏色為紅色。只要遍歷RAM3D數組字節的每一位,根據位值是1就繪制紅色實心圓,位值是0就繪制藍色實心圓。在VSM DLL 程序設計中,分為繪圖和電氣控制兩部分,分別由繪圖狀態機和電氣狀態機進行描述設計,如圖6程序狀態機所示。

圖6 程序狀態機Fig.6 Diagram of program state machine
程序運行后,分別進入Electrical初始化setup和Graphical初始化initialize,之后電氣狀態機進入simulate組合態,該組合態根據P0總線信號的上跳沿,依次循環進入P0→P1→P2→P3→P4→P5→P6→P7→P0狀態,當P7→P0切換時,通過setflag函數設置數據有效dataflag。同時,圖形狀態機在indicate狀態每隔0.05 s采樣一次dataflag,當條件成立即收到一完整數據幀,然后調用MatrixChange函數進行坐標轉換,之后轉移到animate狀態調用Draw3Dcube函數,進行光立方顯示,顯示完成后,又進入前一次狀態,等待數據有效。
在Proteus軟件環境下,搭建的仿真電路如圖3,編制顯示控制程序,編譯鏈接后把生成的可執行文件加載進單片機中。同時,在電路中添加電壓測試點探針,分別是A0~A7、C0~C7、D[0..7]、L0[0..7]~L7[0..7]和P[0..7]。控制器采用通用型單片機AT89C52(U3),工作頻率為11.0592 MHz,內部有256 B數據存儲器、8 kB程序存儲器,程序存儲器固件中有3D模型數據。
在仿真電路中,放置DIGITAL ANALYSIS仿真圖表[16],添加探針信號,設置仿真時長2 s,仿真獲取如圖7所示的完整顯示幀驅動波形。從波形分析知:(1)A[0..7]與P[0..7]總線邏輯值互補,說明層驅動器信號正常。(2)C[0..7]總線中任一鎖存信號Cx(x取值0~7的整數)出現上跳沿時,D[0..7]總線數據總會輸出到Lx[0..7]總線,說明行列驅動陣列信號正常。以上兩點說明DRV3D8(U2)驅動器電路模型工作正常。(3)系統工作時,從A7信號的下跳沿事件開始,該事件既是上一顯示幀的結束,同時也是下一顯示幀的開始,如圖7中的指示箭頭。當新的顯示幀開始時,置A[0..7]總線為0x00,關閉光立方體顯示。然后控制器驅動D[0..7]數據總線連續輸出8字節顯示層數據,同時每個數據依次在Cx信號的上升沿得到鎖存并輸出到Lx[0..7]總線,如圖7中的指示箭頭(C3信號上升沿鎖存D[0..7]總線數據0x08到L3[0..7]中)。在C7信號的上跳沿完成鎖存輸出整個顯示層數據,如圖7中的指示框中的數據。接著,置A[0..7]總線為0x01,開啟光立方體第1層顯示,如圖7中的指示箭頭。顯示一小段時間后,關閉光立方體第1層顯示,即置A[0..7]總線為0x00,如圖7中的指示箭頭。與此同時,開始第2層的顯示流程,包括數據輸出、數據鎖存、開啟第2層顯示、顯示延時、關閉第2層顯示等。照此循環掃描顯示第3~8層,直到第8層顯示完成,如圖7中的指示箭頭。至此,一個完整的光立方體顯示幀就結束了。

圖7 驅動時序圖Fig.7 Diagram of driving sequence
從驅動時序分析可知,光立方體的驅動組件工作時序和控制時序相吻合,驅動電路模型工作正常。但需要說明,由于Proteus軟件圖形仿真在運行速度、刷新頻率和動態顯示視覺效果不及真實情況,所以,仿真時序中要預留出軟件繪制顯示模型的時間,大約50~100 ms,具體數值受計算機運行速度因素影響。
7.2.1 顯示取模
3D8光立方體顯示取模已非常成熟,常用到的軟件是3D8S_alpha上位機,該軟件以三視圖的形式平鋪展開8個二維顯示層,每個顯示層呈現為8×8的二維點陣面,用戶只需用鼠標在顯示層上點擊繪制顯示內容,各視圖面同步更新數據,同時提供了8行×8列的字節模型數據,供用戶建立模型庫使用。本文利用該軟件獲取了“ABC”字符、“箭頭”和“笑臉”圖案模型數據。
3D16光立方顯示取模用到最多的軟件是樂濤工作室開發的3D16光立方仿真軟件,該軟件集成有可視化3D16取模、模型素材導入、動畫方式編輯、在線取模效果仿真、可執行程序代碼自動生成等功能,可極大簡化3D16光立方顯示系統的軟件開發,降低程序開發的難度和時間。但是,這款軟件與樂濤工作室推出的光立方系統硬件綁定配套,所以,該軟件不支持自行設計的光立方系統。文中3D16光立方的顯示模型數據是利用漢字的二維模型數據和文中顯示轉換原理自行建立3D16字符模型的。
三維點云是刻畫三維現實世界最直接和有效的表達方式。目前激光點云是最具代表性的三維數據,主要借助三維激光掃描儀獲取原始數據,后經過點云數據處理獲得。文中的云點仙人球和馬三維點云數據模型來自于斯坦福三維模型數據庫,模型經后期處理保存為文本文件,以方便程序讀取。
7.2.2 模型顯示
通過顯示取模,將3D模型數據存入數組中,編制坐標變換程序和顯示控制程序,編譯生成Hex文件后,加載到仿真電路中進行仿真。3D8光立方體顯示效果如圖8所示,光立方顯示器在字符、圖形圖案等顯示方面空間感較強,立體效果較好。為了呈現較強的立體表現感,在光立方體模型程序DLL中加入了色彩表現功能。

圖8 顯示效果圖Fig.8 Image of display effect
需要說明的是,3D8光立方體點數少,在顯示漢字、點云、三維立體等方面表現差,需要更多點的光立方體做顯示器件。根據本文建模設計方法,文中設計了3D16、3D32、3D64光立方體顯示器件,并在3D16光立方體上顯示漢字,在3D32和3D64光立方體上分別顯示仙人球點云和馬點云模型,效果突出,如圖8所示。隨著點數的增加,考慮光立方體模型設計、驅動配置方法、功率消耗、通訊設計、掃描方式等,使得光立方體顯示系統設計越發顯得困難。若把3D8光立方顯示系統看成基本顯示單元,大中型光立方體顯示系統可由基本顯示單元積木構建,如表3所示。

表3 光立方體顯示系統配置表Tab.3 Configuration table of LED cube system
表3中,功耗是按照單個LED發光管功耗為20 mW,并在1/8掃描方式下,按層靜態全點亮光立方體,并不計其他功耗的情況下計算所得結果。基本單元功耗P3D8=N2×pLED,N為3D8光立方體的每層點數,pLED為單個LED發光管功耗,帶入參數,于是P3D8=82×20×10-3=1.28 W。另以3D128光立方系統為例,功耗P=P3D8×n,P3D8是基本單元功耗,n是基本單元數。于是,3D128光立方系統的功耗P3D128=84×1.28=5 242.88 W。
同時,根據表3數據可知,光立方系統每增加1級,基本單元數增加8倍,功耗增加8倍,如3D256光立方體顯示系統需要85個基本單元構成,功耗超40 kW,這將會面臨巨大工程量和復雜電源設計等問題。所以,光立方體顯示系統的設計上限受到了現實條件的制約。
仿真結果表明,通過光立方體及驅動組件模型仿真,模型設計正確,仿真運行立體效果好。該模型方法的提出簡化了光立方體及驅動組件的硬件設計,節省了硬件成本、剔除了焊接工序、極大地縮短了設計周期等,在一定程度上避免了硬件設計的困難,不僅為大中型光立方體設計驗證提供了一種準三維可視化設計方法,而且為三維立體顯示器的設計在軟硬件協同驗證提供了參考,為光立方系統的工程應用奠定基礎。