第1步:要求
Arduino-我使用Mega,但是沒有理由不能使Uno工作。
SdCard讀卡器-該程序配置為:MicroSD Breakout Board受Logic Conversion V2規(guī)范
http://www.hobbytronics.co.uk/microsd-card-regula 。..。
。
請參閱此說明以進(jìn)行SdCard設(shè)置詳細(xì)信息:https://www.instructables.com/id/Arduino-Mega-Audio.。.
。
DAC0832 LCN-出色的8位數(shù)模轉(zhuǎn)換器-A幾磅。
LM386 N-1運(yùn)算放大器-像芯片一樣便宜
20路芯片插座
8路芯片插座
9伏電源-電池即可。/p》
LM336 2.5 V參考電壓
10uF電容器* 3(任何9V以上的電壓)
10歐姆電阻器
50nF電容器-(或在接近47nF,56nf,68nf的地方工作)
220uF電容器
64歐姆揚(yáng)聲器
10K線性電位器
電纜鏈接Arduino和電路之間的8條數(shù)據(jù)線-
在Uno上8條連接成一直線,在Mega上成對。
在我使用的Mega上帶10路IDC接頭的10路帶狀電纜。 (備用2條線)
用于0V,9V和DAC輸出的插座連接器
銅排板,焊錫,電線,刀具等
步驟2:規(guī)格
串行設(shè)置為115200波特。
使用Mega的Hobbytronics MicroSD Breakout Board支持到位。芯片選擇和其他端口將在Mega和Uno之間改變。
Wav文件必須存在于名為adlog的目錄中,請隨意命名,并重新排列必要的編碼。
wav文件必須為8位單聲道。我已經(jīng)測試了高達(dá)44KHz。
“串行”監(jiān)視器在adlog文件夾中顯示wav文件。文件名是從監(jiān)視器輸出行發(fā)送的。
文件大小僅受SdCard大小的限制。
步驟3:入門
連接SD卡讀卡器。這些是Mega的連接。
0,5V
CLK到引腳52
D0到引腳50
D1到引腳51
CS到第53針
(有關(guān)Uno端口連接的信息,請參見供應(yīng)商的網(wǎng)站)
您需要在此階段測試卡是否正常工作-使用供應(yīng)商提供的腳本。
。
我們需要做一個小電路。
我們要從Arduino發(fā)送音頻字節(jié)流。
這些數(shù)字在0到255之間。它們代表電壓。
沉默范圍是127-128。
255是揚(yáng)聲器的一種錐形揚(yáng)聲器。
0是揚(yáng)聲器的一種錐形揚(yáng)聲器。
因此,音頻被記錄為已保存的數(shù)字,從而產(chǎn)生變化的電壓
。
我們可以使用“端口”同時在Arduino的8行中發(fā)送數(shù)字。
如果我們將8條線饋入數(shù)模轉(zhuǎn)換器,它會按照錫的指示進(jìn)行操作,并產(chǎn)生與數(shù)字量成比例的模擬電壓。
然后我們要做的是包裝
第4步:小電路
DAC0832 LCN
這是一款出色的廉價8位數(shù)模轉(zhuǎn)換器。 (DAC)
它可以通過一系列數(shù)據(jù)保持,數(shù)據(jù)采樣線進(jìn)行完全控制。
或者可以將其設(shè)置為在“流經(jīng)操作”中自動完成所有操作。
引用該手冊:
僅將CS,WR1,WR2和XFER接地,并將ILE接地即可,這兩個內(nèi)部寄存器都可以直接跟隨所應(yīng)用的數(shù)字輸入(直通)影響DAC模擬輸出。
好,這是與芯片組的四個連接低端,一個設(shè)置為9V的連接-很容易。
我們不希望有任何負(fù)電壓,因此手冊說我們應(yīng)該使用“電壓切換模式”,并提供圖表。
我們要做的就是替換一個小型音頻放大器,而不是他們建議的那種。
LM386-N音頻放大器
放大器的手冊提供了最小的零件圖-增益為20(對我們來說是太多了,但具有音量控制)。
我們需要做的是在DAC和放大器之間添加一個電容器,以便僅放大交流信號。
我們還必須添加一個電容應(yīng)靠近我們每個芯片的電源引腳,否則我們將從9V電源中獲得嗡嗡聲。
步驟5:取出烙鐵
由于電路很簡單,所以我不打算一擊即發(fā)。
以下是一些提示:
準(zhǔn)備一塊至少28 x 28孔的銅帶板。 (是的,我知道腦外科醫(yī)師可以使它變?。?/p>
如果您打算用螺釘安裝它,請在開始時允許他們使用!
將芯片安裝在插槽上。僅在檢查完所有內(nèi)容后才插入芯片。
將輸入線遠(yuǎn)離輸出。
注意電容器的正確極性。
有關(guān)LM336參考電壓的基本視圖,請參見該圖。不使用調(diào)節(jié)腳,可以將其切開。
請注意直接連接到DAC的引腳8,這對于測試非常有用。
我使用帶狀電纜和10方向IDC連接器連接到Audino。
在Uno上,連接成一直線-您可能會發(fā)現(xiàn),將8個輸入連接成一條直線可以讓您使用購買的現(xiàn)成的8路連接器鏈接到Arduino,
完成后-檢查焊接情況并檢查銅軌之間的間隙。
。
我找到了一個36 tpi的小型鋼鋸條對于清除碎片非常有用。我卸下刀片的定位銷并將刀片的頂端滑入軌道-顯然刀片不在框架中。
步驟6:測試DAC
斷開電路與Arduino之間的連接。
將電路的音量控制設(shè)置為中途。
打開9V直流電源
檢查電路是否正常-我對您的電路不承擔(dān)任何責(zé)任!
。
關(guān)閉電源。
將電路連接到Arduino。
在Mega上使用22-29引腳。 (PORTA)不要弄錯上面的兩個5V引腳!
在Uno上使用0-7引腳。這是PORTD
將您的電源的0V連接到Arduino上的0V。
加電。
打開此測試程序DAC_TEST
對于UNO,將對PORTA的所有引用替換為PORTD
用DDRD替換DDRA-該指令將所有8行設(shè)置為一次性輸出。這是數(shù)據(jù)方向寄存器。
將串行監(jiān)視器設(shè)置為115200。
在DAC out和OV之間連接電壓表
程序?qū)⒃O(shè)置輸出到255-所有線路上-最大電壓。
輸出128-最大電壓的一半。
輸出0-零電壓(或可能接近零)。
然后它將按位步進(jìn):1、2、4、8、16、32、64、128
電壓應(yīng)穩(wěn)定增加。
如果電壓回落而數(shù)量增加您可能將兩根互連線顛倒了。
。
您還應(yīng)該聽到揚(yáng)聲器隨著電壓的變化而悄悄地發(fā)出咔嗒聲
步驟7 :讀取Wav標(biāo)頭
Wav文件以指定的頻率和數(shù)據(jù)大小保存。
此信息包含在以下位置的44字節(jié)標(biāo)頭中一個wav文件的開頭。
盡管某些軟件擴(kuò)展了標(biāo)頭(在字節(jié)35之后),但使數(shù)據(jù)大小的位置更難定位。
要讀取標(biāo)頭,我們創(chuàng)建一個buff er并復(fù)制文件的開頭。
頻率從文件的24個字節(jié)開始以4個字節(jié)存儲。
//讀取wav文件頭中指定的頻率
字節(jié)頭文件[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);
。
查找數(shù)據(jù)大小信息的最佳方法是在標(biāo)題中搜索單詞“ data”。
然后提取緊隨其后的4個字節(jié),這些字節(jié)構(gòu)成了長值
無符號長檢索;
int mypos = 40 ;
用于(int i = 36; i 《60; i ++){
如果(headbuf [i] = =‘d’){
if(headbuf [i + 1] ==‘a(chǎn)’){
如果(headbuf [i + 2] ==‘t’){
if(headbuf [i + 3] ==‘a(chǎn)’){
//終于有了
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];
。
確定數(shù)據(jù)長度和頻率!
音頻數(shù)據(jù)緊跟著構(gòu)成數(shù)據(jù)長度值的4個字節(jié)。
步驟8:中斷,中斷。..。
頻率信息,以在所需頻率處或附近創(chuàng)建軟件中斷。
雖然不一定總是精確地設(shè)置中斷,但已足夠。從文件讀取的頻率將傳遞給setintrupt子例程。
void setintrupt(float freq){
float bitval = 8;//8表示8位定時器0和2,1024表示定時器1字節(jié)
setocroa =(16000000/(freq * bitval))-0.5;
//setocroa值需要減去-1。但是,將0.5個回合加到最接近的0.5
//計時器的分辨率有限
//由位值的大小確定
cli();//禁用中斷
//設(shè)置 timer2 中斷
TCCR2A = 0;//將整個TCCR2A寄存器設(shè)置為0
TCCR2B = 0;//與TCCR2B相同
TCNT2 = 0;//將計數(shù)器值初始化為0
//設(shè)置比較匹配寄存器的頻率(hz)增量
OCR2A = setocroa ;//=(16 * 10 ^ 6)/(頻率* 8)-1(必須為《256)
//開啟CTC模式
TCCR2A | =(1 《
TCCR2B | =(1 《
//TIMSK2 | =(1 《
sbi(TIMSK2,OCIE2A);//在定時器2上啟用中斷
sei();//啟用中斷
。
關(guān)注讀者的讀者會發(fā)現(xiàn) sbi(TIMSK2,OCIE2A)
我已設(shè)置幾個用于設(shè)置和清除寄存器位的功能(獲取互聯(lián)網(wǎng)):
//定義用于清除寄存器位的方法
#ifndef cbi
#define cbi(sfr,bit)(_SFR_BYTE(sfr)&=?_BV(bit))
#endif
//定義用于設(shè)置寄存器位
#ifndef sbi
#define sbi(sfr,bit)( _SFR_BYTE(sfr)| = _BV(位))
#endif
這些函數(shù)可輕松調(diào)用以設(shè)置或清除中斷
。
所以中斷正在運(yùn)行,我們該怎么辦?
步驟9:中斷和雙緩沖
在22 Khz時,每0.045 ms輸出一個字節(jié)的音頻數(shù)據(jù)
在2.08中讀取512字節(jié)(緩沖區(qū)大小) ms。
因此無法在一秒內(nèi)從SDCard讀取緩沖區(qū)
然而,在23.22ms內(nèi)將512字節(jié)寫入端口。
所以我們要做的就是設(shè)置每次緩沖區(qū)清空時讀取一個新文件。需要一個新的數(shù)據(jù)塊之前獲取數(shù)據(jù)的時間。..假設(shè)我們使用兩個緩沖區(qū),在填充另一個緩沖區(qū)時將其清空。
這是雙緩沖。
讀取的文件
。
我已經(jīng)設(shè)置了兩個512字節(jié)的緩沖區(qū),分別稱為bufa和bufb。
標(biāo)志 aready 是true,我們從porta讀取,否則從portb讀取
當(dāng)緩沖區(qū)位置(bufcount)達(dá)到緩沖區(qū)大?。˙UF_SIZE 512)時,我們設(shè)置一個名為的標(biāo)志
void循環(huán)例程會尋找此標(biāo)志并開始讀取塊:
if(readit){
if(! Aready){
//啟動SD卡讀取到bufa
tempfile.read(bufa,BUF_SIZE);
}否則{
//啟動讀取到bufb的SDCard塊
tempfile.read(bufb,BUF_SIZE);
}
readit = false;
}
完成后,例程標(biāo)志readit = false。
在中斷例程中,我們必須檢查void循環(huán)通過檢查readit == false是否結(jié)束。
在這種情況下,我們發(fā)出信號,要求再次讀取并切換Aready標(biāo)志以切換緩沖區(qū)。
如果SD卡仍在讀取我們必須回溯一個讀數(shù)(counter--; bufcount--;)并退出中斷以稍后再試。 (單擊音頻輸出信號表示已發(fā)生這種情況。)
讀取所有數(shù)據(jù)后,中斷被取消,端口重置為中間電壓值128,音頻文件關(guān)閉。
在首次運(yùn)行dac2.ino腳本之前,請將音量設(shè)置為50%。這會太大聲,但是比100%更好!
如果您的音量控制反向工作,則將10K電位器兩端的引線互換。
讓我知道如何聽起來。
-
dac
+關(guān)注
關(guān)注
43文章
2314瀏覽量
191663 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187981
發(fā)布評論請先 登錄
相關(guān)推薦
TLV320AIC3100播放音頻的時候,拔插耳機(jī)然后在插入就無法播放了,為什么?
8127+tlv320aic3104設(shè)置立體聲采集到音頻播放是快進(jìn)音頻的聲音,怎么解決?
AM3354處理器wince系統(tǒng)調(diào)playsound播放聲音,有電流雜音怎么解決?
TLV320AIC_54_RHB_EVM playback沒有聲音是怎么回事?
TLV320AIC3106335板子wince系統(tǒng)下調(diào)用playsound接口播放wav格式聲音總是有雜音,怎么解決?
PCM1770播放音頻的時候有白噪音怎么解決?
tas5805m連續(xù)通過tinyplay播放音頻有概率出現(xiàn)播放不了的情況,為什么?
TLV320DAC3100音頻播放偶爾出一聲比正常聲音響的聲音是怎么回事?
如何使用音頻接口播放音頻文件
![如何使用<b class='flag-5'>音頻</b>接口<b class='flag-5'>播放音頻文件</b>](https://file1.elecfans.com/web2/M00/01/B5/wKgaomax2v2AEyloAACB4D5zc8Q785.jpg)
評論