最近玩MO51和AVR的汇报
最近用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试一下。 沙发啊,马老师的可第一次这么靠前。 2个8位PWM构成的16位DAC播放 占位 留名 马老师的贴得顶! M051要快多了,如涉及到*+运算的话,优势更明显,不会在一个挡次上。但成本却差不多 马老师好 M051有前途 谢谢,马老师, 标记
谢马老师分享。 谢谢 听课 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个方面未做更多考虑,只使用最简单的一阶有源低通滤波电路。 马老师的贴子一定要顶! 马老师厉害 马老师详细讲解一下把,sd卡用的文件系统是自己写的还是用fatfs啊 同上,详细的讲讲。 请求开源一下~让大家学习学习~ NEC的8位单片机是不能输出100%的PWM 仔细看过M051、STM32与PWM相关的部分(包括AVR),都不能实现0%-100%的快速PWM。要么是1/256 - 256/256;要么是0/256-255/256。 回复【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). 学习, 前后贴都看了,发贴留个记录 "2个8位PWM构成的16位DAC播放"方案,不知道会不会出现某一失真频率(例如,频率是:采样频率 的 256 分之 1)?
由于电阻(比如:精度10%)的选择不当,这个频率会不会特别明显?
44.1K采样 对应172Hz
22.05K 对应96Hz
这个频率人应该能听出来吧. 不理解楼上所说的问题。
电阻的误差与频率之间有什么关系?楼上指的什么电阻》是LPF中的电阻,还是构成比例实现16位DAC的电阻? 构成比例实现16位DAC的电阻 与频率有什么关系?如果这个电阻误差,影响所有的频率。
我使用PWM频率为44100*5。
目前我做的DD,问题在高频的噪声处理不够。当静音情况下,攻放开到最大时,能听到高频的噪声(绝对不是172Hz或96Hz的东西)。这个需要处理模拟部分的电源和LPF的设计。 想错了.是的,影响所有频率. 我做的开始播放和结束播放时,会出现……哒……的一声,不知道怎样才能消除,我用的TDA2822M的功放。 羡慕并顶起!!
什么时候有时间我也要自己做个wav播放器,听音乐肯定比电脑听MP3强!!!
学习!!
先记号吧 羡慕并顶起!!
什么时候有时间我也要自己做个wav播放器,听音乐肯定比电脑听MP3强!!!
学习!!
先记号吧 回复【31楼】eiglxl
我做的开始播放和结束播放时,会出现……哒……的一声,不知道怎样才能消除,我用的tda2822m的功放。
-----------------------------------------------------------------------
注意看WAVE文件的格式,对于8位的音频数据,静音值为0x7f,16位数据静音值为0x8000。
所以你的PWM一直需要工作,不放音乐时,要产生静音值的数据。
如果停止PWM,那么输出不是5V(255)就是0V(0),这2个是声音振幅的正最大/负最小,也就是2个峰值,所以产生“哒”声音。 回复【33楼】yuqilala
羡慕并顶起!!
什么时候有时间我也要自己做个wav播放器,听音乐肯定比电脑听mp3强!!!
学习!!
先记号吧
-----------------------------------------------------------------------
什么时候有时间就代表着基本是没有时间了。 mark 跟进,也想DIY一下 回复【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的音频数据, 怎么转换?回复【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的音频数据, 怎么转换? 用GoldWave 标记下 马老师,你好,最近我一直在玩SD卡。SD卡的底层驱动已经没问题,可是FAT文件系统一直没搞定,好烦。马老师能否提供基于AVR单片机CVAVR写的FAT文件系统参考一下?先谢了! 学习了 马老师的贴子一定要顶./emotion/em011.gif 不过MO51的PWM比较特别:输出占空比不能为0%,最小的占空比为1/256,不明白为什么要这样设计。
================================================================================================
是因为采用分频办法来做的,所以不可以做1分频,最少是2也就是说最高只能是主频一半 关心硬件电路是怎么样的 学习了!! 如下图:(数据部分的静音数据不为0x8000,请问马老师是这样把静音数据变为0x8000的,能告诉我音频格式转化软件吗?)
http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_672384FSO57Y.jpg
(原文件名:无标题.jpg)
回复【49楼】rigol_fan 西门吹雪
----------------------------------------------------------------------- 不过MO51的PWM比较特别:输出占空比不能为0%,最小的占空比为1/256,不明白为什么要这样设计。
================================================================================================
我好像记得AVR的单斜率PWM模式(快速PWM)也是如此的,AVR里要解决这个问题应当使用双斜率PWM(相位修正PWM),但这个模式的输出频率是前者的一半。
M051没有双斜率模式。 你们谁能告诉我,APE转WAVE的软件是那个软件!!
我用的软件转出来的静音值不是0x8000,播放出来的音乐噪音太大!!
谢谢哈!! 来学习学习 马老师没公布PWM后续处理的电路图哦! 总的成本:6元(M051)+ 0.5元(卡座)+ 0.6元(LM324)+ 0.9 元(电阻电容做2路低通)+ 0.5元(立体声插座) = 8.5元!SD卡不算,使用的45元的有源小音箱。
=====================================================
这成本太给力了 ouyitx99 发表于 2011-8-30 04:01 static/image/common/back.gif
如下图:(数据部分的静音数据不为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 进入后面的功放(这是模拟电路的基础啦)
看到有朋友直接PWM从引脚直接输出,可以听到很好的声音,为什么我从引脚直接输出后,持续有一个尖锐的背景噪音,这个噪音信号很强,同时语音信号却比较弱?
(我用普通51,定时器中断,输出8KHz,8bit的声音;引脚接耳机,耳机放在桌子上就可以听到噪音,耳机放到耳朵上,才能听见里面的语音。) =========每小时只能发一个贴!========
DAC为0-5V,静音值为2.5V,这个值对应着高低电平不断变化,也就会输出声音,不会是静音的。
要静音,持续输出低电平或高电平(电平恒定)才可以。对于8位wav的静音值,大家如何处理?求教。
问题已解决。
1.提高PWM频率,可以消除尖锐的背景噪音
2.8bit的wav,只要直接输出对应的模拟电压就可以,静音值不需要特别处理。 不知道马老师后来用STM32的PWM试过没有?效果如何呢? dragonwww 发表于 2013-4-10 11:35 static/image/common/back.gif
不知道马老师后来用STM32的PWM试过没有?效果如何呢?
我使用M16,STC12C08S2和MO51都做过。MO51做的最好,两路16位输出。而M16\STC 只能做1路16位。因为需要4个8位的PWM输出,系统时钟、RAM的要求都达不到做2路16位输出的需要。STM32肯定没有问题的,他同M051都是相同的架构,性能比M051强,不会差的。 machao 发表于 2013-4-17 00:29 static/image/common/back.gif
我使用M16,STC12C08S2和MO51都做过。MO51做的最好,两路16位输出。而M16\STC 只能做1路16位。因为需要4 ...
谢谢马老师的回复,搭个电路来试试效果。{:smile:} 能不能把用2路8位PWM合成一路16位的DAC的电路发上来,被这个问题困扰着,谢谢。
页:
[1]