• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于MSP430 Launchpad的音樂播放器

      2021-06-22 03:31:56張皎黃欣朱雯麗
      電子元器件與信息技術 2021年3期
      關鍵詞:蜂鳴器音調數組

      張皎,黃欣,朱雯麗

      (西安交通大學電氣工程學院,陜西 西安 710049)

      0 引言

      不同于以往設計例如從TF卡中讀取音頻文件構成音樂播放器。以往方案需要生成AWG,當播放AWG時由于蜂鳴器的發(fā)聲狀態(tài)不穩(wěn)定,會發(fā)生雜音較大、音調不準等等的問題。該方案從波形頻率入手,因而能精準地控制音調和節(jié)拍,播放出來的音樂曲調較為優(yōu)美、精確,并且有一套完整的編曲規(guī)則,簡單方便。

      對于MSP430來講,數模轉化器DAC是一個重要部分,本文利MSP-EXP430G2擴展板上的DAC先構造出基于DDS直接數字頻率合成原理的AWG任意波形發(fā)生器;而后直接將波形輸出給功放TPA301,并驅動蜂鳴器產生聲音。將一定頻率的PWM波輸入DAC,即可控制蜂鳴器產出不同音調的聲音;控制該頻率的PWM波的持續(xù)時間即可控制蜂鳴器產生對應聲音的時間?;谝陨贤瓿梢魳凡シ诺脑O計。

      1 實驗原理簡述

      1.1 蜂鳴器發(fā)聲原理

      蜂鳴器按其結構分主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲[1]。

      蜂鳴器按其是否帶有信號源又分為有源和無源兩種類型。有源蜂鳴器只需要在其供電端加上額定直流電壓,其內部的震蕩器就可以產生固定頻率的信號,驅動蜂鳴器發(fā)出聲音。無源蜂鳴器可以理解成與喇叭一樣,需要在其供電端上加上高低不斷變化的電信號才可以驅動發(fā)出聲音。

      本文采用的是無源蜂鳴器。DAC的輸出由0歐跳線電阻R27選擇,直接輸出給功放TPA301,并驅動蜂鳴器產生聲音。只要將一定頻率的PWM波輸入DAC,即可控制蜂鳴器產出不同音調的聲音;而控制該頻率的PWM波持續(xù)時間即可控制蜂鳴器產生聲音的時間。據此原理完成音樂播放的設計。具體算法如下:

      1.1.1 聲音頻率的控制

      由原理可知聲音的頻率由PWM波的頻率(周期)控制。其設計思路為:引入數組,記錄PWM波的周期。當PWM電平翻轉時,驅動蜂鳴器振動發(fā)生,并延時相應的數值,即可實現(xiàn)不同音階的發(fā)生。這里,相應的數值即為數組中記錄的PWM波的周期。

      將數組中的數值記為yuediao,有如下關系式:

      式中,F(xiàn)req為系統(tǒng)時鐘頻率。f為對應音階的頻率,n為延時倍數,m為時值系數。

      值得注意的是,引入延時倍數n、時值系數m是為了規(guī)定一個相對的標準的音符長度,以便后期譜曲計算時區(qū)分時值的音節(jié)。本文中,系統(tǒng)時鐘頻率12MHZ,延時倍數取12,以四分音符為基準,則時值系數取4,從而可得:

      由此,查詢各個音階的頻率。即可計算各個音階所對應的延時周期。從而實現(xiàn)了演奏的第一步——輸出基本音階。

      1.1.2 聲音長度的控制

      首先考慮設計程序,使得蜂鳴器輸出長度相等的音符。為此,引入另一數組,數組的值控制蜂鳴器持續(xù)發(fā)出同一個音符的時間,考慮到音長和頻率成反比。該數值等于對應音符的頻率即可。其次,由于在歌曲的演奏中,有全音符、二分音符、四分音符等到三十二音符的區(qū)別,每種音符持續(xù)的時間也不同,因此我們又引入了音符系數k,若記數組中的值為yuechang,則有如下關系:

      其中,k的值可取0.3,0.6,1.2,2.4,4.8來區(qū)別全音符到十六音符。由此,我們實現(xiàn)了演奏的第二步——控制音長。

      1.1.3 譜曲的實現(xiàn)

      如前所述,已經實現(xiàn)由yuediao、yuechang兩個數組綜合控制,實現(xiàn)蜂鳴器輸出持續(xù)時間相同、音階不同的音符??紤]到實際樂曲,要實現(xiàn)譜曲的節(jié)奏或是音符不同時值,只需在yuehcang數組中乘以相應的倍數。以四分音符為例,C調各音階對應數組取值如表1所示。

      表1 各基礎音階對應數值

      除此之外,我們還引入了高音音階和低音音階,計算方法同C調音階,再此不多贅述。

      那么接下來我們就可以編入歌曲信息讓蜂鳴器“唱歌”了,由于我們并不熟知簡譜,在此我們加入了編曲程序。這個編曲的程序其實十分簡單,其原理是利用另外一個數組“puzi”作為“密匙”來控制調用yindiao和yinchan的元素,puzi數組的元素均為三位數,其中最高位控制高中低音、次高位控制音調、最低位控制音長。這樣用戶只需輸入簡單易懂的命令即可進行編曲,節(jié)約了時間,方便了使用[2]。

      1.2 數模轉換DAC

      雖然MSP430G2553單片機內部沒有集成DAC,但在其擴展板上設計了一塊DAC,我們能用該數模轉換器DAC構造出任意波形,即據此設計基于DDS直接數字頻率合成原理的AWG任意波形發(fā)生器。而且DAC的輸出可以由0歐跳線電阻R27選擇,直接輸出給功放TPA301,并驅動蜂鳴器產生聲音。

      MSP-EXP430G2擴展板上采用的DAC芯片視產品批次不同,可能為DAC7311/8311/8411中的一種。如圖2-1,DAC7311/8311/8411是TI公司推出的系列電阻串(R-String)型DAC,分辨率分別為12/14/16位。這三種DAC芯片不僅管腳兼容,針對16位的DAC8411編寫的程序代碼可以不經改動用于低位數的DAC8311和DAC7311。所以下面僅對DAC8411進行說明。DAC8411的幀數據格式如表2所示:

      表2 DAC8411的幀格式

      (1)頭2位是節(jié)能模式選擇,00是正常工作,01、10、11分別是接1k電阻到地、接10k電阻到地、高阻三種節(jié)能輸出(功耗依次降低)。

      (2)選擇00模式讓DAC正常工作,然后接16位DAC數據,最后6位發(fā)不發(fā)沒有影響。如果是DAC7311和DAC8311芯片,則后接12位或14位有效數據,多發(fā)位沒有影響,所以DAC8411的時序圖其實兼容DAC7311和DAC8311。

      DAC8411的控制時序如表2、圖1所示,當/SYNC使能有效后,將依次發(fā)送24位數據。之后CS禁止至少100ns才能發(fā)送下一數據。對于G2控制來說,因100ns已經接近最高時鐘頻率,所以不用考慮延時等待的問題。

      圖1 DAC8411的控制時序

      2 程序設計思路

      2.1 整體思路

      本程序主要由六大模塊組成:初始化模塊、啟動模塊、演奏模塊、計時模塊、顯示模塊和按鍵功能模塊。整個設計的核心為是演奏模塊、計時模塊以及LCD顯示模塊,設計目的為播放器在演奏樂曲的同時記錄播放時間,并通過LCD屏幕顯示相關信息。啟動模塊、按鍵功能模塊作為輔助模塊,完善整體設計和功能。詳見圖2流程圖。

      圖2 程序設計流程圖

      從整體來看,六個模塊各自負責不同的功能,但又并不完全分割,而是作為一個整體,相互關聯(lián),實現(xiàn)系統(tǒng)的全部功能。

      六大模塊的具體實現(xiàn)流程詳見下文,其主要功能概述如下:

      (1)初始化模塊:關閉看門狗,配置時鐘,初始化各個設置,包括初始化LCD,初始化DAC初始化I O拓展口。

      (2)啟動模塊:依次按下四個按鍵啟動系統(tǒng)。

      (3)演奏模塊:將一定頻率的PWM波輸入DAC,控制蜂鳴器發(fā)出聲音,實現(xiàn)演奏。

      (4)計時模塊:通過系統(tǒng)時鐘記錄時間。

      (5)顯示模塊:將相關信息(播放時間、音量等)通過LCD屏顯示。

      (6)按鍵功能模塊:判斷按鍵是否按下,并執(zhí)行相應的功能。

      2.2 主要功能模塊實現(xiàn)

      2.2.1 LCD顯示實現(xiàn)

      顯示模塊,即將信息顯示在LCD屏幕上,包括播放時長、播放音量等。在LCD顯示前,需先完成調用I2C初始化函數(已寫入頭文件)對拓展版上的I/O拓展口初始化,其次需將LCD屏幕初始化并進行清屏操作。

      同時,為了實時顯示當前信息,需要以一定頻率清除顯存,刷新屏幕。本例通過將刷新頻率與上述播放頻率相對應,即播放一個音符,刷新一次屏幕。避免刷新頻率過慢導致信息顯示滯后,又或刷新頻率過快影響演奏模塊[3]。

      設計中用來執(zhí)行顯示模塊的128段LCD位于拓展版上。本例在單片機中定義8個16位的變量LCD_Buffer[0]~LCD_Buffer[7]為顯示緩存,頂層函數想修改LCD的顯示內容,只需修改LCD_Buffer[0]~LCD_Buffer[7]的內容即可。另外,用void LCD_DisplaySeg(unsigned char SegNum)函數顯示特定的一段,用LCD_DisplayDigit(unsigned char Digit,uns igned charPosition ) 在特定位置顯示特定數值。例如在系統(tǒng)啟動以后,點亮若干特定數碼管,在屏幕上方顯示“VOL”字樣,作為音量標識的具體實現(xiàn)為:

      LCD_DisplaySeg(100);LCD_DisplaySeg(102);LCD_DisplaySeg(103);LCD_DisplaySeg(104);LCD_DisplaySeg(105);LCD_DisplaySeg(106);LCD_DisplaySeg(108);LCD_DisplaySeg(110);LCD_DisplaySeg(111);LCD_DisplaySeg(113);LCD_DisplaySeg(114);LCD_DisplaySeg(116);LCD_DisplaySeg(118);LCD_DisplaySeg(119);

      2.2.2 演奏模塊

      演奏模塊是本次實驗的核心。演奏模塊的實現(xiàn)思路是通過一定頻率的PWM波輸DAC,控制蜂鳴器發(fā)聲。當PWM波電平翻轉時,驅動蜂鳴器振動發(fā)聲[4]。PWM波的頻率(周期)即控制聲音的音調,該頻率PWM波所持續(xù)的時間控制聲音的持續(xù)長度,反映到歌曲里即為歌曲的節(jié)拍。不難想到,需首先設計程序,使得蜂鳴器發(fā)出不同音階。具體實現(xiàn)如下:

      #include

      #include

      using namespace std;int main()

      {int yuediao[1000];int yuechang[1000];

      intpinlv[3][7]={

      {131,147,164,175,196,220,250},//低音{262,294,33 0,349,392,440,494,},//中音

      {523,587,659,698,784,880,988}//高音};

      int yindiao[3][7]={{1920,1702,1516,1431,127 5,1136,1012},//低音{955,851,758,715,637,568,506},//中音{478,425,379,358,319,281,253}//高音};

      float jiepai[5]={0.3,//十六分音符=八分之一拍

      0.6,//八分音符=四分之一拍 1.2,//四分音符= 半拍

      2.4,//二分音符=一拍4.8//全音符小數要定義成 float!

      int puzi[200]={253,333,332,322,313,333,313,312,322,323,353,

      353,352,342,333,343,343,332,322,353,333,333,353,353,313,

      333,323,323,323,332,332,332,331,351,354,332,322,342,341,331,323,253,

      313,312,272,263,253,313,312,322,323,353,353,352,342,333,343,343,332,322,353,333,

      333,353,353,313,333,323,323,323,332,332,332,331,351,354,332,322,342,341,331,323,

      332,332,332,331,351,354,332,322,342,342,331,331,331,331,322,322,322,322

      unsigned int i=0;

      for(i=0;i<200;i++)

      int a = puzi[i]/100 1;// 控制高低音

      int b = (puzi[i]%100)/10 1;// 控制音調

      int c = (puzi[i]%100)%10 1;// 控制節(jié)拍

      yuediao[i] = yindiao[a][b];

      yuechang[i] = jiepai[c]*pinlv[a][b];

      //cout<

      //cout<

      //cout<

      }

      2.2.3 計時模塊

      計時模塊也是本次實驗的核心模塊之一。該模塊的單獨實現(xiàn)較為簡單,通過系統(tǒng)時鐘系統(tǒng)實現(xiàn)計時即可。難點在于將計時模塊以及演奏模塊合理拼接,實現(xiàn)演奏的同時進行計時。

      本例中將一定的節(jié)拍節(jié)奏轉化為時間間隔,將計時模塊寫入演奏函數中。要將演奏時間作為計時參照,需要保證各個音符離散播放,才能將每個音符的演奏時間獨立出來,進行時間的線性疊加。否則,將會各個音符之間連續(xù)播放直至整首曲子結束再進行計時[5]。為此,本例在演奏函數中引入FOR 循環(huán),每次循環(huán)即完成且僅完成一個音符的演奏,將循環(huán)周期記為T,有如下關系式:

      ΔT==T

      將時間記錄為time ,對其進行標準化處理,則記錄的時間應為:

      time=ΔT/T

      具體實現(xiàn)為:

      3 結語

      本文提出了基于MSP430 launchPad非內存讀取音樂播放器的一種解決新方案,該方案不僅能解決TF卡播放出來的樂音小、雜音較大、音頻變的問題。還提供了一種利用PWM波設計樂曲的新思路。該音樂播放器的功能較為完備,可以調整音高、切換歌曲以及循環(huán)播放,并且加入了啟動界面,用戶使用體驗較好;音樂播放的品質(音調、節(jié)拍)準確性也較高;基本達到設計預期。

      猜你喜歡
      蜂鳴器音調數組
      春的呼喚
      新航空(2024年3期)2024-06-03 22:25:26
      電動自行車產品車速提示音檢測現(xiàn)狀和整改技術研究(2)
      JAVA稀疏矩陣算法
      電腦報(2022年13期)2022-04-12 00:32:38
      JAVA玩轉數學之二維數組排序
      電腦報(2020年24期)2020-07-15 06:12:41
      掌控板制作簡易鋼琴
      電腦報(2020年12期)2020-06-30 19:56:42
      單片機驅動蜂鳴器的程序設計
      時代農機(2019年2期)2019-04-24 01:20:14
      劉濤《音調未定的儒家——2004年以來關于孔子的論爭·序》
      名作欣賞(2017年25期)2017-11-06 01:40:12
      豐田凱美瑞240V車間隙警告蜂鳴器異常鳴響
      尋找勾股數組的歷程
      決定音調高低的因素
      察雅县| 龙州县| 屏东市| 哈巴河县| 鹤山市| 清丰县| 会同县| 民勤县| 自贡市| 武安市| 临安市| 东乡县| 时尚| 杂多县| 平原县| 左云县| 通许县| 乌兰察布市| 墨竹工卡县| 临夏市| 河津市| 长武县| 广西| 陇川县| 大理市| 漾濞| 乌苏市| 新邵县| 长葛市| 宣威市| 城步| 油尖旺区| 濉溪县| 五莲县| 东台市| 夏邑县| 互助| 海兴县| 隆昌县| 台江县| 方城县|