3

嗨,我正在尝试在 mbed 应用程序屏蔽上使用不同的声音频率来从歌曲中创建音调。虽然我已经获得了所有频率,但我似乎无法减慢速度,因为它只是在所有频率之间快速循环。我曾尝试使用 wait(); 功能,但这似乎无法正常工作。我将不胜感激有关如何纠正此或替代解决方案的一些想法。

这是我的代码

#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
    }
}
4

2 回答 2

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();
}

虽然我不知道这听起来是否像你想要的那样:-)

于 2016-02-24T18:26:57.883 回答
0

我对 mbed 和您使用的环境都不是很熟悉 - 但有些事情似乎很明显:

  • 您正在与 PWM 发生器通话并设置频率
  • 您似乎在多组笔记之间等待(暂停)——至少您愿意。您并没有告诉 PWM 在这些时间段内保持静音(频率 = 0)。
  • 您似乎还设置了 PWM 占空比(我假设“spkr = 0.5”行这样做)

一切正常,但是: - 您似乎并没有等待 PWM 实际播放音符,具体取决于您希望音调存在多长时间(在为每个音符设置 PWM 频率后应该有一个延迟 - 也就是说就像把你的手指放在锡口哨的孔上而不是吹...)

根据您希望每个音符播放多长时间,您绝对应该在 spkr.period () 行之间传播一些 wait()。

如果您想要一段时间的静音,您还应该将 PWM 频率设置为 0。

我不知道mbed是否需要您实际“启动” PWM,或者它是否可以自由运行。

于 2016-02-24T16:02:43.697 回答