切换到宽版
  • 81731阅读
  • 149回复

[C51]自称目前音质最好的PWM单片机音频播放器 [复制链接]

上一主题 下一主题
离线easterndigi
 

发帖
415
M币
4398
专家
14
粉丝
134
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2012-08-28
— 本帖被 mydigit 设置为精华(2013-01-30) —
    一般单片机播放音乐有几种方式,1是用软解码+PWM输出,2是软解码+外部DAC输出,3是用硬解码IC(如VS1003)。由于普通单片机的性能不强,所以软解码MP3是不可能的,如果不想加硬解IC,唯一的办法就是用不用解码的格式:WAV。同样,我也选择了WAV。WAV+PWM的方案我不是第一个做,hit00版主也做过,那我为什么还拿一个别人已经做过的东西来参赛呢?因为我有突破:音质。怎么见得我的音质比别人的好呢?我还是从WAV的格式说起。
    我们知道,声音其实就是一种波(声波),我们可以给他画出声波图。音频播放器就是把记录的数据还原成声波。WAV是通过PCM格式来记录声波的。那么PCM到底是怎么工作的呢?看下图(图片来源于网络)

    可以看到,原本平滑的曲线通过PCM编码成了一堆方块山,纵轴对应的就是量化位数,横轴对应的是采样点,很明显,如果我们能够尽可能的提高量化位数和采样点数,那么编码出来的曲线肯定能更加平滑,也就是更接近于原来的声音。但是呢,我们看存储的波形是看不出声音来的。我们还是需要通过某种办法把编码好的数据还原成波形。怎么还原呢?把上图纵轴上的0-15换成电压值,然后接上喇叭,搞定。
    但是,要还原PCM WAV真的有这么容易吗?我们知道,单片机的IO只能输出高低两种电平,不是0V,就是5V,不可能来个2.5V。那么怎么办呢?学过单片机的应该都知道,我们有PWM。但我还是罗嗦点,再来介绍一下这个技术吧。
    我来举个例子。我走路去上学,本来10分钟就能走到,但是今天出门早了,希望20分钟走到。那么有两种方案:1、以原来的1/2速度走 2、一半时间走路,一半时间停下。DAC类似于是前一种,PWM则类似于后一种。像这个例子,我一半的时间走,一半的时间停,就相当于1/2速度;如果我是1/3时间走,那么就相当于1/3速度。
    结合我们音频播放的概念来看,量化位数就是通过改变高电平的时间来解决,而采样点怎么办呢?那我们就要连续的改变高电平的时间。为了达到好的效果,PWM的速度当然是越快越好,以在一定时间内还原更多的采样点。但是PWM要实现高量化位数是比较困难的,为什么呢?听我慢慢解释。一般PWM的量化位数都是8bit,也就是可以还原256种电位。单片机需要做的,就是不断计数,256级的PWM一个周期就要计数256次。如果要实现100kHz的PWM(1秒100000个周期),单片机的主频至少要25.6MHz。而我们一般听的音频都是16位的,也就是65536种电位,同样用PWM达到100kHz,单片机的主频就需要提升到6.6GHz!
    但是很明显,这是不可能的。所以呢,唯一的办法就是用叠加。但是怎么叠加呢?这就需要巧妙运用电阻来实现。其实实现DAC的方式有很多,PWM是一种,电阻网络也是一种。电阻网络又可细分为权电阻DA和倒T形电阻网络DA。下图就是一个倒T形电阻网络DA的电路图。

        图中,D0-Dn就是输入引脚。流入2R支路的电流是依2的倍速递减。很明显,这个电路是可扩展的,你有几个输入脚就有几位的DA。但是捏,可没人说D0-Dn就必须输入数字信号(只有高低两种电平),如果我把两个8位PWM输出滤波后进入这个电阻网络进行叠加,16位不就搞定了吗?

    原理废话了这么多,需要开始制作了。如果你只是简单的照我的电路抄下来,对着焊就OK。如果要自己修改,就要动一番脑筋了。我的电路图并不完美,有近一步改进的空间。

注意:我并没有画单片机的最小系统,我认为这是没有必要的。PWM0和PWM1请分别连接至P1.3和P1.4。我把滤波叠加部分焊在了洞洞板上,把最小系统搭在了面包板上。

单片机最小系统还是很方便的,我用了40MHz的晶振,PWM速度可达150kHz以上

一个稳定的USB2UART模块也非常重要。

这才是本次音质的关键:滤波+叠加

全家福

参数
STC12C5A60S2 40MHz
16bit PWM 采样率23kHz PWM频率155KHz
响应速度 50mV/2.8ms

视频演示:
flash: http://player.youku.com/player.php/sid/XNDQ0Mjg3OTcy/v.swf


软件方面,下位机的程序非常简单,配置下串口,配置下PWM,然后把收到的数据分别送PWM0和PWM1就完事。上位机才是难度所在,关键就是保证声音能匀速稳定的送出,并且要能够将普通的MP3解压 重采样成需要的WAV格式。


需要说明的是,下位机是用TKStudio+SDCC写的,不是Keil C51!上位机是Delphi写的


下位机:
补上上位机:

楼下有位帮帮团的怀疑文章是我老爸写的,我老爸可是中文系的,连微积分都不知道,对电子更是一窍不通。我也不知道我的文风哪里像大学毕业的人写的,我一直都是这个风格,不信可以看看我以前的作品,总不可能全是代笔的吧?。为了这么点M币,我还找人代笔,至于么?我承认,文章中倒T形电阻DA的图是从大学教材里复制来的,但是这并不影响整体得原创性,学以致用啊。

马上就要开学啦,初三了,估计LPC1788是没戏了,趁着还有几天,做个拿的出手的东西来参个赛。走过路过,来捧个场吧~~~(求M)




本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共28条打赏M币+168专家+1
离线iamzo

发帖
2445
M币
1001
专家
1
粉丝
202
只看该作者 1楼 发表于: 2012-08-28
请登录后查看
离线sdf15937

发帖
1748
M币
14
专家
8
粉丝
61
只看该作者 2楼 发表于: 2012-08-28
请登录后查看
离线easterndigi

发帖
415
M币
4398
专家
14
粉丝
134
只看该作者 3楼 发表于: 2012-08-28
回 2楼(sdf15937) 的帖子
请登录后查看
离线gushuailove

发帖
15
M币
77
专家
0
粉丝
2
只看该作者 4楼 发表于: 2012-08-28
请登录后查看
离线rgwan

发帖
910
M币
43
专家
12
粉丝
128
只看该作者 5楼 发表于: 2012-08-28
请登录后查看
离线大懒懒

发帖
3374
M币
102
专家
9
粉丝
189
只看该作者 6楼 发表于: 2012-08-28
请登录后查看
离线巴闭

发帖
19484
M币
7222
专家
55
粉丝
352
只看该作者 7楼 发表于: 2012-08-28
请登录后查看
离线bxak

发帖
800
M币
325
专家
11
粉丝
91
只看该作者 8楼 发表于: 2012-08-28
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共6条打赏M币+27专家+1
离线easterndigi

发帖
415
M币
4398
专家
14
粉丝
134
只看该作者 9楼 发表于: 2012-08-29
回 6楼(巴闭) 的帖子
请登录后查看
[ 此帖被nbzwt在2012-08-29 06:14重新编辑 ]
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个