|
最近用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试一下。 |
|