搜索
bottom↓
回复: 64
打印 上一主题 下一主题

最近玩MO51和AVR的汇报

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2010-12-25 00:58:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用M16(AVR)和M051做了2个WAVE播放器:使用SPI口读SD卡上的WAV文件,然后通过2个8位PWM构成的16位DAC播放(只使用一片MCU,完成播放功能)。

目标是流畅的播放44.1K,16位,双声道的WAV文件。

一、使用M16可以做到非常流畅的读取8K(8/16位,单/双声道)、22.05K(8/16位,单/双声道)、44.1k(8位、单/双声道)、44.1k(16位、单声道)的WAV文件。由于AVR没有足够的PWM输出,所以读取不同文件,还需要做数据处理和转换,合成为16位单声道播放。

    M16系统时钟使用11.2896M,8位PWM的频率为11.2896/256 = 44.1K。 换句话说,要流畅播放,256个机器时钟的间隔,必须把一个要准备播放的数据准备好,这里包括读SD卡数据,数据提取和转换处理,另外还要扫描按键、LED控制显示、检查SD卡是否拔出....还是有一定的困难的。

   对于11.2896M的M16,SPI的时钟最高只能为5.6M,读SD卡的速度也不理想(SD卡的速度可以达到25M)。尝试使用22M的系统时钟,但此时M16工作已经不稳定了。 所以最后一个指标44.1k(16位、双声道)没有达到。

二、使用M051,使用内部22MRC,然后PLL到45.1584M,作为系统时钟,此时PWM的频率是44.1k的4倍,此时,要流畅播放,1024个机器时钟的间隔,必须把一个要准备播放的数据准备好,时间上比较充裕。另外SPI的时钟最高能到11.2896M。M051有8个8位的PWM,使用其中4个PWM,构成左右16位的双声道输出。
     在这个条件下,已经实现了双声道的播放44.1K、22.05k、8k、16/8位、单/双声道的各种文件了。

     不过MO51的PWM比较特别:输出占空比不能为0%,最小的占空比为1/256,不明白为什么要这样设计。

     MO51的PLL比较灵活,可以通过调节2-3个参数,产生各种不同、范围比较广泛的系统时钟,这个到是一个优点。

下一步有时间,用STM32试一下。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
发表于 2010-12-25 02:30:07 | 只看该作者
沙发啊,马老师的可第一次这么靠前。

出0入0汤圆

3
发表于 2010-12-25 06:12:31 | 只看该作者
2个8位PWM构成的16位DAC播放

出0入0汤圆

4
发表于 2010-12-25 06:37:19 | 只看该作者
占位

出0入0汤圆

5
发表于 2010-12-25 07:42:13 | 只看该作者
留名

出0入0汤圆

6
发表于 2010-12-25 07:59:44 | 只看该作者
马老师的贴得顶!

出0入0汤圆

7
发表于 2010-12-25 08:37:32 | 只看该作者
M051要快多了,如涉及到*+运算的话,优势更明显,不会在一个挡次上。但成本却差不多

出0入0汤圆

8
发表于 2010-12-25 09:00:50 | 只看该作者
马老师好

出0入0汤圆

9
发表于 2010-12-25 09:02:17 | 只看该作者
M051有前途

出0入0汤圆

10
发表于 2010-12-25 09:05:58 | 只看该作者
谢谢,马老师,

出0入0汤圆

11
发表于 2010-12-25 09:09:12 | 只看该作者
标记
谢马老师分享。

出0入0汤圆

12
发表于 2010-12-25 10:07:00 | 只看该作者
谢谢

出0入0汤圆

13
发表于 2010-12-25 13:24:51 | 只看该作者
听课

出0入0汤圆

14
 楼主| 发表于 2010-12-28 02:26:14 | 只看该作者
1。M051超频到56M,工作还是非常稳定的。

2。M051超频到56M后,设置SPI的时钟为14M(手册上说最高达16M),但读SD卡失败(不知道是M051还是SD卡的问题),只能设置SPI时钟为9M,此时读WAV文件音频数据有点来不及,声音中能听到间断的“咔咔”声。

3。权衡下来,还是使用45M的系统时钟,这样SPI的时钟为11M。“咔咔”声没有了。看来提高读SD的速度非常重要。在1024个系统时钟间隔中,必须读到4个字节数据,还要调整循环队列的指针,还要扫描4个按键,还要检测SD卡是否拔出,还要查找FAT表......要做好多事情,非常紧张。要充分考虑发挥和提高效率,现在全部采用C完成。

4。下载了30几首APE文件(本站找到的连接,都是我比较熟悉的音乐),转换成WAWE文件,放出的44.1K、16位、立体声的效果非常不错,基本达到“天籁”级了。

5。总的成本:6元(M051)+ 0.5元(卡座)+ 0.6元(LM324)+ 0.9 元(电阻电容做2路低通)+ 0.5元(立体声插座) = 8.5元!SD卡不算,使用的45元的有源小音箱。

6。实际最好使用RailtoRail运算放大器代替LM324,模拟电路部分(解决幅度问题)和电源部分只要稍微做调整,就能达到更好的效果。我在这2个方面未做更多考虑,只使用最简单的一阶有源低通滤波电路。

出0入0汤圆

15
发表于 2010-12-28 07:54:14 | 只看该作者
马老师的贴子一定要顶!

出0入0汤圆

16
发表于 2010-12-28 08:10:41 | 只看该作者
马老师厉害

出0入0汤圆

17
发表于 2010-12-28 08:30:10 | 只看该作者
马老师详细讲解一下把,sd卡用的文件系统是自己写的还是用fatfs啊

出0入0汤圆

18
发表于 2010-12-28 08:58:15 | 只看该作者
同上,详细的讲讲。

出0入0汤圆

19
发表于 2010-12-28 10:19:57 | 只看该作者
请求开源一下~让大家学习学习~

出0入0汤圆

20
发表于 2010-12-28 10:50:52 | 只看该作者
NEC的8位单片机是不能输出100%的PWM

出0入0汤圆

21
 楼主| 发表于 2010-12-29 01:20:17 | 只看该作者
仔细看过M051、STM32与PWM相关的部分(包括AVR),都不能实现0%-100%的快速PWM。要么是1/256 - 256/256;要么是0/256-255/256。

出0入0汤圆

22
 楼主| 发表于 2010-12-29 02:00:36 | 只看该作者
回复【18楼】cat_li
马老师详细讲解一下把,sd卡用的文件系统是自己写的还是用fatfs啊

-----------------------------------------------------------------------

使用的是Petit FAT,FatFs的缩减版,因为不需要写SD卡的。基本的介绍见《《AVR单片机嵌入式系统原理与应用实践》 第19章(部分)---会说话的单片机》http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4419655&bbs_page_no=1&bbs_id=1003。

这个是在上面的基础上,使用M051做CD音质的双声道WAVE播放。AVR为8位机,速度也不够快,M16中T/C也不够,所以只能做简单的。用M128,是可以做到播放44.1k\16bit\2声道的WAVE,但速度和价格都没有优势。M051是32位,有8个8位PWM,还有另外的T/C,可以工作在50M,适合做这个东西。

用偶的播放器播放APE转换成WAVE的文件,明显比听MP3的音质要好。因为MP3已经压缩过了,损失了好多音质。APE是无损的压缩格式,转成WAVE是最原始的数字音频了。缺点就是文件体积大,一首歌至少比MP3格式大5-8倍。不过现在的SD卡容量大,也便宜了。偶转换了50首APE到WAVE,正好放满2G的SD卡。

代码长度不到8K,RAM使用2K多一点,还有很多资源没有用。

Program Size: Code=7652 RO-data=224 RW-data=48 ZI-data=2392  
FromELF: creating hex file...
User command #1: fromelf --bin ".\output\wave.axf" --output ".\output\wave.bin"
User command #2: fromelf --text -c ".\output\wave.axf" --output ".\output\wave.txt"
".\Output\wave.axf" - 0 Error(s), 11 Warning(s).

出0入0汤圆

23
发表于 2010-12-29 10:50:00 | 只看该作者
学习,

出0入0汤圆

24
发表于 2010-12-29 11:58:15 | 只看该作者
前后贴都看了,发贴留个记录

出0入12汤圆

25
发表于 2010-12-30 00:08:43 | 只看该作者
"2个8位PWM构成的16位DAC播放"方案,不知道会不会出现某一失真频率(例如,频率是:采样频率 的 256 分之 1)?
由于电阻(比如:精度10%)的选择不当,这个频率会不会特别明显?

44.1K采样 对应172Hz
22.05K    对应96Hz

这个频率人应该能听出来吧.

出0入0汤圆

26
 楼主| 发表于 2010-12-30 19:58:54 | 只看该作者
不理解楼上所说的问题。

电阻的误差与频率之间有什么关系?楼上指的什么电阻》是LPF中的电阻,还是构成比例实现16位DAC的电阻?

出0入12汤圆

27
发表于 2010-12-30 20:29:00 | 只看该作者
构成比例实现16位DAC的电阻

出0入0汤圆

28
 楼主| 发表于 2010-12-30 20:31:06 | 只看该作者
与频率有什么关系?如果这个电阻误差,影响所有的频率。

我使用PWM频率为44100*5。

目前我做的DD,问题在高频的噪声处理不够。当静音情况下,攻放开到最大时,能听到高频的噪声(绝对不是172Hz或96Hz的东西)。这个需要处理模拟部分的电源和LPF的设计。

出0入12汤圆

29
发表于 2010-12-30 20:52:48 | 只看该作者
想错了.是的,影响所有频率.

出0入168汤圆

30
发表于 2011-1-8 14:21:11 | 只看该作者
我做的开始播放和结束播放时,会出现……哒……的一声,不知道怎样才能消除,我用的TDA2822M的功放。

出0入0汤圆

31
发表于 2011-1-8 15:36:54 | 只看该作者
羡慕并顶起!!

什么时候有时间我也要自己做个wav播放器,听音乐肯定比电脑听MP3强!!!

学习!!

先记号吧

出0入0汤圆

32
发表于 2011-1-8 15:37:05 | 只看该作者
羡慕并顶起!!

什么时候有时间我也要自己做个wav播放器,听音乐肯定比电脑听MP3强!!!

学习!!

先记号吧

出0入0汤圆

33
 楼主| 发表于 2011-1-9 16:02:28 | 只看该作者
回复【31楼】eiglxl
我做的开始播放和结束播放时,会出现……哒……的一声,不知道怎样才能消除,我用的tda2822m的功放。
-----------------------------------------------------------------------

注意看WAVE文件的格式,对于8位的音频数据,静音值为0x7f,16位数据静音值为0x8000。

所以你的PWM一直需要工作,不放音乐时,要产生静音值的数据。

如果停止PWM,那么输出不是5V(255)就是0V(0),这2个是声音振幅的正最大/负最小,也就是2个峰值,所以产生“哒”声音。

出0入0汤圆

34
 楼主| 发表于 2011-1-9 16:03:37 | 只看该作者
回复【33楼】yuqilala
羡慕并顶起!!
什么时候有时间我也要自己做个wav播放器,听音乐肯定比电脑听mp3强!!!
学习!!
先记号吧

-----------------------------------------------------------------------

什么时候有时间就代表着基本是没有时间了。

出0入0汤圆

35
发表于 2011-1-9 16:15:01 | 只看该作者
mark

出0入0汤圆

36
发表于 2011-2-8 13:57:16 | 只看该作者
跟进,也想DIY一下

出0入168汤圆

37
发表于 2011-2-8 14:43:28 | 只看该作者
回复【34楼】machao  
回复【31楼】eiglxl
我做的开始播放和结束播放时,会出现……哒……的一声,不知道怎样才能消除,我用的tda2822m的功放。
-----------------------------------------------------------------------
注意看wave文件的格式,对于8位的音频数据,静音值为0x7f,16位数据静音值为0x8000。
所以你的pwm一直需要工作,不放音乐时,要产生静音值的数据。
如果停止pwm,那么输出不是5v(255)就是0v(0),这2个是声音振幅的正最大/负最小,也就是2个峰值,所以产生“哒”声音。
-----------------------------------------------------------------------

就是这个原因,谢谢马老师!

出0入0汤圆

38
发表于 2011-2-17 10:00:28 | 只看该作者
请问24位数据的静音值是多少?

如果想把24位, 44.1KHz的音频数据转换成16位, 44.1KHz的音频数据, 怎么转换?回复【34楼】machao
回复【31楼】eiglxl  
我做的开始播放和结束播放时,会出现……哒……的一声,不知道怎样才能消除,我用的tda2822m的功放。
-----------------------------------------------------------------------
注意看wave文件的格式,对于8位的音频数据,静音值为0x7f,16位数据静音值为0x8000。
所以你的pwm一直需要工作,不放音乐时,要产生静音值的数据。
如果停止pwm,那么输出不是5v(255)就是0v(0),这2个是声音振幅的正最大/负最小,也就是2个峰值,所以产生“哒”声音。
-----------------------------------------------------------------------

请问24位数据的静音值是多少?

如果想把24位, 44.1KHz的音频数据转换成16位, 44.1KHz的音频数据, 怎么转换?

出0入168汤圆

39
发表于 2011-2-17 10:25:36 | 只看该作者
用GoldWave

出0入0汤圆

40
发表于 2011-3-26 20:36:23 | 只看该作者
标记下

出0入0汤圆

41
发表于 2011-6-14 16:58:29 | 只看该作者
马老师,你好,最近我一直在玩SD卡。SD卡的底层驱动已经没问题,可是FAT文件系统一直没搞定,好烦。马老师能否提供基于AVR单片机CVAVR写的FAT文件系统参考一下?先谢了!

出0入0汤圆

42
发表于 2011-7-16 16:58:02 | 只看该作者
学习了

出0入0汤圆

43
发表于 2011-7-16 18:57:23 | 只看该作者
马老师的贴子一定要顶

出0入0汤圆

44
发表于 2011-7-16 19:33:43 | 只看该作者
不过MO51的PWM比较特别:输出占空比不能为0%,最小的占空比为1/256,不明白为什么要这样设计。
================================================================================================

是因为采用分频办法来做的,所以不可以做1分频,最少是2也就是说最高只能是主频一半

出0入0汤圆

45
发表于 2011-8-3 12:43:16 | 只看该作者
关心硬件电路是怎么样的

出0入0汤圆

46
发表于 2011-8-24 14:44:27 | 只看该作者
学习了!!

出0入0汤圆

47
发表于 2011-8-30 04:01:00 | 只看该作者
如下图:(数据部分的静音数据不为0x8000,请问马老师是这样把静音数据变为0x8000的,能告诉我音频格式转化软件吗?)

(原文件名:无标题.jpg)
回复【49楼】rigol_fan 西门吹雪
-----------------------------------------------------------------------

出0入0汤圆

48
发表于 2011-8-30 09:37:15 | 只看该作者
不过MO51的PWM比较特别:输出占空比不能为0%,最小的占空比为1/256,不明白为什么要这样设计。
================================================================================================
我好像记得AVR的单斜率PWM模式(快速PWM)也是如此的,AVR里要解决这个问题应当使用双斜率PWM(相位修正PWM),但这个模式的输出频率是前者的一半。
M051没有双斜率模式。

出0入0汤圆

49
发表于 2011-8-30 11:13:23 | 只看该作者
你们谁能告诉我,APE转WAVE的软件是那个软件!!
我用的软件转出来的静音值不是0x8000,播放出来的音乐噪音太大!!
谢谢哈!!

出0入0汤圆

50
发表于 2011-9-3 23:03:27 | 只看该作者
来学习学习

出0入0汤圆

51
发表于 2012-4-11 20:20:17 | 只看该作者
马老师没公布PWM后续处理的电路图哦!

出0入0汤圆

52
发表于 2012-4-11 21:27:37 | 只看该作者
总的成本:6元(M051)+ 0.5元(卡座)+ 0.6元(LM324)+ 0.9 元(电阻电容做2路低通)+ 0.5元(立体声插座) = 8.5元!SD卡不算,使用的45元的有源小音箱。
=====================================================
这成本太给力了

出0入0汤圆

53
 楼主| 发表于 2012-4-14 18:01:15 | 只看该作者
ouyitx99 发表于 2011-8-30 04:01
如下图:(数据部分的静音数据不为0x8000,请问马老师是这样把静音数据变为0x8000的,能告诉我音频格式转化 ...

首先,你对“静音”的理解是错误的,看一下WAVE的数据格式;



表1中的最大值和最小值是指正弦波的幅度值,而正弦波是交流信号,幅度最大值和最小值,声音都是最大的(能量最大)。“静音”应该是中间值,也就是表2中的128(8位)和0(16位)

从表2中可以看出,16位的数据是采用int型补码格式数据,因此换算非常简单: m_data += 0x8000;  (m_data为16位int整形)

仔细分析:16位的WAV文件,语音数据采用int型补码方式保存的(见我编写教材第2版,P539页,表19-7):
                               最大值     ......    比静音大1        静音值(0电平)      比静音小1  ........     次最小             最小值   
原始数据                   32767                     1                0                              -1                 -32767              -32768
(十六进制)             0x7fff                   0x0001          0x0000                   0xffff                0x8001           0x8000

转换后                      0xffff                    0x8001          0x8000                   0x7fff               0x0001           0x0000
用于16位PWM,
如果对应0-5v 的DAC      5v                                          2.5(静音)                                                             0v
通过电容隔直流            +2.5v                                         0v                                                                      -2.5v      进入后面的功放(这是模拟电路的基础啦)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

54
发表于 2012-4-26 16:30:27 | 只看该作者
看到有朋友直接PWM从引脚直接输出,可以听到很好的声音,为什么我从引脚直接输出后,持续有一个尖锐的背景噪音,这个噪音信号很强,同时语音信号却比较弱?
(我用普通51,定时器中断,输出8KHz,8bit的声音;引脚接耳机,耳机放在桌子上就可以听到噪音,耳机放到耳朵上,才能听见里面的语音。)

出0入17汤圆

55
发表于 2012-4-26 17:35:33 | 只看该作者
=========每小时只能发一个贴!========
DAC为0-5V,静音值为2.5V,这个值对应着高低电平不断变化,也就会输出声音,不会是静音的。

要静音,持续输出低电平或高电平(电平恒定)才可以。对于8位wav的静音值,大家如何处理?求教。

出0入17汤圆

56
发表于 2012-5-2 21:21:14 | 只看该作者
问题已解决。
1.提高PWM频率,可以消除尖锐的背景噪音
2.8bit的wav,只要直接输出对应的模拟电压就可以,静音值不需要特别处理。

出0入0汤圆

57
发表于 2013-4-10 11:35:42 | 只看该作者
不知道马老师后来用STM32的PWM试过没有?效果如何呢?

出0入0汤圆

58
 楼主| 发表于 2013-4-17 00:29:39 | 只看该作者
dragonwww 发表于 2013-4-10 11:35
不知道马老师后来用STM32的PWM试过没有?效果如何呢?

我使用M16,STC12C08S2和MO51都做过。MO51做的最好,两路16位输出。而M16\STC 只能做1路16位。因为需要4个8位的PWM输出,系统时钟、RAM的要求都达不到做2路16位输出的需要。STM32肯定没有问题的,他同M051都是相同的架构,性能比M051强,不会差的。

出0入0汤圆

59
发表于 2013-4-17 09:28:15 | 只看该作者
machao 发表于 2013-4-17 00:29
我使用M16,STC12C08S2和MO51都做过。MO51做的最好,两路16位输出。而M16\STC 只能做1路16位。因为需要4 ...

谢谢马老师的回复,搭个电路来试试效果。

出0入0汤圆

60
发表于 2016-3-30 19:38:21 | 只看该作者
能不能把用2路8位PWM合成一路16位的DAC的电路发上来,被这个问题困扰着,谢谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 04:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表