基于AT90S2313-4PC的MP3無(wú)線遙控自動(dòng)點(diǎn)播機(jī) (上)
小型MP3播放機(jī)正在和CD、磁帶隨身聽(tīng)爭(zhēng)奪移動(dòng)應(yīng)用方面的霸主地位。隨著計(jì)算機(jī)用戶對(duì)網(wǎng)絡(luò)訪問(wèn)的不斷推動(dòng)和上網(wǎng)人數(shù)的增多,要是我的計(jì)算機(jī)能成為MP3 無(wú)線遙控自動(dòng)點(diǎn)播機(jī)的服務(wù)器那該多好啊。
下面讓我慢慢給你介紹我的實(shí)現(xiàn)方案吧。該方案可以讓你在家中任何有FM|0">FM收音機(jī)(例如一個(gè)WALKMAN隨身聽(tīng))的地方欣賞MP3音樂(lè)。具體就是通過(guò)在計(jì)算機(jī)的音頻輸出口接上一個(gè)小功率FM發(fā)射機(jī)來(lái)實(shí)現(xiàn),另外用一個(gè)移動(dòng)單元用來(lái)顯示服務(wù)器上MP3文件夾的內(nèi)容,以便你可以從頭至尾瀏覽你收藏的音樂(lè)。
為使用方便起見(jiàn),你可以向上滾動(dòng)瀏覽最多4個(gè)包含不同歌曲列表的文件夾。選曲、開(kāi)始、停止和跳曲用一般的紅外線遙控器控制。紅外遙控指令通過(guò)433MHz無(wú)線連接送到作為MP3服務(wù)器的計(jì)算機(jī)。
服務(wù)器端我設(shè)計(jì)了兩個(gè)模塊, 433MHz接收機(jī)和FM發(fā)射機(jī)。接收機(jī)接收遙控器發(fā)過(guò)來(lái)的指令通過(guò)串行端口輸入到計(jì)算機(jī),後臺(tái)運(yùn)行的專用應(yīng)用程序接收指令把它們分送到 Windows Media Player, Windows Media Player收到指令後播放點(diǎn)播的曲目,第二個(gè)模塊FM發(fā)射機(jī)從計(jì)算機(jī)聲卡輸出取得音頻信號(hào)把它發(fā)射出去。
為了降低成本簡(jiǎn)化設(shè)計(jì),433MHz無(wú)線連接僅以單工方式工作。也就是說(shuō),在你選定一個(gè)功能後相應(yīng)指令通過(guò)無(wú)線連接發(fā)送到MP3計(jì)算機(jī)服務(wù)器上,如果發(fā)射機(jī)沒(méi)有把它發(fā)送到服務(wù)器,你將什么也聽(tīng)不到可再次發(fā)命令。為了避免假指令中斷操作,設(shè)計(jì)中使用了專用的編解碼芯片,該芯片實(shí)現(xiàn)所有必需的功能,確保只有合法的數(shù)據(jù)包才能傳輸?shù)組P3服務(wù)器。
為了使遙控單元能顯示服務(wù)器上的MP3文件夾的內(nèi)容,使用前必須先把文件夾的內(nèi)容下載到遙控單元。這可以通過(guò)MP3服務(wù)器上的串行端口用同樣的應(yīng)用軟件把無(wú)線輸入的指令送到Windows Media Player實(shí)現(xiàn)。遙控單元內(nèi)的固件可控制多達(dá)4個(gè)不同的音樂(lè)文件夾。
為了避免頻繁地更新遙控單元的閃存,建議選定4個(gè)穩(wěn)定的文件夾來(lái)進(jìn)行遙控播放,其它文件夾用來(lái)存放新下載的音樂(lè)或者經(jīng)常變動(dòng)的收藏。遙控單元有32K×8 閃存,每個(gè)文件夾可以保存200個(gè)歌名(總共800個(gè)歌名)。因?yàn)殚W存是非易失性存儲(chǔ)器,所以即使遙控單元電源關(guān)掉,歌名數(shù)據(jù)也會(huì)保存下來(lái),對(duì)于用電池供電的遙控單元來(lái)說(shuō)這點(diǎn)很重要。
遙控單元
系統(tǒng)的核心是遙控單元,如圖1所示。遙控單元主要由Atmel AT90S2313-4PC組成,Atmel AT90S2313-4PC提供15條I/O(使用了其中12條)內(nèi)置一個(gè)硬件UART。因?yàn)樵搯卧碾姾苄?,所以我?節(jié)AA電池經(jīng)過(guò) LM2936CZ5低壓差整流器為其供電。
圖1 MP3遙控器單元
很明顯,如果不能顯示整個(gè)歌名和演唱者的名字,歌名顯示就沒(méi)有什么用處了。由于可能會(huì)有很多歌曲讓你瀏覽,因此定同時(shí)顯示4個(gè)歌名,選用4×40 LCD面板作為顯示屏。與大多數(shù)常見(jiàn)LCD相比,該LCD的控制方式不大一樣,用2片HD44780 LSI控制器進(jìn)行控制,其中一片控制LCD上面兩行字符,另一片控制下面兩行。
LCD通過(guò)B端口的7根以普通4位數(shù)據(jù)接口方式與微控制器連接。控制由一根RS和兩根ENABLE組成,其中兩根ENABLE?每個(gè)LSI控制器一根。因?yàn)長(zhǎng)CD只接收指令不需要讀出狀態(tài),所以R/*W接低電平。
在用戶接口方面,我沒(méi)有采取在面板上安置按鍵和開(kāi)關(guān)來(lái)控制的方法,而是用一個(gè)紅外解碼模塊和一個(gè)通用的紅外遙控器代替。紅外遙控器采用普通而且容易買(mǎi)到的RCA CRCU410型號(hào),它的遙控編碼跟Quasar牌電視機(jī)(編碼054)一樣。我之所以選擇這個(gè)編碼是因?yàn)樗?jiǎn)單,用軟件解碼比較容易。各個(gè)鍵和相應(yīng)功能如表1所示。
表1、遙控器各個(gè)鍵和相應(yīng)功能
歌名列表的非易失性存儲(chǔ)使用連續(xù)的閃存EEPROM。我選用Mcrochip的24LC256I/P8EA,因?yàn)樗容^常見(jiàn)容易買(mǎi)到。該芯片I2C器件,因此與微控制器AT90S2313連接僅需雙接口。不過(guò)AT90S2313沒(méi)有內(nèi)置I2C端口的硬件電路,因此必須用軟件實(shí)現(xiàn)I2C功能。然而幸運(yùn)的是,Atmel公司提供了一個(gè)AT90S2313作為主控芯片時(shí)的I2C讀/寫(xiě)時(shí)序應(yīng)用筆記。
必須注意的地方是,I2C規(guī)格中SDA和SCL均需要用2.2KΩ上拉電阻。根據(jù)A0~A2設(shè)定的不同,24LC256I可以被設(shè)定成8種不同的 I2C地址,因而閃存可以擴(kuò)展到256KB。本設(shè)計(jì)中因?yàn)閮H用了一個(gè)芯片,所以3根地址都設(shè)定為低電平。
由24LC256I的使用手知道該器件需要5ms閃存寫(xiě)入時(shí)間,數(shù)據(jù)從AT90S2313 UART接收部分寫(xiě)入閃存。我設(shè)計(jì)的下載協(xié)議只有從服務(wù)器PC到遙控單元一個(gè)方向,因此不用“握手”方式工作,所以我選用1200bps數(shù)據(jù)傳輸率,每隔 8.3ms處理一次輸入的數(shù)據(jù)字符。這個(gè)間隔可以提供足的時(shí)間把數(shù)據(jù)發(fā)送到I2C閃存,即使使用軟件實(shí)現(xiàn)I2C功能,仍然有5ms的空馀時(shí)間來(lái)寫(xiě) EEPROM。
我沒(méi)有采用諸如MAX232之類成熟的RS-232接口,而是用一個(gè)2N3904 NPN三極管和一些無(wú)源器件將主機(jī)的RS-232電平轉(zhuǎn)換成TTL電平。
選用Abacom公司AM-RT5-433作為無(wú)線發(fā)射機(jī)模塊,其小型SIP封裝很容易裝配。Abacom公司慷慨地寄給我一對(duì)發(fā)射機(jī)和接收機(jī)的樣品。這些廉價(jià)的模塊是針對(duì)100碼左右距離應(yīng)用的,采用簡(jiǎn)單的載波開(kāi)關(guān)調(diào)制來(lái)實(shí)現(xiàn)數(shù)據(jù)的發(fā)射。
我使用小型無(wú)線傳輸模塊的其它經(jīng)驗(yàn)來(lái)自價(jià)格較貴的Linx HP-II系列(900 MHz)。Linx HP-II系列采用FSK調(diào)制,發(fā)射機(jī)可直接由UATR驅(qū)動(dòng)。
Abacom公司的技術(shù)人員說(shuō)我選用的廉價(jià)模塊不能直接與UART端口接口,然而Abacom公司設(shè)計(jì)了一個(gè)復(fù)合芯片NKM2401-N,該芯片根據(jù)mode的連接不同可以充當(dāng)編碼器或者解碼器來(lái)用。本設(shè)計(jì)中我在每個(gè)無(wú)線數(shù)據(jù)連接末端均用了這個(gè)器件。
遙控單元中NKM2401從AT90S2313 UART端口接收8字節(jié)的數(shù)據(jù)包(以2400 bps數(shù)據(jù)率),加上同步、預(yù)緩沖/後緩沖字節(jié)和CRC後再對(duì)最終數(shù)據(jù)進(jìn)行Manchester編碼。因?yàn)镹KM2401的數(shù)據(jù)包格式8個(gè)字節(jié),但我的指令僅有2字節(jié)長(zhǎng),因此我自己加上同步字節(jié)和補(bǔ)充字節(jié)成了一個(gè)8字節(jié)的數(shù)據(jù)包。NKM2401的數(shù)據(jù)輸出直接連接到AM-RT5-433發(fā)射機(jī)上。至于天線,我使用了1/4波長(zhǎng)的鞭狀天。
我想在遙控單元中取消NKM2401而改用AT90S2313固件程序?qū)崿F(xiàn)相應(yīng)的功能。遙控單元的固件是用匯編語(yǔ)言寫(xiě)的,僅用了AT90S2313 2KB閃存中大約1/3大小的空間,因此可留下很多的空間供其它有需要的程序用。然而在接收端我不打算使用微控制器,因此必須用NKM2401來(lái)解碼。我未能從Abacom公司取得詳細(xì)的通信協(xié)議(他們的協(xié)議比較容易看懂)因此我無(wú)法編寫(xiě)程序?qū)崿F(xiàn)數(shù)據(jù)包的編碼。給我點(diǎn)時(shí)間的話我可能會(huì)用示波器或者計(jì)算機(jī)上的程序捕捉到數(shù)據(jù)流對(duì)它進(jìn)行反向工程最後實(shí)現(xiàn)這個(gè)編碼過(guò)程,遺憾的是沒(méi)時(shí)間了。
在繼續(xù)進(jìn)行之前我補(bǔ)充幾點(diǎn)。AT90S2313使用陶瓷振蕩器工作在4MHz,這對(duì)于比較低的串行數(shù)據(jù)通信速率來(lái)說(shuō)是足了的。我必須把UART的速率設(shè)定在1200bps(數(shù)據(jù)下載期間)來(lái)接收數(shù)據(jù),但發(fā)射時(shí)把速率設(shè)定在2400bps(通過(guò)NKM2401和發(fā)射機(jī)發(fā)送命令)。我不得不這做,因?yàn)?NKM2401僅工作在2400bps速率,1200bps是可用于下載的最高速率(考慮串行閃存的寫(xiě)入時(shí)間)。
最後遙控單元上有一個(gè)標(biāo)著J1 Link Test的跳。如果裝上跳NMK2401-N將會(huì)不斷地發(fā)送“ABACOM”信息,該信息可以用來(lái)檢測(cè)無(wú)線連接。
無(wú)線接收機(jī)模塊
無(wú)線接收機(jī)的作用是接收MP3遙控單元發(fā)射的433MHz信號(hào)?把信號(hào)轉(zhuǎn)換成RS-232電平送到服務(wù)器PC。
Abacom公司的AM-HRR3-433接收機(jī)如圖2所示。接收機(jī)模塊跟發(fā)射機(jī)一樣使用同樣的1/4波長(zhǎng)鞭狀天。
圖2 Abacom公司的AM-HRR3-433接收機(jī)
在沒(méi)有接收信號(hào)的時(shí)候,接收機(jī)模塊的輸出滿是毛刺和噪音。我用示波器觀察發(fā)現(xiàn)一點(diǎn)信號(hào)都沒(méi)有,因?yàn)槲易≡卩l(xiāng)村地區(qū)。正因?yàn)檫@個(gè)原因必須使用Abacom公司的NKM2401-N芯片。接收機(jī)中NKM2401-N的模式(第4)接地,使其工作于解碼模式。用一個(gè)普通PNP三極管反相器向服務(wù)器PC提供虛擬 RS232電平信號(hào)。
LM2936CZ5低壓差整流器接收機(jī)提供5V直流電。大多數(shù)時(shí)間接收機(jī)模塊都連在MP3服務(wù)器計(jì)算機(jī)的串行端口上,然而出于工作需要,有時(shí)遙控單元必須連接到PC(例如下載歌名列表的時(shí)候),因此我制作一根短電纜把PC上的DB9插座接到一個(gè)5pin DIN插頭上,接收機(jī)和遙控單元均用配對(duì)的5pin DIN插座,這樣你就可以按需要把設(shè)備連起來(lái)了。
Abacom公司的接收機(jī)/發(fā)射機(jī)模塊與NKM2401-N配合使用非??煽俊o(wú)線發(fā)送指令是本設(shè)計(jì)的一個(gè)亮點(diǎn)。唯一覺(jué)得不足的是不能把433MHz接收機(jī)和FM發(fā)射機(jī)模塊裝在同一個(gè)機(jī)箱內(nèi)。當(dāng)把FM發(fā)射機(jī)放在接收機(jī)旁邊時(shí),發(fā)射機(jī)的RF輸出會(huì)對(duì)接收 機(jī)靈敏度有輕微影響,造成無(wú)線連接僅能在20碼范圍內(nèi)工作,跟我的預(yù)期目標(biāo)相比發(fā)射距離太近了。然而當(dāng)我把FM發(fā)射機(jī)裝進(jìn)機(jī)箱里把它放到離433MHz接收機(jī)幾碼遠(yuǎn)的地方時(shí),發(fā)射距離近的問(wèn)題解了,這時(shí)發(fā)射距離增加到約50碼(注意這仍然在室內(nèi))。
FM發(fā)射機(jī)
我構(gòu)想這個(gè)設(shè)計(jì)的時(shí)候就預(yù)料到一定會(huì)有一些設(shè)計(jì)中的難點(diǎn)或者編程上的問(wèn)題。開(kāi)始我總認(rèn)為制作一個(gè)小型FM發(fā)射機(jī)是很容易的事,所以我把這項(xiàng)工作留到最後完成。然而正如墨菲定律所說(shuō)的一樣,當(dāng)初我認(rèn)為最簡(jiǎn)單的事情到最後成為整個(gè)設(shè)計(jì)中最棘手和最耗費(fèi)時(shí)間的部分。
曾經(jīng)謠傳基于Rohm BA1404 IC的FM立體聲發(fā)射機(jī)套件經(jīng)常會(huì)因?yàn)楣ぷ鞑环€(wěn)定而導(dǎo)致無(wú)法使用,不過(guò)我還是鬼使神差地買(mǎi)了這個(gè)套件。唉,謠傳是真的──它的頻率穩(wěn)定性實(shí)在是太差了,以致不能和現(xiàn)代數(shù)字調(diào)諧FM接收機(jī)配合工作。即使我用高質(zhì)量的RF調(diào)諧元件替換了原來(lái)的便宜貨,問(wèn)題依然存在。了取得心理平衡我只能這想∶這個(gè)IC是在數(shù)字FM接收機(jī)發(fā)明前設(shè)計(jì)的,其不能與數(shù)字調(diào)諧FM接收機(jī)配合工作情有可原。老式模擬FM接收機(jī)具備自動(dòng)頻率控制電路,有可能會(huì)克服這個(gè)發(fā)射機(jī)套件的頻飄吧。
我找到了一個(gè)PLL穩(wěn)頻的FM發(fā)射機(jī)套件,但其高達(dá)200美元的價(jià)格對(duì)本設(shè)計(jì)來(lái)說(shuō)太不合算了。幾年前我曾經(jīng)做過(guò)幾個(gè)10-400MHz范圍的PLL頻率發(fā)生器,因此我想嘗試自己制作FM發(fā)射機(jī)。
不過(guò)那是惡夢(mèng)的開(kāi)始。我過(guò)去所用的PLL芯片現(xiàn)在買(mǎi)不到了。目前大多數(shù)的PLL IC是專門(mén)用于移動(dòng)電話之類的,它們?cè)诘陀?00MHz下不能穩(wěn)定工作。雖然我也找到了一些針對(duì)FM發(fā)射用的IC,但它們的封裝形式太小以致不能焊接。
在這種情況下我決定另辟蹊蹺。因此我必須用微控制器來(lái)控制PLL芯片,為什么我不完全丟掉PLL芯片而用微控制器測(cè)量和控制振蕩頻率?我所想的可以認(rèn)?是一個(gè)自動(dòng)穩(wěn)頻器。
我的想法可以用圖3描述。振蕩頻率主要由電感和可變電容設(shè)定。本設(shè)計(jì)中我把調(diào)諧范圍大概定在88~92MHz,這兩方面的原因∶第一,F(xiàn)M波段低端商業(yè)電臺(tái)較少;更重要的是96MHz是該電路能測(cè)量的最高頻率。
圖3 FM發(fā)射機(jī)框圖
確了穩(wěn)定性和FM調(diào)制兩個(gè)目的,振蕩器由一個(gè)變?nèi)荻O管控制頻率微調(diào)。變?nèi)荻O管的電容量由加在它上面的偏置電壓定。這個(gè)偏置電壓由兩個(gè)分量控制。12位 DAC提供的直流電平和一個(gè)交流信號(hào)雙重作用在變?nèi)荻O管上以實(shí)現(xiàn)頻率調(diào)制。DAC的輸出電壓初始值設(shè)置在中間值(2V),通過(guò)手動(dòng)調(diào)整可變電容(微調(diào))把振蕩器調(diào)到指定的頻率,其後微控制器會(huì)稍微上下調(diào)整DAC的輸出電壓來(lái)穩(wěn)定這個(gè)頻率。
要用微控制器測(cè)量振蕩器的頻率必須先把它進(jìn)行16預(yù)分頻。這可由普通的74F161 4位分頻器完成。預(yù)分頻輸出大概在5~6MHz頻率范圍,這個(gè)頻率可以用微控制器的16位計(jì)數(shù)器/定時(shí)器進(jìn)行計(jì)數(shù)。
確了確定振蕩頻率,先把16位計(jì)數(shù)器清零,經(jīng)過(guò)設(shè)定的時(shí)間間隔之後再把它的值讀出來(lái)。設(shè)定時(shí)間間隔由微控制器中另一個(gè)計(jì)數(shù)器/定時(shí)器編程控制,每5.461ms周期中斷一次。這樣16位計(jì)數(shù)器中的值可以這樣計(jì)算∶
Counter/timer Value=(fosc/16)×(5.461×10-3)
實(shí)際操作時(shí)微控制器讀出16位定時(shí)器的值把它與用你選擇的頻率代人上述方程計(jì)算出來(lái)的一個(gè)常數(shù)進(jìn)行比較。如果振蕩頻率太低了DAC的值就會(huì)向上加1再試;相反地如果振蕩頻率太高了,DAC值就1。如此反復(fù)直到振蕩器的頻率落在你所選頻點(diǎn)附近的很窄的帶寬內(nèi)。
這個(gè)電路一般來(lái)說(shuō)可能會(huì)一直處于搜索狀態(tài),有兩個(gè)原因∶第一,因?yàn)樵诓蓸訒r(shí)間內(nèi)振蕩器信號(hào)的變化會(huì)使計(jì)數(shù)器/定時(shí)器總會(huì)出現(xiàn)1次計(jì)數(shù)誤差;第二,由于振蕩器被音頻信號(hào)進(jìn)行頻率調(diào)制,其頻率會(huì)隨著這個(gè)調(diào)制電壓而變化。
我們是不希望出現(xiàn)一直搜索的情的,因?yàn)檫@會(huì)導(dǎo)致接收機(jī)收到的音樂(lè)中夾著調(diào)制聲。避免這種情發(fā)生,微控制器一旦把頻率調(diào)定,就進(jìn)入期10分鐘的 “休眠”狀態(tài),10分鐘過(guò)後再檢測(cè)一次頻率。除非室內(nèi)溫度出現(xiàn)較大變化,否則振蕩器就幾乎不用修正,本電路就可保證正常工作。
AVR AFC
在我詳細(xì)描述怎樣實(shí)現(xiàn)自動(dòng)頻率控制FM發(fā)射機(jī)前,請(qǐng)先看一下圖4以有一個(gè)感性認(rèn)識(shí)。首先我需要一個(gè)可以對(duì)6MHz頻率進(jìn)行計(jì)數(shù)的微控制器且該微控制器還必須具備另外一個(gè)定時(shí)器,用來(lái)發(fā)出讀計(jì)數(shù)器和清零計(jì)數(shù)器的中斷沖。我選用Atmel AT90S2313-10PC,因它內(nèi)部含有我所需要的功能。然而我必須讓它在超出它額定頻率10MHz的12MHz頻率下工作以獲得6MHz頻率的計(jì)數(shù)能力。順便說(shuō)一下,這樣適當(dāng)對(duì)Atmel AT90S2313“超頻”到目前為止還沒(méi)有出現(xiàn)過(guò)什么問(wèn)題。
圖4 自動(dòng)微調(diào)的發(fā)射機(jī)單元
當(dāng)發(fā)射機(jī)制作完成設(shè)定在某個(gè)信道之後FM振蕩器頻率就可確定。因此,簡(jiǎn)化操作,在程序開(kāi)頭我輸入了所需的發(fā)射頻率作為常數(shù),程序經(jīng)編譯以後下載到AT90S2313做成一個(gè)固定頻率的FM發(fā)射機(jī)。
評(píng)論