基于DDS芯片AD9833的音源發(fā)生器設計
3 軟件實(shí)現
本設計中,主頻時(shí)鐘采用4.194 304 MHz。輸出頻率計算如下:
式中,f0為輸出頻率,fMCLK為主頻(4.194 304 MHz),FREQREG為頻率寄存器設置的頻率字。頻率分辨率為1/64=0.015 625 Hz。
根據上述公式,計算出各音階對應的頻率字參數如表1所示。
控制程序在Keil uv2環(huán)境下開(kāi)發(fā),程序采用匯編語(yǔ)言和C語(yǔ)言混合編程形式實(shí)現。實(shí)現時(shí)序控制部分采用匯編語(yǔ)言,主體部分則采用C語(yǔ)言進(jìn)行編程。程序主體部分調用時(shí)序控制部分時(shí),通過(guò)全局字節變量light_o和light_o1傳遞數據。
時(shí)序控制部分程序通過(guò)模擬SPI接口時(shí)序,完成對DDS芯片內部寄存器的設置,具體程序如下(定義部分略):
to_9833:
setb SCK
clr CS
mov a,light_o
mov r1,#08h
call out_SPI
mov a,light_o1
mov r1,#08h
call out_SPI
setb CS
clr SCK
ret
out_SPI:
RLC A
mov SO,c
clr SCK
setb SCK
djnz r1,out_SPI
ret
程序主體部分中,根據表1將音階數據定義成一個(gè)一維數組:
code unsigned int music_table[ ]={0x5268,0x5c80,
0x67d3,0x6e00,0x7b78,0x8a97,0x92d5,0xa4d5,0xb8ff,0xcfa7,0xdc00,0xf6f0,};
主程序的編程框圖如圖5所示。對AD9833芯片通過(guò)寫(xiě)入控制字的方式進(jìn)行初始化。程序在主循環(huán)中運行。主循環(huán)對有效按鍵進(jìn)行處理,對于有效琴鍵,調用音階函數即可。音階函數如下:
void play_music(unsigned char nn)
{
light_o = 0x20;
light_o1 = 0x00; //設控制字
to_9833();
v_3.cm_int =music_table[nn]; //查音階表
light_o = 0x40 | (v_3.cm.cm_0 0x3f);
light_o1 = v_3.cm.cm_1;
to_9833(); //設頻率字
light_o = 0x40;
light_o1 = v_3.cm.cm_0 / 0x40;
to_9833();
}
如有音階2的琴鍵被按下有效,C語(yǔ)言對調用函數描述為:
play_music(2);
程序中還包含按鍵處理、顯示、存儲控制等部分,限于篇幅,不再贅述。經(jīng)實(shí)測,本音源發(fā)生器產(chǎn)生的各音階頻率與表1設計值一致,頻率誤差0.02%,波形則是“純凈”的正弦波。通過(guò)功率放大,驅動(dòng)揚聲器發(fā)聲。
通常不同樂(lè )器發(fā)音時(shí),均有不同特征的諧波。常規樂(lè )器難以實(shí)現只有主音、無(wú)諧波成分的音階,而通過(guò)本文DDS芯片設計的音源器,實(shí)現了精準的無(wú)諧波成分的音階,有獨特的聽(tīng)覺(jué)效果??勺鳛榛鶞室綦A,用于各類(lèi)樂(lè )器的校音。
評論