我们已经从唱片及八轨录音时代跨入了CD和MP3时代。把音乐转换成MP3已经变得很流行, 时下如何储存MP3文件是一个有趣的话题。本设计将教你MP3的存储方法,使你能在室内较宽范围内欣赏到MP3音乐。 小型MP3播放机正在和CD、磁带随身听争夺移动应用方面的霸主地位。随著计算机用户对网络访问的不断推动和上网人数的增多,要是我的计算机能成为MP3 无线遥控自动点播机的服务器那该多好啊。 下面让我慢慢给你介绍我的实现方案吧。该方案可以让你在家中任何有FM收音机(例如一个WALKMAN随身听)的地方欣赏MP3音乐。具体就是通过在计算机的音频输出口接上一个小功率FM发射机来实现,另外用一个移动单元用来显示服务器上MP3文件夹的内容,以便你可以从头至尾浏览你收藏的音乐。
为使用方便起见,你可以向上滚动浏览最多4个包含不同歌曲列表的文件夹。选曲、开始、停止和跳曲用一般的红外线遥控器控制。红外遥控指令通过433MHz无线连接送到作为MP3服务器的计算机。
服务器端我设计了两个模块, 433MHz接收机和FM发射机。接收机接收遥控器发过来的指令通过串行端口输入到计算机,後台运行的专用应用程序接收指令把它们分送到 Windows Media Player, Windows Media Player收到指令後播放点播的曲目,第二个模块FM发射机从计算机声卡输出取得音频信号把它发射出去。
为了降低成本简化设计,433MHz无线连接仅以单工方式工作。也就是说,在你选定一个功能後相应指令通过无线连接发送到MP3计算机服务器上,如果发射机没有把它发送到服务器,你将什么也听不到可再次发命令。为了避免假指令中断操作,设计中使用了专用的编解码芯片,该芯片实现所有必需的功能,确保只有合法的数据包才能传输到MP3服务器。
为了使遥控单元能显示服务器上的MP3文件夹的内容,使用前必须先把文件夹的内容下载到遥控单元。这可以通过MP3服务器上的串行端口用同样的应用软件把无线输入的指令送到Windows Media Player实现。遥控单元内的固件可控制多达4个不同的音乐文件夹。
为了避免频繁地更新遥控单元的闪存,建议选定4个稳定的文件夹来进行遥控播放,其它文件夹用来存放新下载的音乐或者经常变动的收藏。遥控单元有32K×8 闪存,每个文件夹可以保存200个歌名(总共800个歌名)。因为闪存是非易失性存储器,所以即使遥控单元电源关掉,歌名数据也会保存下来,对于用电池供电的遥控单元来说这点很重要。
遥控单元
系统的核心是遥控单元,如图1所示。遥控单元主要由Atmel AT90S2313-4PC组成,Atmel AT90S2313-4PC提供15条I/O(使用了其中12条)内置一个硬件UART。因为该单元耗电很小,所以我用4节AA电池经过 LM2936CZ5低压差整流器为其供电。
很明显,如果不能显示整个歌名和演唱者的名字,歌名显示就没有什么用处了。由于可能会有很多歌曲让你浏览,因此定同时显示4个歌名,选用4×40 LCD面板作为显示屏。与大多数常见LCD相比,该LCD的控制方式不大一样,用2片HD44780 LSI控制器进行控制,其中一片控制LCD上面两行字符,另一片控制下面两行。
LCD通过B端口的7根以普通4位数据接口方式与微控制器连接。控制由一根RS和两根ENABLE组成,其中两根ENABLE?每个LSI控制器一根。因为LCD只接收指令不需要读出状态,所以R/*W接低电平。
在用户接口方面,我没有采取在面板上安置按键和开关来控制的方法,而是用一个红外解码模块和一个通用的红外遥控器代替。红外遥控器采用普通而且容易买到的RCA CRCU410型号,它的遥控编码跟Quasar牌电视机(编码054)一样。我之所以选择这个编码是因为它简单,用软件解码比较容易。各个键和相应功能如表1所示。
歌名列表的非易失性存储使用连续的闪存EEPROM。我选用Mcrochip的24LC256I/P8EA,因为它比较常见容易买到。该芯片I2C器件,因此与微控制器AT90S2313连接仅需双接口。不过AT90S2313没有内置I2C端口的硬件电路,因此必须用软件实现I2C功能。然而幸运的是,Atmel公司提供了一个AT90S2313作为主控芯片时的I2C读/写时序应用笔记。 必须注意的地方是,I2C规格中SDA和SCL均需要用2.2KΩ上拉电阻。根据A0~A2设定的不同,24LC256I可以被设定成8种不同的 I2C地址,因而闪存可以扩展到256KB。本设计中因为仅用了一个芯片,所以3根地址都设定为低电平。
由24LC256I的使用手知道该器件需要5ms闪存写入时间,数据从AT90S2313 UART接收部分写入闪存。我设计的下载协议只有从服务器PC到遥控单元一个方向,因此不用“握手”方式工作,所以我选用1200bps数据传输率,每隔 8.3ms处理一次输入的数据字符。这个间隔可以提供足的时间把数据发送到I2C闪存,即使使用软件实现I2C功能,仍然有5ms的空馀时间来写 EEPROM。
我没有采用诸如MAX232之类成熟的RS-232接口,而是用一个2N3904 NPN三极管和一些无源器件将主机的RS-232电平转换成TTL电平。
选用Abacom公司AM-RT5-433作为无线发射机模块,其小型SIP封装很容易装配。Abacom公司慷慨地寄给我一对发射机和接收机的样品。这些廉价的模块是针对100码左右距离应用的,采用简单的载波开关调制来实现数据的发射。
我使用小型无线传输模块的其它经验来自价格较贵的Linx HP-II系列(900 MHz)。Linx HP-II系列采用FSK调制,发射机可直接由UATR驱动。
Abacom公司的技术人员说我选用的廉价模块不能直接与UART端口接口,然而Abacom公司设计了一个复合芯片NKM2401-N,该芯片根据mode的连接不同可以充当编码器或者解码器来用。本设计中我在每个无线数据连接末端均用了这个器件。
遥控单元中NKM2401从AT90S2313 UART端口接收8字节的数据包(以2400 bps数据率),加上同步、预缓冲/後缓冲字节和CRC後再对最终数据进行Manchester编码。因为NKM2401的数据包格式8个字节,但我的指令仅有2字节长,因此我自己加上同步字节和补充字节成了一个8字节的数据包。NKM2401的数据输出直接连接到AM-RT5-433发射机上。至于天线,我使用了1/4波长的鞭状天。
我想在遥控单元中取消NKM2401而改用AT90S2313固件程序实现相应的功能。遥控单元的固件是用汇编语言写的,仅用了AT90S2313 2KB闪存中大约1/3大小的空间,因此可留下很多的空间供其它有需要的程序用。然而在接收端我不打算使用微控制器,因此必须用NKM2401来解码。我未能从Abacom公司取得详细的通信协议(他们的协议比较容易看懂)因此我无法编写程序实现数据包的编码。给我点时间的话我可能会用示波器或者计算机上的程序捕捉到数据流对它进行反向工程最後实现这个编码过程,遗憾的是没时间了。
在继续进行之前我补充几点。AT90S2313使用陶瓷振荡器工作在4MHz,这对于比较低的串行数据通信速率来说是足了的。我必须把UART的速率设定在1200bps(数据下载期间)来接收数据,但发射时把速率设定在2400bps(通过NKM2401和发射机发送命令)。我不得不这做,因为 NKM2401仅工作在2400bps速率,1200bps是可用于下载的最高速率(考虑串行闪存的写入时间)。
最後遥控单元上有一个标著J1 Link Test的跳。如果装上跳NMK2401-N将会不断地发送“ABACOM”信息,该信息可以用来检测无线连接。
无线接收机模块
无线接收机的作用是接收MP3遥控单元发射的433MHz信号?把信号转换成RS-232电平送到服务器PC。
Abacom公司的AM-HRR3-433接收机如图2所示。接收机模块跟发射机一样使用同样的1/4波长鞭状天。
在没有接收信号的时候,接收机模块的输出满是毛刺和噪音。我用示波器观察发现一点信号都没有,因为我住在乡村地区。正因为这个原因必须使用Abacom公司的NKM2401-N芯片。接收机中NKM2401-N的模式(第4)接地,使其工作于解码模式。用一个普通PNP三极管反相器向服务器PC提供虚拟 RS232电平信号。
LM2936CZ5低压差整流器接收机提供5V直流电。大多数时间接收机模块都连在MP3服务器计算机的串行端口上,然而出于工作需要,有时遥控单元必须连接到PC(例如下载歌名列表的时候),因此我制作一根短电缆把PC上的DB9插座接到一个5pin DIN插头上,接收机和遥控单元均用配对的5pin DIN插座,这样你就可以按需要把设备连起来了。
Abacom公司的接收机/发射机模块与NKM2401-N配合使用非常可靠。无线发送指令是本设计的一个亮点。唯一觉得不足的是不能把433MHz接收机和FM发射机模块装在同一个机箱内。当把FM发射机放在接收机旁边时,发射机的RF输出会对接收 机灵敏度有轻微影响,造成无线连接仅能在20码范围内工作,跟我的预期目标相比发射距离太近了。然而当我把FM发射机装进机箱里把它放到离433MHz接收机几码远的地方时,发射距离近的问题解了,这时发射距离增加到约50码(注意这仍然在室内)。
FM发射机
我构想这个设计的时候就预料到一定会有一些设计中的难点或者编程上的问题。开始我总认为制作一个小型FM发射机是很容易的事,所以我把这项工作留到最後完成。然而正如墨菲定律所说的一样,当初我认为最简单的事情到最後成为整个设计中最棘手和最耗费时间的部分。
曾经谣传基于Rohm BA1404 IC的FM立体声发射机套件经常会因为工作不稳定而导致无法使用,不过我还是鬼使神差地买了这个套件。唉,谣传是真的──它的频率稳定性实在是太差了,以致不能和现代数字调谐FM接收机配合工作。即使我用高质量的RF调谐元件替换了原来的便宜货,问题依然存在。了取得心理平衡我只能这想∶这个IC是在数字FM接收机发明前设计的,其不能与数字调谐FM接收机配合工作情有可原。老式模拟FM接收机具备自动频率控制电路,有可能会克服这个发射机套件的频飘吧。
我找到 了一个PLL稳频的FM发射机套件,但其高达200美元的价格对本设计来说太不合算了。几年前我曾经做过几个10-400MHz范围的PLL频率发生器,因此我想尝试自己制作FM发射机。
不过那是恶梦的开始。我过去所用的PLL芯片现在买不到了。目前大多数的PLL IC是专门用于移动电话之类的,它们在低于100MHz下不能稳定工作。虽然我也找到了一些针对FM发射用的IC,但它们的封装形式太小以致不能焊接。
在这种情况下我决定另辟蹊跷。因此我必须用微控制器来控制PLL芯片,为什么我不完全丢掉PLL芯片而用微控制器测量和控制振荡频率?我所想的可以认?是一个自动稳频器。
我的想法可以用图3描述。振荡频率主要由电感和可变电容设定。本设计中我把调谐范围大概定在88~92MHz,这两方面的原因∶第一,FM波段低端商业电台较少;更重要的是96MHz是该电路能测量的最高频率。
确了稳定性和FM调制两个目的,振荡器由一个变容二极管控制频率微调。变容二极管的电容量由加在它上面的偏置电压定。这个偏置电压由两个分量控制。12位 DAC提供的直流电平和一个交流信号双重作用在变容二极管上以实现频率调制。DAC的输出电压初始值设置在中间值(2V),通过手动调整可变电容(微调)把振荡器调到指定的频率,其後微控制器会稍微上下调整DAC的输出电压来稳定这个频率。
要用微控制器测量振荡器的频率必须先把它进行16预分频。这可由普通的74F161 4位分频器完成。预分频输出大概在5~6MHz频率范围,这个频率可以用微控制器的16位计数器/定时器进行计数。
确了确定振荡频率,先把16位计数器清零,经过设定的时间间隔之後再把它的值读出来。设定时间间隔由微控制器中另一个计数器/定时器编程控制,每5.461ms周期中断一次。这样16位计数器中的值可以这样计算∶
Counter/timer Value=(fosc/16)×(5.461×10-3)
实际操作时微控制器读出16位定时器的值把它与用你选择的频率代人上述方程计算出来的一个常数进行比较。如果振荡频率太低了DAC的值就会向上加1再试;相反地如果振荡频率太高了,DAC值就1。如此反复直到振荡器的频率落在你所选频点附近的很窄的带宽内。
这个电路一般来说可能会一直处于搜索状态,有两个原因∶第一,因为在采样时间内振荡器信号的变化会使计数器/定时器总会出现1次计数误差;第二,由于振荡器被音频信号进行频率调制,其频率会随著这个调制电压而变化。
我们是不希望出现一直搜索的情的,因为这会导致接收机收到的音乐中夹著调制声。避免这种情发生,微控制器一旦把频率调定,就进入期10分钟的 “休眠”状态,10分钟过後再检测一次频率。除非室内温度出现较大变化,否则振荡器就几乎不用修正,本电路就可保证正常工作。
AVR AFC
在我详细描述怎样实现自动频率控制FM发射机前,请先看一下图4以有一个感性认识。首先我需要一个可以对6MHz频率进行计数的微控制器且该微控制器还必须具备另外一个定时器,用来发出读计数器和清零计数器的中断冲。我选用Atmel AT90S2313-10PC,因它内部含有我所需要的功能。然而我必须让它在超出它额定频率10MHz的12MHz频率下工作以获得6MHz频率的计数能力。顺便说一下,这样适当对Atmel AT90S2313“超频”到目前为止还没有出现过什么问题。
当发射机制作完成设定在某个信道之後FM振荡器频率就可确定。因此,简化操作,在程序开头我输入了所需的发射频率作为常数,程序经编译以後下载到AT90S2313做成一个固定频率的FM发射机。 10年前可以很容易取得频率高达1GHz的256分频预分频器芯片,但这些芯片现在都听,因此我用74F161计数器来实现16分频。该器件工作频率大于100MHz,成本低于1美元且容易买到。
我用2N5485制作了一个VCO。VCO的振荡频率主要取于L1和C12的值。C12微调电容,发射机第一次通电时,用其对频率进行微调使发射机工作在指定频率上。只有装上J1使微控制器把DAC输出设置在中间值时,才可以进行微调,之後把跳去掉。当发射机再次通电後,自动频率稳定器电路开始工作,振荡器被变容二极管D1微调到指定频率。74F161需要几伏的信号作时钟,这可以用FET振荡器实现(其它大多数形式的振荡器没有这样的能力)。
振荡器的RF输出从L1的抽头取出以小负载的影响。RF输出用电容耦合到74F161预分频器第一级的时钟输入。调整分压器R7时钟输入端提供适当的偏置,使振荡信号触发输入分频级。把它设定在2~2.5V之间较好,最好用示波器调整设定,使74F1 61的11输出得到乾净的5~6MHz的波形。
控制VCO微调的12位DAC U14采用TI公司带SPI接口的DAC7611。虽然AT90S2313不具备用户SPI端口(它的SPI端口只严格地配合闪存编程工作),但用PB1~PB4 I/O 可以简单地实现发送SPI数据到DAC的功能。
J1与PD6端口 连接,复位时微控制器检测该端口 的状态。如果J1处于连接状态,它只不过会把DAC设置在中间值,接著进入等待。这时你可以调节微调电容把振荡器的频率设定在最接近指定频率的地方使误差最小。北美地区所有FM广播均把频率设定 100KHz的奇数倍,随便选一个就行了。
做完这个後,接著去掉跳 再给发射机通电。这时发射机应在几秒时间内反复调整DAC电压, 经过预分频器反复测量振荡器输出频率使其返回指定频率。这就是随後用作FM发射机模块的正常工作模式。
从主机声卡输出的立体声音频信号先经过一个预加重网络(每个声道都要)混合成一个单声道信号,该信号 加在DAC的直流控制电压上对振荡器的输出进行调频。
预加重网络中的RC值视立体声接收机的输出以取得较平坦的频响 目标而确定,图4中的设定值还是比较合理的。别指望选定的元件值会达到北美FM广播的去加重常数标准值75us,要考虑到还有很多存在于VCO中的因素会影响调制特性,我设定的参数值可使发射机获得比较平坦的频响。注意,图4中没有提到天 ,如果设备放在塑料壳内其发射距离能达到50码,那就很好,因 政府相关法规规定禁止使用发射半径大于50码的发射机。
我用一片1.5x1平方英寸的小型单面PCB板制作了电路的VCO部分(如图4虚 部分所示)。电路剩下部分在一块Simm-Stick面包板上手工连 。VCO PCB板设计成SIP封装的样子垂直安装在Simm-Stick面包板上。
软件和固件
应用软件包括计算机上运行的应用程序和运行在遥控器上的客户固件。PC端服务软件用Visual Basic 6语言编写。
遥控器固件用AVR汇编语言编写。FM发射机另外用一片AT90S2313稳频。现在所用软件是试用版,因此我暂时用BASCOM-AVR编译器代替AT90S2313。
客户端应用软件
运行在PC上的客户端应用软件主要有两个主要功能∶大多数时间它一直在检测COM1端口搜寻遥控器发给它的指令∶另一个功能是用它来浏览文件目录 指定4个文件夹作 自动点播文件夹。这些文件夹中的文件名接著就被转换成数据记录,用COM1端口的发射部分发送到遥控器上。
我详细地介绍一下第一个功能。正如前面提到的,计算机和遥控器之间通过433MHz无 连接,在PC端433MHz接收机以2400bps速率接收RF信号 把它转换成串行数据,接著把它送到COM1端口。所有数据格式和数据纠错均由NKM2401编/解码器芯片组成的硬件电路完成。这样做可以确保客户端应用软件接收到的的指令都是合法的。
NKM2401采用8字节数据包格式。遥控器发送的所有指令由2字节同步数据(0xAA, 0x55)後跟16位指令字和4个补充字节组成。2字节指令字用来区别4种指令∶播放(停止),播放下一曲,播放前一曲,播放全部和暂停。其它14位数据用来选择当前文件夹和该文件夹内歌名的一些附加信息。当你选出要用的文件夹时,文件夹就会打开,接著分析该文件夹然後显示出唱片长度信息。在应用中我效仿了这个功能,把它应用到了发射机和遥控器上。这样做使你可以在遥控器的LCD上看到所有歌名。另外它意味著你仅需发送数据库文件中歌曲位置的相应编号就可以点播歌曲。
客户端程序确定播放哪一首歌曲後怎样使计算机播放这首歌曲呢?如果歌曲是WAV格式,那就很简单,因 Visual Basic内置的多媒体支持功能包括WAV文件的播放,然而它不支持MP3文件的播放,起码我所用的版本是这样。我到处寻找能播放MP3文件的控件但没能找到免费的或者价格合理的。
在这方面我又碰钉子了。我刚下载了Microsoft免费发布的Windows Media Player V.7。这个多用途程序能 很好地播放MP3文件 且有很多你所需要的附加功能。像很多Windows程序一样它有支持快捷键的优点。我的想法是同时运行我的MP3自动点播机客户端程序和Windows Media Player,然後用我的客户端软件控制Windows Media Player。这可以用一系列的Visual Bsic命令实现。
第二个功能,选择想要的音乐 文件夹(多达4个) 把内容下载到遥控器的闪存上,这个功能仅偶尔用到。你只需选定文件夹接著点击表格左边的4个数字按钮中的一个就可以了。有一个窗口记录著歌名列表闪存剩馀的空间。如果闪存没有用完的话每个文件夹能装将近200首歌曲。
了简化遥控器的固件,我假设4个文件夹都会用到,因此全部下载。如果你没有那 多文件夹,那 不足的文件夹将用你选定的文件夹的复件代替。
按下载键之前遥控器必须先插入PC的COM1端口暂时代替433MHz接收机。我用前面提到的自己做的电缆让它一直插在PC上,电缆另一端 5pin DIN插头,该插头与接收机和遥控器都是匹配的,这样连接就非常方便。下载时间由遥控器中的闪存的写入时间 定。在所有4个目录均含大约200首歌的极限情 下,下载时间大约 4分钟。下载进程用检测盒显示,检测盒显示在客户程序文件夹列表旁边,在遥控器LCD显示屏上也有相关信息显示。
AVR固件
我已大概介绍了FM发射机的自动频率控制原理。实现这个功能的程序非常简单,因此用Basic语言编写 用BASCOM-AVR编译器编译。
遥控器的固件比较棘手。最初我试著用BASCOM-AVR编译器编Basic程序但生成的程序代码太长,AT90S2313中的闪存空间装不下。随後,我用汇编语言编程实现了遥控器的功能,使用的程序空间不到AT90S2313闪存空间的一半。
与PC客户软件一样遥控器单元有两个功能,其中一个功能不常用。打开时它显示文件夹1中的前4首歌,接著循环检测由RCA通用遥控器发出的红外 指令和红外 接收机模块接收到的指令。红外信号进入AT90S2313的INPUT CAPTURE D6端口,接著由定时器1(16位定时器/计数器)的输入捕捉特性译码。我选用比较简单的红外 指令结构(Quasar牌电视机编码054)以 少工作量。这种指令结构的起始部分是固定长度的起始 冲,後面紧跟8位数据,数据位用 冲与 冲之间的2个不同的时间间隔表示。在确认固定长度的起始 冲後,你要做的只有两件事∶捕捉接下来的8个 冲的时序;根据时间间隔将它们区分开来 分配适当的值。就像前面说的遥控单元不停地检测传来地指令然後执行相应的功能,导航功能仅局限浏览歌曲列表和从一个文件夹跳到另一个文件夹。这通过调整指向闪存,读取歌名 把这些ASCII字符发送到 LCD显示屏实现。
通过AT90S2313的UART发送端口发送相应的命令来实现播放,播放下一首,播放最後一首和暂停功能。同样,此时NKM2401使用8字节数据包格式,同步字节和补充字节也必须按照需要加到16位指令字中。
设计有专用的下载功能按键。按下它时程序功能变成接收从AT90S2313的UART端口送过来的字符,PC 生的数据就用该功能传送到歌曲闪存中。
Atmel 24C256闪存芯片 I2C接口的32K×8存储器,其5ms的写入时间有点慢但对本设计 无大碍,因 从服务器计算机送来的数据的速率是 1200bps,相当于每8.3ms传输一个字符。AT90S2313没有专门的I2C端口,因此这个功能必须用固件实现。主程序直接套用Atmel公司应用笔记中的程序,效果很好。
LCD 一个4×40点阵的器件,使用常见的Hitachi公司的HD44780控制器,实际上该控制器内部包含两个LSI控制器和一个公用的数据/控制接口,外加两根ENABLE 。我必须改写我原来的4位LCD驱动程序来应付LCD1、2行字符由控制器1控制,3、4行字符由控制器2控制的情 。 结语
我觉得这个设计很有意思,也许是因为它用了无线传输的缘故吧。Abacom公司的接收/发射模块配合该公司的编码和解码器件应用,性能很好。此外,贴近用户的AVR器件闪存编程能力使汇编程序的写入变得非常轻松。
对本设计我基本满意,但仍然觉得有些不足的地方。我原来 不打算花那 多时间来做一个令人满意的FM发射机模块。现在来说可能是迟了一点,近来我看见市场上有Rohm公司的BH1416F无线音频连接IC,它采用SOP22封装,内部包含完整的PLL稳频FM发射机和FM立体声调制器。我买了这个芯片,打算以後试试。如果你不是一个超级音乐迷希望你可以将这里提到的一些想法用到其它方面去设计出更好的东西。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』