2016-02-24 65 views
3

您好我正試圖在mbe​​d應用程序屏蔽上使用不同的聲音頻率來創建歌曲的音調。雖然我已經獲得了所有的頻率,但我似乎無法放慢速度,因爲它只是在所有頻率上循環非常快。我試圖使用wait();功能,但似乎沒有正常工作。我希望瞭解如何糾正這些或其他解決方案的一些想法。如何使用C++減慢mbed設備上不同頻率的速度

這裏是我的代碼

#include "mbed.h" 
#include "C12832.h" // for the LCD 
#include "LM75B.h" //for the temperature sensor 
#include "MMA7660.h" //For the accelerometer 

/*************************************************************************** 
Global Variables 
***************************************************************************/ 

C12832 shld_lcd (D11, D13, D12, D7, D10); // LCD on the application shield 
PwmOut spkr(D6); //speaker 

float c = 262.0; //These are the different frequencies 
float d = 294.0; 
float e = 330.0; 
float f = 349.0; 
float g = 392.0; 
float a = 440.0; 
float b = 494.0; 
float C = 523.0; 


void hotLineBling() { 

    //Here I am trying to use the frequencies to play the tone 

    spkr.period(1/e); 
    spkr.period(1/e); 
    spkr.period(1/e); 
    wait(0.5f); 
    spkr.period(1/C); 
    spkr.period(1/a); 
    spkr.period(1/e); 
    wait(0.5f); 
    spkr.period(1/d); 
    spkr.period(1/a); 
    spkr.period(1/d); 
    wait(1.0); 
    spkr.period(1/C); 
    spkr.period(1/a); 
    spkr.period(1/e); 
    wait(0.5f); 
    spkr.period(1/d); 
    spkr.period(1/a); 
    spkr.period(1/d); 
    spkr.period(1/c); 
    wait(1.0); 
    spkr.period(1/C); 
    spkr.period(1/a); 
    spkr.period(1/e); 
    wait(0.5f); 
    spkr.period(1/d); 
    spkr.period(1/a); 
    spkr.period(1/d); 
    wait(5.0); 

} 

int main() 
{ 

    hotLineBling(); 

    while (1) { 

     spkr = 0.5; 
     wait(0.2f); //wait a little 
    } 
} 

回答

2

您需要將PWM引腳的值設置爲要播放的內容,也可以用這種方式控制音量。第二件事是你需要等到設置period之間,否則沒有時間讓筆記在該頻率上實際做任何事情。試試這個:

#include "mbed.h" 

PwmOut spkr(D3); 

float c = 262.0; //These are the different frequencies 
float d = 294.0; 
float e = 330.0; 
float f = 349.0; 
float g = 392.0; 
float a = 440.0; 
float b = 494.0; 
float C = 523.0; 
float _ = 0.0; 

void hotLineBling() { 
    float notes[] = { e, e, e, _, C, a, e, _, d, a, d, _, _, 
         C, a, e, _, d, a, d, c, _, _, C, a, e, 
         _, d, a, d }; 

    for (int i = 0; i < sizeof(notes)/sizeof(float); i++) { 
     if (notes[i] == _) { 
      spkr = 0.0f; 
     } 
     else { 
      spkr = 0.3f; 
      spkr.period(1/notes[i]); 
     } 
     wait(0.5f); 
    } 

    spkr = 0.0f; 
} 

int main() { 
    hotLineBling(); 
} 

雖然我不知道,如果像你想它聽起來:-)這聽起來什麼

+0

OMG是它的工作原理謝謝,我需要添加幾個筆記,但可能沒有足夠的內存。再次感謝! – user5647516

0

我既不非常熟悉的mbed也不符合您所使用的環境 - 但有些東西似乎是顯而易見的:

  • 你所說的PWM發生器和設置頻率
  • 你似乎在等待(暫停)組之間的筆記 - 至少你想。你沒有告訴PWM在那段時間內保持沉默(頻率= 0)。
  • 也似乎已經設置PWM佔空比(我承擔的「揚聲器= 0.5」行確實是)

一切OK,但是: - 你似乎並不在等待的PWM來實際上播放音符取決於您想要音色存在多長時間(在每個音符設置PWM頻率後應該有一個延遲 - 這就像將手指放在錫哨子的孔中而不吹。 ..)

您應該在spkr.period()行之間傳播一些wait(),具體取決於您希望每個音符播放多長時間。

如果您需要一段時間的靜音,您還應該將PWM頻率設置爲0。

我不知道的是,mbed是否要求您實際「啓動」PWM或者是否是自由運行的。

+0

好吧,我明白你的意思,會嘗試你的建議,現在 – user5647516