文号
t49962
阅读
14863
回复
21
收藏
11
DAC唱起来!
2012/08/24
IP:北京
(原创)



最近的DIY项目需要音频播放,于是我搭建了这个试验性电路,先体验一下DAC的放音效果。



03.jpg



04.jpg



音频信号是随时间变化的电压信号,只要把对应的音乐数据存储在单片机的flash存储器中,就可以控制DA转换器还原出原来的电压信号。

DA转换可以使用DAC转换器,也可以通过单片机PWM滤波后来实现。由于单片机通常内置PWM模块,并且无需其他外部IC,PWM方式受到很多爱好者的青睐,但PWM输出音质较DAC芯片稍差。


本次使用的是便宜易得的DAC0832芯片。DAC0832属于电流输出型DAC,但它同时也提供了电压模式。

如图所示:



24.jpg



dw.jpg



电压模式的注意事项

由于T形电阻网络的开关要求,基准电压必须介于电源电压和地之间。并且不能是负值,否则内部Iout引脚连接的二极管会将其限制。


家中没有合适的基准源,我用一个二极管的正向压降作为电压基准,在输出端产生了最大1V左右的电压,随后连接的运算放大器将DAC的输出电压放大3倍,送往输出接口和LM386。



sd.jpg



0832内部设有两个缓冲器,目的是方便多路数据同时输出。本应用要求快速响应,除ILE高电平之外,其他控制引脚应全部接低电平以使锁存器处于直通状态。


由于产生高电压较为不便,为了获得更大的电压摆幅,我选择了TI的OPA241轨至轨运放。OPA241是专为低电压应用设计的精密运放,具有低失调电压和高输入阻抗等优点。



下面展示了一个简单的应用,通过串口接收音频文件并播放。



the turtles - "happy together"

点击此处查看视频

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

后半部分音量并没有变化,可能是相机问题


音频文件是在audition中编辑的。步骤如下:



01.jpg

导入



02.jpg

设置输出选项。注意左下角,请去掉文件头




恭喜,你已经拥有可以通过单片机播放的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);
}  



欢迎击中 fs.jpg
+32
科创币
绘梦工坊
2012/08/24
+150
科创币
任某人
2012/08/25
nice~~
+50
科创币
金坷居士
2012/08/25
你太厉害了
+31
科创币
玄明
2012/09/04
我是来凑整的
21
科学人作者
14年4个月前IP:未同步
444025
1楼
引用
评论
14年4个月前IP:未同步
444040
2楼
好•••
这种音质如何?
底燥呢?
建议试试看搞个sd卡播放器
引用
评论
14年4个月前IP:未同步
444045
3楼
建议芯片用ic座这种飞行线万一短路烧芯片换下来就麻烦了
引用
评论
科学人作者
14年4个月前IP:未同步
444046
4楼
回 3楼(山寨雷神公司) 的帖子
嗯。不用IC座也有优点呢,比如增加EMC性能、减少接触电阻。
引用
评论
14年4个月前IP:未同步
444047
5楼
回 4楼(科学人) 的帖子
貌似好像这种低频小功率电路影响不大啊
引用
评论
科学人作者
14年4个月前IP:未同步
444049
6楼
回 2楼(霹雳游侠) 的帖子
用耳机听还是有一点粗糙的感觉,主要是采样率低的缘故。
感觉底噪几乎为零~~~
这个板子作为实验性电路有点对不起它了,应该会找时间改成SD卡的便携式播放器[s:274]
引用
评论
科学人作者
14年4个月前IP:未同步
444051
7楼
回 5楼(山寨雷神公司) 的帖子
其实主要的原因是——家里没有了...
引用
评论
14年4个月前IP:未同步
444072
8楼
回 7楼(科学人) 的帖子
期待USB版本的HIFI版~~

DJ歪是否考虑拿出来晒晒DAC了~~
引用
评论
科学人作者
14年4个月前IP:未同步
444078
9楼
回 8楼(任某人) 的帖子
USB声卡那得追求高音质啊,这可就是音响发烧友玩的了~

其实这个倒是最简单的,随便一个USB音频DAC芯片都可以搞定
引用
评论
14年4个月前IP:未同步
444107
10楼
运放居然用LM386  没有一点HIFI精神[s:274]
+1
科创币
金坷居士
2012/09/04
至少也要分立单端甲类吧 呵呵呵
引用
评论
14年4个月前IP:未同步
444121
11楼
回 9楼(科学人) 的帖子
usb声卡不是只要十几块钱么。。。
引用
评论
14年4个月前IP:未同步
444123
12楼
opa241很冷门的说,轨对轨适合低失真放大,这电路想让音质好,就要用16位DAC或者PWM,44.1k采样。如果要做便携式播放器,还有很多东西要加,要多努力几倍。
引用
评论
14年4个月前IP:未同步
444128
13楼
回 1楼(科学人) 的帖子
满天星是什么
引用
评论
14年4个月前IP:未同步
444129
14楼
可以吃么?
引用
评论
14年4个月前IP:未同步
444131
15楼
回 9楼(科学人) 的帖子
I just came up with a hint./ Why don't you try to use two syconized sereal ports to take turns while transmitting data.  That should release the presure on each one of it and push the MCU to the extream at the same time.

Sorry there is no inpit method on the computer
+1
科创币
金坷居士
2012/09/04
不会安啊 我学校的电脑上各种语言输入法横飞
引用
评论
科学人作者
14年4个月前IP:未同步
444137
16楼
回 15楼(任某人) 的帖子
可以。。。需要编写对应的上位机程序。
引用
评论
14年4个月前IP:未同步
448627
17楼
用1bit DAC更简单
或者干脆PWM闭环推大功率管做D类功放

1bit verilog 例子
已经modelsim过关


module dac(clk,nrst,data,dout);

`define wl 17

input clk,nrst;
input [`wl-2:0]data;
output dout;

reg [`wl-1:0]acc;

always @ (nrst or posedge clk)
begin
    if(!nrst)
    begin
        acc <= `wl'b0;
    end
    else
    begin
        acc <= acc[`wl-2:0] + data;
    end
end

assign dout = acc[`wl-1];

endmodule
引用
评论
14年4个月前IP:未同步
448654
18楼
回 11楼(jxs) 的帖子
我用的usb声卡500元多还是套件 [s:275]
不要思维定势啊[s:275]
引用
评论
14年4个月前IP:未同步
448702
19楼
楼主可以写一个程序,实时产生音色,按下一个按钮就开始产生三角波,随着时间推移振幅渐渐降低……就成了电子琴。
引用
评论
14年4个月前IP:未同步
448703
20楼
回 8楼(任某人) 的帖子
RYRY哈哈哈哈

话说发烧DAC好还是光驱改的CD转盘好呢
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的