引言
PWM波由谐波和直流量组成,谐波是需要被滤除的信号,即通过模拟低通滤波器可以将调制后的PWM 信号转换成模拟信号,滤波器可以消除大部分高频成分,最后只留下直流量,图1为PWM信号还原为模拟信号的示意图。普通单片机受限于其处理能力,一般只能调制8位左右的PWM信号,因此只能还原8位的WAV声音文件。而用D/A转换器实现模拟量的输出成本较高,音质效果也不佳。电阻网络对各频带及幅值的信号的阻碍比较统一,保证了声音信号保真率。图1PWM波经过滤波后得到的模拟波形本文将16位高音质WAV信号进行拆分处理,一部分由PWM进行调制,另一部分控制8个I/O口中的某几路输出PWM,信号经低通滤波和功率放大后送至喇叭等放声设备,以此将数字语音信号转换成模拟信号,达到语音播放的目的。
1 原理及误差分析
1.1 基本原理
16位数字信号可表示自然界65 535种声音信号,据此将16位数字量量化为对应的模拟信号,便完成声音的还原:
这里将16位数据Data拆分为X1和X2,且有Data=X1×X2。将X1通过单片机的定时器调制为PWM信号,通过控制占空比来控制输出电压大小,即:
将X2用来控制单片机的8路I/O是输出调制好的PWM信号,还是输出信号“0”,该8路信号送到电阻网络,即:
图1 PWM波经过滤波后得到的模拟波形
则最后输出的电压大小为:V0=X1256×X2256×Vcc,以此便可以实现16位D/A转换。
1.2 数据拆分形式分析
针对基本原理中提出的将16位数据拆分为高低位两部分在单片机中的实现,提出3种方案并对其进行对比分析。
1.2.1 方案1
将16位数据从中间截断,并判断高低8位的值是否为0,是则补1,避免拆分的两个数据有一个为0时导致输出也为0。拆分后的低8位送给定时器进行PWM合成,高8位送给电阻网络控制输出。该方式占用单片机资源很少,对单片机处理能力没有要求,可以在所有单片机上实现。但PWM与电阻网络模拟电压输出均有非线性失真,当拆分的两个数据中有一个较小(接近0)或较大(接近255)时,对最后的输出电压有较大影响。
1.2.2 方案2
利用查表法,将Data=X1×X2的所有65 536种数据的拆分结果计算出来,建表后存到单片机中,只需根据数据大小对号查出X1、X2进行PWM调制并控制电阻网络输出即可(X1、X2均不大于256)。该数组需占用128 K的存储空间,但不是所有数据都能写成Data=X1×X2形式,只能尽可能地去逼近,最终的输出值与Data会有少许出入。该方案也不需要单片机具有较强的处理能力,且避免了方案1的缺陷,但因其逼近的拆分方式导致其输出精度有损,达不到16位高精度。
1.2.3 方案3
判断16位数据的高位为0的位数,将不为0的低位数据从中间一分为二,然后将拆分后的数据均左移相同的位数,保证数据拆分前后“一致”,将拆分后的数据分别进行PWM调制和控制电阻网络输出。一般单片机可轻松完成,占用资源较少,避免了方案2的缺陷,但在左移时会有数据丢失,导致输出误差较大,特别是当数据小于255时,其误差是不可接受的。
根据现有的理论分析和实际的测试效果来看,方案2较为理想。本文针对方案2展开设计。
2 系统设计
系统框图如图2所示,该方案采用TI公司的MSP430F5529作为主控MCU,它将TF卡中的WAV文件读取出来,并在TF卡中的数据表中查出对应的数据拆分值,然后存放在单片机中分出来的1 KB的缓冲区中。定时器A定时读取缓冲区中的数据,定时器B完成PWM调制并同时控制电阻网络输出。由电阻网络输出的信号经二阶低通滤波器和功率放大器后送到喇叭完成语音播放。带触摸功能的TFT液晶屏用来显示和控制语音播放。单片机的供电由两节干电池完成,功率放大电路供电由12 V直流电源提供。
图2 系统框图
2.1 硬件设计
电阻网络的电路图如图3所示,利用电压叠加定理和电阻分压计算分析可知,其输出为Vout=(1/2×Vio1+1/4×Vio2+1/8×Vio3+…+1/256×Vio8)×Vcc。它仅由两种阻值的电阻组成,阻值选取容易,其成本也低。
图3 电阻网络
低通滤波和功率放大电路如图4所示,设计中采用了二阶无源低通滤波器,功率放大器选择TI公司的LM386,它适合放大低电压的音频信号。图4中R1、R2、C5、C6组成二阶低通滤波器,其在下降率为6 dB时的截止频率为16 kHz,用以播放采样频率为22.05 kHz的WAV语音。C7、R3组成了一阶高通滤波器。此处电压增益为20 dB,C3为隔直电容。LS1接0.5 W/8 Ω的喇叭。
图4 低通滤波和功放电路
2.2 软件设计
本系统在硬件平台的支持下,采用状态机的形式完成对SD卡的读取、触摸控制信号的获取、WAV文件的播放以及WAV的文件名和进度等信息的显示。SD卡读取及LCD显示驱动现已比较成熟,此处不再展开。其中的关键点在于保证WAV音频高音质流畅播放的“同时”,完成控制及显示等功能。为实现这一目标,本设计用另一个定时器来计算下次指令执行所剩时间,低于某一阈值则暂停触控信号的获取及信息的更新显示,优先保证音频能流畅播放。实验表明,该方法在触控及LCD显示上并无明显延迟。其软件流程图如图5所示。
图5 软件流程图
结语
语音的频率范围为300~3 000 Hz,而音乐的频率范围为20 Hz~20 kHz,在PWM语音播放器中需要注意的是PWM的频率一般是低通滤波器截止频率的4 倍以上,所以在播放音乐时可根据实际需要提高声音的PWM频率,还可以修改低通滤波器的电容参数(C5、C6),将电容减小,并增大滤波器的截止频率,从而达到音乐的频带要求。
该方案采用PWM并结合电阻网络的形式,其结构简单,性价比高。现单片机的主频很容易突破12 MHz,加上MSP430F5529为16位单片机,其调制PWM的精度可达10位以上,基本弥补了数据的逼近处理带来的误差,提高了整个系统的语音播放音质。该方案可广泛用于火车站的播报提醒、银行等场合的叫号系统、电话应答机以及各种需要高音质语音播报的场合。