何健諾 謝樹(shù)波 曾敏羽
【摘? 要】 在1958年,我國(guó)就制造出了電子琴,訖今為止它的設(shè)計(jì)方法和發(fā)聲原理各種各樣,主要是利用單片機(jī)、PLC技術(shù)、EDA技術(shù)等發(fā)出聲音和控制音調(diào)?,F(xiàn)代的電子琴通常采用的是PCM技術(shù)進(jìn)行采樣音源,它依舊和以前的電子琴一樣內(nèi)置濾波器和振蕩器,靠同樣的原理來(lái)產(chǎn)生和使用音色。本研究設(shè)計(jì)的電子琴是一種能夠發(fā)出8種音階的小型、簡(jiǎn)易的單片機(jī)電子琴。該系統(tǒng)設(shè)計(jì)是以STM32F103C8T6單片機(jī)為主控芯片,通過(guò)連接硬件電路和編寫(xiě)程序來(lái)實(shí)現(xiàn)。該設(shè)計(jì)的特點(diǎn)是采用單片機(jī)的定時(shí)器相關(guān)寄存器輸出的值控制輸出PWM來(lái)發(fā)出不同音調(diào),實(shí)現(xiàn)升調(diào)降調(diào)、自動(dòng)演奏,還可以演奏簡(jiǎn)單的音樂(lè)。
【關(guān)鍵詞】 電子琴;STM32F103C8T6;定時(shí)器;PWM
一、系統(tǒng)總體設(shè)計(jì)
(一)系統(tǒng)總體框架設(shè)計(jì)
如今電子琴是通常采用PCM或者AWM技術(shù)采樣音源的形式來(lái)完成對(duì)傳統(tǒng)樂(lè)器的音色呈現(xiàn),一般的原理是先對(duì)樂(lè)器的聲音進(jìn)行采樣記錄,然后通過(guò)ADC數(shù)字化存儲(chǔ)在ROM中,再按鍵盤(pán)模仿所記錄的頻率回放聲音,用振蕩電路和濾波器形成各種音色。
事實(shí)上,音樂(lè)有一個(gè)穩(wěn)定的周期信號(hào)。該設(shè)計(jì)采用STM32F130C8T6的定時(shí)器進(jìn)行控制,在IO口輸出PWM信號(hào)產(chǎn)生聲音。利用按鍵控制選擇每次輸出的頻率,發(fā)出不同的音調(diào),這樣就可以制作出簡(jiǎn)單的電子琴。該設(shè)計(jì)的電子琴在演奏方面要求的音色并不是很高,用單片機(jī)自身產(chǎn)生的一般頻率就可以滿(mǎn)足此次設(shè)計(jì)的基本要求。
對(duì)電子琴的電路功能進(jìn)行系統(tǒng)的解析,采取由上到下的設(shè)計(jì)理念,先從設(shè)計(jì)的整個(gè)結(jié)構(gòu)進(jìn)行研討,把整體設(shè)計(jì)的內(nèi)容進(jìn)行步驟詳細(xì)化,最終實(shí)行系統(tǒng)結(jié)構(gòu)的整體設(shè)計(jì)。該設(shè)計(jì)對(duì)電子琴系統(tǒng)的用途和優(yōu)劣并沒(méi)有十分精準(zhǔn)和完整的要求,系統(tǒng)的效果需求有基本的按鍵功能、自行進(jìn)行演奏功能、主動(dòng)升調(diào)降調(diào)功能共3種。
(二)系統(tǒng)總體方案設(shè)計(jì)
1. 此次設(shè)計(jì)的無(wú)線(xiàn)電子琴還有音樂(lè)儲(chǔ)存功能,能夠自動(dòng)彈奏存儲(chǔ)好的歌曲。通過(guò)編程把數(shù)首曲子的頻率編入系統(tǒng)中,按下設(shè)置的演奏按鈕,電子琴便能夠播放歌曲。
2. 設(shè)置相關(guān)按鍵。當(dāng)按鍵按下時(shí),使用存儲(chǔ)好的一組音調(diào),這里存儲(chǔ)了兩組音調(diào),分別是低音和中音,通過(guò)查詢(xún)資料,可以得出都是不同頻率的do、re、mi、fa、so、la、si、do八個(gè)音調(diào)。
3. 設(shè)計(jì)的主要工作原理是利用STM32內(nèi)置的定時(shí)器TIM3產(chǎn)生一個(gè)PWM信號(hào)驅(qū)動(dòng)揚(yáng)聲器產(chǎn)生特定頻率的聲音,通過(guò)改變定時(shí)器TIM3的分頻預(yù)置數(shù)改變PWM信號(hào)的頻率,從而產(chǎn)生不同音調(diào)的聲音,通過(guò)改變占空比,產(chǎn)生不同音量的聲音。
4. 用ST32F103C8T6來(lái)做核心控制,設(shè)計(jì)中運(yùn)用單片機(jī)的定時(shí)寄存器來(lái)產(chǎn)生PWM,然后把音調(diào)分別對(duì)應(yīng)不同的頻率信號(hào),最后用無(wú)線(xiàn)激光進(jìn)行控制,通過(guò)揚(yáng)聲器進(jìn)行輸出。
5. 設(shè)計(jì)中用KEIL5進(jìn)行軟件的設(shè)計(jì)編寫(xiě),然后搭建硬件電路運(yùn)行,采取中斷系統(tǒng)和定時(shí)器對(duì)應(yīng)寄存器的原理掌握電子琴發(fā)聲的頻率,用編程語(yǔ)言實(shí)現(xiàn)樂(lè)曲演奏必須明確樂(lè)曲的音調(diào),通過(guò)它來(lái)演奏、播放音樂(lè)。
二、模塊化分析
(一)揚(yáng)聲器模塊
脈沖寬度調(diào)制(PWM)是英文Pulse Width Modulation的縮寫(xiě),簡(jiǎn)稱(chēng)脈寬調(diào)制,應(yīng)用未處理器的數(shù)字輸出來(lái)模擬電路進(jìn)行控制的一種技術(shù)。PWM的周期就是由定時(shí)器的自動(dòng)重裝值和CNT計(jì)數(shù)頻率決定的,而CNT的計(jì)數(shù)時(shí)鐘是CK_PSC經(jīng)分頻器PSC得到,通過(guò)脈寬調(diào)制解決電子琴的發(fā)聲問(wèn)題。
揚(yáng)聲器引腳是PB1。把PB1作為定時(shí)器通道,定時(shí)器作為單片機(jī)的重點(diǎn)難點(diǎn),定時(shí)器的溢出時(shí)間如下:
Tout=((arr+1)*(psc+1))/Tclk。
式中,Tout是溢出時(shí)間;psc(分頻系數(shù))決定數(shù)數(shù)字的快慢;arr為自動(dòng)重裝值;Tclk為輸入時(shí)鐘頻率,設(shè)置頻率為72/(8+1)=8MHz。
頻率為arr,Tout=arr+1/8000000,而頻率是時(shí)間的倒數(shù),音調(diào)與頻率有關(guān),音調(diào)(頻率)用:Autoreload=(8000000/usFraq)-1方法自動(dòng)重裝值。
因?yàn)槿硕荒苈?tīng)到大于20Hz小于20000Hz頻率的聲音,自動(dòng)重裝值最大為65535,所以對(duì)應(yīng)值為122。為了防止有噪聲輸出,需要一個(gè)判斷頻率的函數(shù)。判斷輸入的頻率小于122Hz大于20000Hz頻率為靜音,使用語(yǔ)句TIM_SetCompare4(TIM3,0)來(lái)停止發(fā)聲。
(二)自動(dòng)演奏模塊
每一段音樂(lè)都是不同頻率的聲音按照一定的時(shí)間節(jié)拍變換發(fā)出。演奏出音樂(lè)需要熟悉音樂(lè)的音調(diào)和節(jié)拍的信息。查閱到各首音樂(lè)的頻率和節(jié)拍。創(chuàng)建兩個(gè)數(shù)組AllBGM1[]和AllBGM2[]分別用來(lái)存放兩首音樂(lè),里面存放的是音樂(lè)的頻率,當(dāng)自動(dòng)演奏的時(shí)候就依次使用數(shù)組里的頻率,但演奏音樂(lè)時(shí),每個(gè)音調(diào)需要節(jié)拍都不同,需要在每一次調(diào)用數(shù)組里面的頻率時(shí)就延時(shí)一段時(shí)間,音符節(jié)奏分為一拍、半拍、1/4拍、1/8拍,制作者設(shè)定一拍音符的時(shí)間為1,半拍為0.5,1/4拍為0.25,1/8拍為0.125……每個(gè)音符以這樣的拍子播放出來(lái),音樂(lè)就完成了。用實(shí)驗(yàn)板的KEY5和KEY6作為AllBGM1和AllBGM2的按鍵,KEY5或KEY6按下后,揚(yáng)聲器就可以開(kāi)始自動(dòng)演奏內(nèi)置音樂(lè)。
(三)激光頭傳感器模塊
設(shè)計(jì)中采用激光頭傳感器模塊KY-008作為無(wú)線(xiàn)電子琴的琴鍵。激光頭傳感器模塊KY-008,中間是正極,S是控制腳,工作電壓為5V,規(guī)格為15*24mm,光源波長(zhǎng)為650nm,重量為2.2g。當(dāng)電路中的激光被物體擋住時(shí),激光頭傳感器模塊就會(huì)輸出不同的電平,比傳統(tǒng)固定直接式按鍵更加靈敏,激光頭傳感器輸出電平信號(hào)接到單片機(jī)IO口,單片機(jī)識(shí)別之后就做出相應(yīng)的反應(yīng)。使用時(shí)更加簡(jiǎn)便,觸摸激光線(xiàn)便能使電子琴發(fā)聲,保證了電子琴演奏的新穎性。
三、硬件設(shè)計(jì)
(一)激光頭傳感器電路設(shè)計(jì)
激光頭傳感器模塊KY-008作為琴鍵是無(wú)線(xiàn)電子琴,通過(guò)設(shè)計(jì)8個(gè)激光光傳感器作為8個(gè)音階,及8個(gè)激光發(fā)射端、8個(gè)激光信號(hào)接收端,電路設(shè)計(jì)如圖1所示。
(二)主控模塊電路設(shè)計(jì)
主控模塊采用STM32單片機(jī),主控單元的IO口接收激光信號(hào),經(jīng)過(guò)程序判斷對(duì)應(yīng)IO口,輸出設(shè)定的PWM頻率信號(hào),不同頻率信號(hào)對(duì)應(yīng)不同的Do-Re-Mi-Fa-Sol-La-Ti-Do音符,每個(gè)音符一個(gè)音節(jié),主控電路設(shè)計(jì)如圖2所示。
(三)輸出驅(qū)動(dòng)模塊電路設(shè)計(jì)
輸出的揚(yáng)聲器使用TDA7279驅(qū)動(dòng),芯片TDA7279性能穩(wěn)定,屬于是立體聲雙橋式放大器,工作電壓范圍寬,驅(qū)動(dòng)電路設(shè)計(jì)如圖3所示。
四、軟件設(shè)計(jì)
(一)低音/高音選擇程序設(shè)計(jì)
單片機(jī)下載完成后,初始化完成等待選擇模式,按下key1,進(jìn)入低音模式,按下key2,進(jìn)入高音模式,可以開(kāi)始彈奏。低音,高音對(duì)應(yīng)的升調(diào)和降調(diào)程序。
u16 CL[8]={262,294,330,349,392,440,494,523};
u16 CM[8]={523,587,659,698,784,880,988,1047};
void play(u32 tone)
{switch(tone_level)
{case1:buzzerSound(CL[tone],1);break;
case2:buzzerSound(CM[tone],1);break;}}
if(KEY11_STA==KEY_DN)
{tone_level=2;}
if(KEY12_STA==KEY_DN)
{tone_level=1;}
創(chuàng)建兩個(gè)數(shù)組CL[]和CM[]分別用來(lái)存放低音和中音,里面存放的是各個(gè)音調(diào)的頻率,使用的時(shí)候就從數(shù)組里提取。用實(shí)驗(yàn)板的KEY1(KEY11_STA)和KEY2(KEY12_STA)作為升調(diào)和降調(diào)的按鍵,在主函數(shù)中設(shè)置按鍵初始化,使用while函數(shù)掃描按鍵狀態(tài),用if函數(shù)判斷按鍵是否按下,KEY1或KEY1按下后,選用低音或高音。這樣就可以實(shí)現(xiàn)電子琴的升調(diào)和降調(diào)功能。
(二)程序流程圖設(shè)計(jì)
通過(guò)判斷無(wú)線(xiàn)激光器的線(xiàn),使用while函數(shù)掃描激光頭傳感器模塊輸出狀態(tài),程序設(shè)計(jì)流程如圖4所示。