(原创)
最近的DIY项目需要音频播放,于是我搭建了这个试验性电路,先体验一下DAC的放音效果。
音频信号是随时间变化的电压信号,只要把对应的音乐数据存储在单片机的flash存储器中,就可以控制DA转换器还原出原来的电压信号。DA转换可以使用DAC转换器,也可以通过单片机PWM滤波后来实现。由于单片机通常内置PWM模块,并且无需其他外部IC,PWM方式受到很多爱好者的青睐,但PWM输出音质较DAC芯片稍差。本次使用的是便宜易得的DAC0832芯片。DAC0832属于电流输出型DAC,但它同时也提供了电压模式。如图所示:
电压模式的注意事项由于T形电阻网络的开关要求,基准电压必须介于电源电压和地之间。并且不能是负值,否则内部Iout引脚连接的二极管会将其限制。家中没有合适的基准源,我用一个二极管的正向压降作为电压基准,在输出端产生了最大1V左右的电压,随后连接的运算放大器将DAC的输出电压放大3倍,送往输出接口和LM386。
0832内部设有两个缓冲器,目的是方便多路数据同时输出。本应用要求快速响应,除ILE高电平之外,其他控制引脚应全部接低电平以使锁存器处于直通状态。由于产生高电压较为不便,为了获得更大的电压摆幅,我选择了TI的OPA241轨至轨运放。OPA241是专为低电压应用设计的精密运放,具有低失调电压和高输入阻抗等优点。
下面展示了一个简单的应用,通过串口接收音频文件并播放。
the turtles - "happy together"点击此处查看视频
XXXXXXXXXXXXXXXXXX/v_show/id_XXXXXXXXXXXXXXXXml 后半部分音量并没有变化,可能是相机问题
音频文件是在audition中编辑的。步骤如下:
导入
设置输出选项。注意左下角,请去掉文件头
恭喜,你已经拥有可以通过单片机播放的8位PCM线性编码音频文件了。采样率为11025赫兹(再大的话串口不一定受得了)。
由于单片机几乎没有缓存空间,所以音频只能跟着串口速度走。
按照10位异步计算,11025*(5/4)*8等于110250bps。这个速度和标准波特率115200非常接近,但手头只有12和24M晶振,误差太大,不得已用了128000bps,播放速度是正常的1.16倍。。。囧
写个小程序,用串口助手将文件发出,即可享受美妙的音乐喽。
(STC12C5A60S2)
#include"STC12C5A60S2.h"
void UART_init()
{
SCON=0x50;
BRT=0xfa;
AUXR=AUXR|0x15;
EA=1;
ES=1;
}
void timerint() interrupt 4
{
RI=0;
P0=SBUF;
}
void main()
{
UART_init();
while(1);
}
欢迎击中
200字以内,仅用于支线交流,主线讨论请采用回复功能。