計(jì)算機(jī)接口使19世紀(jì)管風(fēng)琴自行彈奏
在進(jìn)行電子設(shè)計(jì)時(shí),我們大家坐下來,粗略地設(shè)計(jì)出電子結(jié)構(gòu);圖3為基本結(jié)構(gòu)圖。在圖的左側(cè),MIDI消息由外部傳入(我將在下文詳細(xì)介紹MIDI協(xié)議)。圖的右側(cè)是一個(gè)位移寄存器鏈;控制器在驅(qū)動(dòng)相應(yīng)的“數(shù)據(jù)”值填充位移寄存器鏈時(shí),負(fù)責(zé)切換“時(shí)鐘”信號(hào),然后通過“選通”信號(hào)將位移寄存器鏈的內(nèi)容并行發(fā)送至電磁鐵驅(qū)動(dòng)器的輸入端。
圖3:電子結(jié)構(gòu)我們在位移寄存器/驅(qū)動(dòng)器鏈上采用了74HC595位移寄存器IC。不過,電磁鐵試驗(yàn)顯示每個(gè)電磁鐵大約需要15V電源提供350mA驅(qū)動(dòng)電流——超出了CMOS輸出級(jí)的提供范圍。這了滿足這個(gè)要求,我們在每個(gè)位移寄存器IC上增加了一個(gè)ULN2803A Darlington輸出級(jí)。這個(gè)芯片還具備一個(gè)保護(hù)二極管,對(duì)切斷電流時(shí)電磁鐵生成的高反激電壓進(jìn)行分流,避免增加一個(gè)分立式二極管。我們在萬用板上制作了幾個(gè)驅(qū)動(dòng)器電路板原型,每個(gè)可驅(qū)動(dòng)16個(gè)電磁鐵。
控制器設(shè)計(jì)
盡管我們可以采取多種方法設(shè)計(jì)控制器(包括利用Arduino平臺(tái)或采用其他微控制器),但我們最終還是選擇使用賽靈思Spartan-3E入門套件,因?yàn)槲以谫愳`思的日常工作中用過這種開發(fā)板,對(duì)相關(guān)工具了如指掌。特別是,我知道如何使用Platform Studio SDK和ChipScope等調(diào)試工具,由于這有可能是一個(gè)現(xiàn)場調(diào)試項(xiàng)目,這樣做可節(jié)省時(shí)間。我們使用賽靈思嵌入式開發(fā)套件,開發(fā)核心組件MicroBlaze子系統(tǒng)(圖4)。
圖4:MicroBlaze 子系統(tǒng)除了MIDI接口和位移寄存器接口,我們還選擇增加了串行RS-232控制端口,幫助我們調(diào)試系統(tǒng)。RS-232協(xié)議看起來有點(diǎn)老套,但在此類項(xiàng)目中,它的價(jià)值非凡。我們也增加了一些GPIO端口,用于驅(qū)動(dòng)LED,讀取開關(guān)和按鈕,以便在無需使用控制端口的情況下,完成某些交互操作。
寫入MicroBlaze固件
我們已經(jīng)確定系統(tǒng)的最佳輸入接口是MIDI端口。自20世紀(jì)80年代以來,樂器數(shù)字接口(MIDI)已經(jīng)成為連接合成器等數(shù)控樂器與其他樂器或控制計(jì)算機(jī)的標(biāo)準(zhǔn)接口,因此,顯然我們也應(yīng)當(dāng)采用這種接口。MIDI將使我們?nèi)〉昧?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/管風(fēng)琴">管風(fēng)琴連接的最大靈活性。
MicroBlaze可從內(nèi)部顯示整個(gè)鍵盤的狀態(tài)以及系統(tǒng)正在按壓哪些鍵——即系統(tǒng)正在為哪些電磁鐵加電。
MIDI是一種單向低速串行協(xié)議,傳輸速率為31250波特。它包含多種類型的信息,但就我們的目的而言,只有NOTE ON和NOTE OFF是重要的信息類型。每個(gè)NOTE ON信息由3個(gè)字節(jié)構(gòu)成。
第一個(gè)字節(jié)是0x9n,這里的n代表通道數(shù)。
第二個(gè)字節(jié)是0至127的音符數(shù),中間的C為第60號(hào)。
第三個(gè)字節(jié)是0至127的速度值。
NOTE OFF除第一個(gè)字節(jié)是0x8n外,其余與此非常相似。
在我們的設(shè)計(jì)中,我們決定同步聽取所有通道的信息( “omni”操作)。由于管風(fēng)琴鍵盤對(duì)速度并不敏感,因此,我們可安全地忽略所有速度字節(jié)。
EDK UART IP核接收MIDI消息,然后通過FIFO,一次向MicroBlaze處理器發(fā)送一條信息。MicroBlaze可從內(nèi)部顯示整個(gè)鍵盤的狀態(tài)和系統(tǒng)正在按壓哪些鍵(即系統(tǒng)正在為哪些電磁鐵加電)。固件采用一個(gè)靜態(tài)查找表,指出與這個(gè)音符相關(guān)的電磁鐵,將這個(gè)用做內(nèi)部圖的索引;到達(dá)的NOTE ON消息將相應(yīng)entry值設(shè)為“1”,而NOTE OFF消息將entry值設(shè)為“0”。
內(nèi)部圖更新后,利用圖的全部內(nèi)容更新電磁鐵寄存器;通過GPIO端口的位拆裂,MicroBlaze處理器一次將一位的圖內(nèi)容寫入位移寄存器的數(shù)據(jù)輸入端,然后切換時(shí)鐘信號(hào),移動(dòng)一下位移寄存器。一旦利用圖內(nèi)容對(duì)整個(gè)位移寄存器進(jìn)行了更新,MicroBlaze會(huì)將一個(gè)上升沿寫入STROBE行,這能夠?qū)⑽灰萍拇嫫鞯闹悼截愔凛敵黾拇嫫鳎瑸檎_的電磁鐵加電或斷電,從而產(chǎn)生悅耳的音樂。
我們將固件用作軟件狀態(tài)機(jī);對(duì)于不采用實(shí)時(shí)操作系統(tǒng)的嵌入式應(yīng)用而言,這可提供某些多線程應(yīng)用功能,但沒有實(shí)際線程實(shí)現(xiàn)開銷。靜態(tài)結(jié)構(gòu)數(shù)組根據(jù)當(dāng)前的狀態(tài),指出系統(tǒng)針對(duì)特定事件應(yīng)當(dāng)采取什么措施。
評(píng)論