0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino和DAC播放音频声音文件

454398 来源:wv 2019-10-24 08:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

第1步:要求

Arduino-我使用Mega,但是没有理由不能使Uno工作。

SdCard读卡器-该程序配置为:MicroSD Breakout Board受Logic Conversion V2规范

http://www.hobbytronics.co.uk/microsd-card-regula 。..。

请参阅此说明以进行SdCard设置详细信息:https://www.instructables.com/id/Arduino-Mega-Audio.。.

DAC0832 LCN-出色的8位数模转换器-A几磅。

LM386 N-1运算放大器-像芯片一样便宜

20路芯片插座

8路芯片插座

9伏电源-电池即可。/p》

LM336 2.5 V参考电压

10uF电容器* 3(任何9V以上的电压)

10欧姆电阻器

50nF电容器-(或在接近47nF,56nf,68nf的地方工作)

220uF电容器

64欧姆扬声器

10K线性电位器

电缆链接Arduino和电路之间的8条数据线-

在Uno上8条连接成一直线,在Mega上成对。

在我使用的Mega上带10路IDC接头的10路带状电缆。 (备用2条线)

用于0V,9V和DAC输出的插座连接器

铜排板,焊锡,电线,刀具等

步骤2:规格

串行设置为115200波特。

使用Mega的Hobbytronics MicroSD Breakout Board支持到位。芯片选择和其他端口将在Mega和Uno之间改变。

Wav文件必须存在于名为adlog的目录中,请随意命名,并重新排列必要的编码。

wav文件必须为8位单声道。我已经测试了高达44KHz。

“串行”监视器在adlog文件夹中显示wav文件。文件名是从监视器输出行发送的。

文件大小仅受SdCard大小的限制。

步骤3:入门

连接SD卡读卡器。这些是Mega的连接。

0,5V

CLK到引脚52

D0到引脚50

D1到引脚51

CS到第53针

(有关Uno端口连接的信息,请参见供应商的网站)

您需要在此阶段测试卡是否正常工作-使用供应商提供的脚本。

我们需要做一个小电路。

我们要从Arduino发送音频字节流。

这些数字在0到255之间。它们代表电压。

沉默范围是127-128。

255是扬声器的一种锥形扬声器。

0是扬声器的一种锥形扬声器。

因此,音频被记录为已保存的数字,从而产生变化的电压

我们可以使用“端口”同时在Arduino的8行中发送数字。

如果我们将8条线馈入数模转换器,它会按照锡的指示进行操作,并产生与数字量成比例的模拟电压。

然后我们要做的是包装

第4步:小电路

DAC0832 LCN

这是一款出色的廉价8位数模转换器。 (DAC)

它可以通过一系列数据保持,数据采样线进行完全控制。

或者可以将其设置为在“流经操作”中自动完成所有操作。

引用该手册:

仅将CS,WR1,WR2和XFER接地,并将ILE接地即可,这两个内部寄存器都可以直接跟随所应用的数字输入(直通)影响DAC模拟输出。

好,这是与芯片组的四个连接低端,一个设置为9V的连接-很容易。

我们不希望有任何负电压,因此手册说我们应该使用“电压切换模式”,并提供图表。

我们要做的就是替换一个小型音频放大器,而不是他们建议的那种。

LM386-N音频放大器

放大器的手册提供了最小的零件图-增益为20(对我们来说是太多了,但具有音量控制)。

我们需要做的是在DAC和放大器之间添加一个电容器,以便仅放大交流信号

我们还必须添加一个电容应靠近我们每个芯片的电源引脚,否则我们将从9V电源中获得嗡嗡声。

步骤5:取出烙铁

由于电路很简单,所以我不打算一击即发。

以下是一些提示:

准备一块至少28 x 28孔的铜带板。 (是的,我知道脑外科医师可以使它变小)

如果您打算用螺钉安装它,请在开始时允许他们使用!

将芯片安装在插槽上。仅在检查完所有内容后才插入芯片。

将输入线远离输出。

注意电容器的正确极性。

有关LM336参考电压的基本视图,请参见该图。不使用调节脚,可以将其切开。

请注意直接连接到DAC的引脚8,这对于测试非常有用。

我使用带状电缆和10方向IDC连接器连接到Audino。

在Uno上,连接成一直线-您可能会发现,将8个输入连接成一条直线可以让您使用购买的现成的8路连接器链接到Arduino,

完成后-检查焊接情况并检查铜轨之间的间隙。

我找到了一个36 tpi的小型钢锯条对于清除碎片非常有用。我卸下刀片的定位销并将刀片的顶端滑入轨道-显然刀片不在框架中。

步骤6:测试DAC

断开电路与Arduino之间的连接。

将电路的音量控制设置为中途。

打开9V直流电源

检查电路是否正常-我对您的电路不承担任何责任!

关闭电源。

将电路连接到Arduino。

在Mega上使用22-29引脚。 (PORTA)不要弄错上面的两个5V引脚!

在Uno上使用0-7引脚。这是PORTD

将您的电源的0V连接到Arduino上的0V。

加电。

打开此测试程序DAC_TEST

对于UNO,将对PORTA的所有引用替换为PORTD

DDRD替换DDRA-该指令将所有8行设置为一次性输出。这是数据方向寄存器

将串行监视器设置为115200。

在DAC out和OV之间连接电压表

程序将设置输出到255-所有线路上-最大电压。

输出128-最大电压的一半。

输出0-零电压(或可能接近零)。

然后它将按位步进:1、2、4、8、16、32、64、128

电压应稳定增加。

如果电压回落而数量增加您可能将两根互连线颠倒了。

您还应该听到扬声器随着电压的变化而悄悄地发出咔嗒声

步骤7 :读取Wav标头

Wav文件以指定的频率和数据大小保存。

此信息包含在以下位置的44字节标头中一个wav文件的开头。

尽管某些软件扩展了标头(在字节35之后),但使数据大小的位置更难定位。

要读取标头,我们创建一个buff er并复制文件的开头。

频率从文件的24个字节开始以4个字节存储。

//读取wav文件头中指定的频率

字节头文件[60]

tempfile.seek(0);

tempfile.read(headbuf,60);

RETVAL = headbuf [27];

retval =(retval 《《8)| headbuf [26];

retval =(retval 《《8)| headbuf [25];

retval =(retval 《《8)| headbuf [24];

Serial.print(F(“ File Frequency”));

Serial.print( retval);

查找数据大小信息的最佳方法是在标题中搜索单词“ data”。

然后提取紧随其后的4个字节,这些字节构成了长值

无符号长检索;

int mypos = 40 ;

用于(int i = 36; i 《60; i ++){

如果(headbuf [i] = =‘d’){

if(headbuf [i + 1] ==‘a’){

如果(headbuf [i + 2] ==‘t’){

if(headbuf [i + 3] ==‘a’){

//终于有了

mypos = i + 4;

i = 60;

}

}

} 》

}

}

tempfile.seek(mypos);

RETVAL = headbuf [mypos + 3];

RETVAL =(RETVAL 《《8) | headbuf [mypos + 2];

retval =(retval 《《8)| headbuf [mypos + 1];

retval =(retval 《《8)| headbuf [mypos];

确定数据长度和频率!

音频数据紧跟着构成数据长度值的4个字节。

步骤8:中断,中断。..。

频率信息,以在所需频率处或附近创建软件中断。

虽然不一定总是精确地设置中断,但已足够。从文件读取的频率将传递给setintrupt子例程。

void setintrupt(float freq){

float bitval = 8;//8表示8位定时器0和2,1024表示定时器1字节

setocroa =(16000000/(freq * bitval))-0.5;

//setocroa值需要减去-1。但是,将0.5个回合加到最接近的0.5

//计时器的分辨率有限

//由位值的大小确定

cli();//禁用中断

//设置 timer2 中断

TCCR2A = 0;//将整个TCCR2A寄存器设置为0

TCCR2B = 0;//与TCCR2B相同

TCNT2 = 0;//将计数器值初始化为0

//设置比较匹配寄存器的频率(hz)增量

OCR2A = setocroa ;//=(16 * 10 ^ 6)/(频率* 8)-1(必须为《256)

//开启CTC模式

TCCR2A | =(1 《

TCCR2B | =(1 《

//TIMSK2 | =(1 《

sbi(TIMSK2,OCIE2A);//在定时器2上启用中断

sei();//启用中断

关注读者的读者会发现 sbi(TIMSK2,OCIE2A)

我已设置几个用于设置和清除寄存器位的功能(获取互联网):

//定义用于清除寄存器位的方法

#ifndef cbi

#define cbi(sfr,bit)(_SFR_BYTE(sfr)&=〜_BV(bit))

#endif

//定义用于设置寄存器位

#ifndef sbi

#define sbi(sfr,bit)( _SFR_BYTE(sfr)| = _BV(位))

#endif

这些函数可轻松调用以设置或清除中断

所以中断正在运行,我们该怎么办?

步骤9:中断和双缓冲

在22 Khz时,每0.045 ms输出一个字节的音频数据

在2.08中读取512字节(缓冲区大小) ms。

因此无法在一秒内从SDCard读取缓冲区

然而,在23.22ms内将512字节写入端口。

所以我们要做的就是设置每次缓冲区清空时读取一个新文件。需要一个新的数据块之前获取数据的时间。..假设我们使用两个缓冲区,在填充另一个缓冲区时将其清空。

这是双缓冲。

读取的文件

我已经设置了两个512字节的缓冲区,分别称为bufa和bufb。

标志 aready 是true,我们从porta读取,否则从portb读取

当缓冲区位置(bufcount)达到缓冲区大小(BUF_SIZE 512)时,我们设置一个名为的标志

void循环例程会寻找此标志并开始读取块:

if(readit){

if(! Aready){

//启动SD卡读取到bufa

tempfile.read(bufa,BUF_SIZE);

}否则{

//启动读取到bufb的SDCard块

tempfile.read(bufb,BUF_SIZE);

}

readit = false;

}

完成后,例程标志readit = false。

在中断例程中,我们必须检查void循环通过检查readit == false是否结束。

在这种情况下,我们发出信号,要求再次读取并切换Aready标志以切换缓冲区。

如果SD卡仍在读取我们必须回溯一个读数(counter--; bufcount--;)并退出中断以稍后再试。 (单击音频输出信号表示已发生这种情况。)

读取所有数据后,中断被取消,端口重置为中间电压值128,音频文件关闭。

在首次运行dac2.ino脚本之前,请将音量设置为50%。这会太大声,但是比100%更好!

如果您的音量控制反向工作,则将10K电位器两端的引线互换。

让我知道如何听起来。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dac
    dac
    +关注

    关注

    44

    文章

    2701

    浏览量

    196428
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    196015
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    速通音频处理:掌握TTS播放文件播放与录音核心,实现完整功能

    播放TTS、播放音频文件及录音是构建完整音频处理功能的三大核心模块。若想快速掌握并实现完整音频处理能力,无需深挖底层细节,只需聚焦“资源加载、播放
    的头像 发表于 11-21 19:27 103次阅读
    速通<b class='flag-5'>音频</b>处理:掌握TTS<b class='flag-5'>播放</b>、<b class='flag-5'>文件</b><b class='flag-5'>播放</b>与录音核心,实现完整功能

    新手速成:掌握TTS/文件播放/录音核心,构建完整音频处理功能

    刚接触音频开发时,TTS播放文件播放与录音功能看似复杂,实则是实现完整音频处理的基础。本文从新手视角出发,拆解这三大功能的核心逻辑——资源
    的头像 发表于 11-21 19:26 61次阅读
    新手速成:掌握TTS/<b class='flag-5'>文件</b><b class='flag-5'>播放</b>/录音核心,构建完整<b class='flag-5'>音频</b>处理功能

    音频中ADC/DAC/和采样率关系

            要理解音频领域的 ADC、DAC 和 采样率,需先明确一个核心前提:现实世界中的声音(如人声、乐器声)是模拟信号(连续变化的电信号),而手机、电脑、播放器等数字设备只能
    的头像 发表于 11-17 17:50 1312次阅读

    如何使用SDK进行自定义音频播放功能

    在上一篇文章安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】自定义音频替换失败过程中,简要概述了res_build_tool.py 文件, 其主要的作用就是将音频文件进行转换,从而使编译固件的时候能够将
    的头像 发表于 09-25 15:52 3023次阅读
    如何使用SDK进行自定义<b class='flag-5'>音频</b><b class='flag-5'>播放</b>功能

    如何使用 M487 微控制器 (MCU) 通过 DAC 在 SD 卡上播放 WAV 文件声音

    使用 M487 微控制器 (MCU) 通过 DAC 在 SD 卡上播放 WAV 文件声音
    发表于 08-20 06:05

    多路混音声音播放芯片型号推荐

    以下是唯创知音旗下主流的多路声音播放芯片深度解析,结合精准参数、丰富场景及技术特性,满足智能设备多样化音频需求: 一、WTV380/890 系列:高集成多模态交互芯片 核心参数 通道能力:支持8 路
    的头像 发表于 08-15 16:51 621次阅读

    【HZ-RK3568开发板免费体验】2、利用开发板上音频外设播放音频

    内核的音频的子系统,在用户空间试用alsa-utils工具可以查看音频系统的组成、设置音频参数以及播放音频文件。同时,也可以通过编程调用alsa的API实现自定义应用。 1、ALSA编
    发表于 07-22 10:35

    蜻蜓FM开源“SmartXPlayer”音频播放组件,打造鸿蒙多端音频播放新引擎

    近日,由蜻蜓FM研发的音频播放组件“SmartXPlayer”正式开源并上线 OpenHarmony 三方库中心仓。作为一款专为鸿蒙多端场景打造的音频播放引擎,SmartXPlayer
    的头像 发表于 07-21 16:31 450次阅读
    蜻蜓FM开源“SmartXPlayer”<b class='flag-5'>音频</b><b class='flag-5'>播放</b>组件,打造鸿蒙多端<b class='flag-5'>音频</b><b class='flag-5'>播放</b>新引擎

    Texas Instruments TAD5142立体声音频DAC数据手册

    Texas Instruments TAD5142立体声音频数模转换器(DAC)是一款2V~RMS~ 110dB立体声音频DAC,可配置为线路输出或耳机负载,并支持单端和差分输出选项。
    的头像 发表于 07-17 09:43 487次阅读
    Texas Instruments TAD5142立体<b class='flag-5'>声音频</b><b class='flag-5'>DAC</b>数据手册

    【正点原子STM32MP257开发板试用】5.播放音

    前言 感谢正点原子和电子发烧友论坛提供的这次机会让我有机会体验这款正点原子STM32MP257开发板,希望可以借这个机会好好学习一下。 环境搭建 播放音乐有很多Python库比如pygame
    发表于 06-28 14:27

    fx3枚举成usb扬声器,电脑无法播放音频是哪里出了问题?

    参考fx3 sdk 1.3.5例程uac_examples,将fx3修改为usb 扬声器,电脑能识别到设备,但电脑无法正常播放音频,fx3也收不到音频数据。请问是哪里出了问题?有没有相关的例程可以参考?#EZ-USB FX3
    发表于 05-23 08:21

    PCM2912APJTR设计的USB声卡播放声音有哒哒的声音的原因有哪些

    最近学习PCB设计设计了一个USB声卡,电路图参考了官方demo模块的原理图,但是设计出来的板子发现播放音乐会有哒哒的声音。本人由于是初学者,所以有点不懂是PCB不对的问题还是原理图设计的问题了。 希望有人能够给点修改建议。 下面是原理图。 布线图如下:
    发表于 03-21 11:54

    TAS5729MD播放没有声音

    MCLK 单独接 12.288MHz 晶振 256 倍 fs,播放 48khz 音频文件,LRCK 测量 48khz,SCK 3.072Mhz 64 倍 fs,error 寄存器始终报错 0xd0
    发表于 03-04 19:57

    用5509A写一个用MCBSP和AIC23采集和播放音频的程序,在运行的时候发出了很大的杂音,为什么?

    采集和播放音频的程序,LINEIN,但是在运行的时候发出了很大的杂音,但是从LINEIN输入的声音是能分辨出来的,没有发生什么改变,我才开始学DSP,所以希望有高手能帮我解决这个
    发表于 02-05 07:12

    瑞芯微主板/开发板Linux系统播放音频方法,触觉智能RK3562开发板演示

    本文介绍瑞芯微方案主板/开发板Linux系统播放音频的方法,触觉智能RK3562开发板演示,通用RK3566、RK3568、RK3588等
    的头像 发表于 12-13 11:40 1414次阅读
    瑞芯微主板/开发板Linux系统<b class='flag-5'>播放音频</b>方法,触觉智能RK3562开发板演示