引言
?
随着电子技术的发展,数字音频应用系统在我们现实生活中随处可见,比如电梯、商场、电子玩具、报警器等。数字音频技术的基本原理和处理方法就是采用ADC (Analog-to-Digital Converter)模/数转化,对模拟的音频信号进行采样、量化、编码,然后转换成数字化的音频数据和文件进行保存。在播放时,再将数字化的音频数据经过DAC(Digital-to-Analog Converter)数/模转换,恢复到模拟信号形式由发生器件播放出来。目前市场上便携式的WAVE 音乐播放器大部分基于32 位处理器,其资源利用率较低,价格偏高。而本设计充分利用8 位STC15 系列单片机的PWM 功能对WAVE 文件的采样数据进行DA 转化方便得实现了WAVE 音频文件的播放。
?
1 系统硬件
?
本系统采用STC15F2K60S2 型号的单片机,以单片机为核心控制整个系统。利用单片机的SPI 接口实现与SD 卡物理接口的通信,完成SD 卡上WAVE 音频文件的读取,再将得到的采样数据通过单片机的PWM 功能进行DA 转换,经过低通滤波器实现模拟音频数据的输出。
?
1.1 系统硬件组成
?
本系统的组成框图,硬件结构主要包括单片机最小系统、SD 卡接口电路、按键电路、低通滤波电路和耳机接口几部分。其中单片机与SD 卡的通信采用SPI 接口方式,STC 单片机为主机,SD 卡为从机;S TC 单片机PCA 模块输出的PWM 信号通过低通滤波器最终连接到耳机接口;单片机的I/O 口连接4×1 独立按键,用于控制和选择音频数据文件的播放。
?
要实现WAVE 音频文件的读取,并且实现高质量播放效果,SD卡接口电路和有源低通滤波电路是最为关键的两部分,下面将对其进行重点介绍。
?
1.1.1 SD 卡接口电路
?
SD 卡具体的接口电路。SD 卡规范规定了SD 卡的工作电压为3.3 V(2.7~3.6V),因此采用电源稳压芯片AMS1117-3.3将5V 电源转换到3.3V 供SD 卡使用。电阻R4~R9 组成了3 个分压电路,用于将STC 的5V 引脚输出电平转换成3.3V。此时SD 卡才可以正常工作。
?
硬件设计好之后还需要实现SD 卡的接口驱动。接口驱动的实现是通过单片机的SPI 总线编程。SPI 总线是一个面向字节的全双工4 线串行通信接口。SPI 总线系统包括一个主机和一个从机,双方之间通过4 根信号线相连,分别是:主机输出/从机输入(MOSI),主机的数据传入从机的通道;主机输入/从机输出(MISO),从机的数据传入主机的通道;同步时钟信号(SCLK),同步时钟是由SPI 主机产生的,并通过该信号传送给从机,主机与从机之间的数据接收和发送都以该同步时钟信号为基准进行;从机选择(SS),该信号由主机发出,从机只在该信号有效时响应SCLK 的时钟信号开始通信。SPI 通信的本质是在同步时钟作用下进行串行移位,其通信的工作模式和时序在SPI 总线规范中进行了详细的描述。根据SD 卡总线时序,并针对STC15F2K60S2 型号单片机,本系统实现了以下几个驱动函数,分别为初始化函数、接收字节函数和发送字节函数。
?
1.1.2 有源低通滤波电路
?
有源低通滤波电路由集成运放和无源元件电阻和电容构成。它的功能是允许从零到某个截止频率的信号无衰减地通过,而对其他频率的信号有抑制作用。
?
本系统设计的有源低通滤波电路为二阶低通滤波电路,其通带放大倍数与一阶电路相同,可由公式(1)得到。衰减斜率达每十倍频40dB。由于运放电路中的电阻不宜选择过大或过小,一般为几千欧至几十千欧较合适,因此低通滤波电路的电阻值R1=14KΩ,R2=10KΩ,电容值C1=1nF,C2=1nF。将电阻电容值带入公式(2)得到该有源低通滤波器的截止频率约为13kHz。为了减少输入偏置电流及其漂移对电路的影响,应使R1+R2=R3//R4,这里取R3=68KΩ,R4=39.8KΩ。将电阻R3、R4的阻值带入公式(1)可得到通带增益为1.58。
?
A=1+R4/R3(1)
?
fc=1/2π姨R1C1R2C2 (2)
?
1.2 PWM 方式DAC 转换
?
PWM 是脉冲宽度调制的简称。一个典型PWM 的波形, T 是PWM 波的周期,T1 是高电平的宽度,VCC 是高电平值。
?
当该PWM 信号通过一个低通滤波器后,可以得到其输出的平均电压为V,如公式(3)所示
?
V=VCC×T1/T (3)
?
公式中:T1/T 称为PWM 波的占空比。控制T1 的宽度,即可改变PWM 的占空比,得到不同的平均输出电压。因此,在实际应用中,常利用PWM 波的输出实现D/A 转换。
?
STC15 系列单片机的PCA 模块要想实现PWM 模式需要设定相关的寄存器。主要的寄存器有CMOD 定时/计数器工作模式寄存器、CCON 定时/计数器控制寄存器、CCAPMn 比较/捕获模式控制寄存器,每个寄存器的具体定义可参考STC15F2K60S2 的官方数据手册。要设置PCA 模块的PWM 模式,CCAPMn 寄存器的PWMn 和ECOMn位必须置位,PCA 模块的时钟源频率选择11.2896MHz,产生的PWM 频率为44.1kHz,其计算公式为
?
fpwm=Sclk/256 (4)
?
由于PCA 模块产生的PWM 频率是恒定的44.1kHz,因此,播放44.1kHz 的音频时,每个采样点播放一次。当播放8kHz 的音频时,每个采样点则以44.1kHz 的频率平均播放了5.5 次,这样保证了PWM产生的高频噪声总在44kHz 以上,使滤波后的模拟信号更加平滑,以获得更好的音频输出效果。
?
本设计为了读取不同采样频率的WAVE 文件(包括8K、22.1K、44.1K 三个频率),还需要一个定时器实现不同采样频率的播放。该定时器设置为16 位自动重载模式,其中断间隔是可调整的。在开始读取准备播放的WAVE 文件时,程序将读取该文件的采样频率参数,自动调整定时器T0 的中断频率与其相同,并在中断服务程序中将下一个音频数据更换到CCAPOH 和CCAPOL 寄存器中,这样就保证了音频数据的同步播放。
?
2 系统软件设计
?
本系统软件设计主要包括三个部分,分别是文件系统移植、SD卡操作命令、上层应用程序控制。
?
2.1 文件系统移植
?
PC 机上可以直接写入数据文件到SD 卡,而嵌入式系统读取数据则必须通过建立文件系统来读取。本设计使用了一个免费的文件系统PetitFatFS(PetitFATFileSystemModule)。它是一位日本嵌入式工程师编写的通用软件模块,它与FAT 文件系统兼容。他的个人网站提供了用C 语言编写的源代码以及在不同硬件平台上移植与使用的实例。
?
本系统设计移植了AVR 版本的PetitFatFS 文件系统到STC15单片机上,由于PetitFatFS 文件系统是通用的,所以它不依赖于底层模块。底层I/O 模块不是PetitFatFS 文件系统的一部分,因此,底层读取物理存储介质的函数必须由用户编写。主要的函数有两个,第一个是disk_intialize 函数,用于存储介质的初始化;第二个是disk_readp 函数,用于读取SD 卡的一个扇区,是磁盘操作的核心函数。
?
2.2 SD 卡操作命令
?
在建立了SD 卡物理接口层SPI 的基础上,仅仅可以实现简单的面向字节的数据通道。SD 卡规范制定了一组建立在SPI 总线上的SD 卡操作命令,通过发送不同的操作命令可以实现对SD 卡的复位、初始化以及读写操作。其具体的命令格式和命令应答字格式参考SD 卡规范。
?
针对SD 卡的操作命令时序,首先要对SD 卡实施上电复位操作,复位操作时SCLK 的时钟频率应该在400kHz 以下。SD 卡在上电后默认采用SDIO 接口方式,在CS 高电平的情况下,先通过SCLK 送72 个以上的时钟信号到SD 卡,等待SD 卡内部工作电源稳定,以完成SD 卡的时钟与SCLK 的同步。然后拉低片选CS,发送复位命令CMD0,此时SD 卡自动转换成SPI 接口方式。STC 单片机开始接收SD 卡的应答字,如果收到0x01,表示SD 卡上电复位成功。接着进行SD 卡的初始化操作,需要使用CMD55+ACMD41 两条命令,当单片机收到0x00 的应答后,整个SD 卡初始化工作完成。完成SD 卡的初始化后,就可以通过CMD 指令对SD 卡进行读写操作了。
?
本系统设计涉及到SD 卡扇区的读操作,针对单块扇区数据的读操作,实现以下几步操作是必要的:
?
提高SPI 的时钟频率,但不超过25MHz;
?
单片机发送CMD17 读数据命令;
?
SD 卡回应应答字0x00;
?
单片机接收读数据起始令牌0xFE;
?
接收512 个数据;
?
接收2 字节CRC 校验字。
?
2.3 主函数控制
?
关于主函数部分,包括了STC15 单片机定时器与PCA 模块的初始化、中断处理函数、按键控制、音频wav 的解析和音频数据的读取与播放。
?
3 系统测试及结论
?
通过Keil 开发环境对程序进行编译和链接,将生成的hex 文件下载到目标硬件平台运行。通过测试发现,该系统能完成8K、22.1K、44.1K 三个采样频率WAVE 文件的播放,播放效果可以达到CD 音质。相比于32 位微处理器该WAVE 音乐播放器硬件电路简单,成本低廉,具有很大的实用参考价值。