如何使用 C++ 降低 mbed 设备上不同频率的速度
How to slow the tempo down for different frequencies on a mbed device using C++
您好,我正在尝试在 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
}
}
我对 mbed 和您使用的环境都不是很熟悉 - 但有些事情似乎很明显:
- 您正在与 PWM 发生器对话并设置频率
- 您似乎在笔记组之间等待(暂停)- 至少您愿意。您并没有告诉 PWM 在这些时间段内保持静音(频率 = 0)。
- 您似乎还设置了 PWM 占空比(我假设 "spkr = 0.5" 行就是这样做的)
全部O.K,但是:
- 您似乎没有等待 PWM 实际 播放 音符,具体取决于您希望音调出现多长时间(PWM 频率设置为每个音符 - 这就像将手指放在锡口哨的孔上而不是吹...)
你绝对应该在 spkr.period () 行之间分配一些 wait() ,这取决于你希望每个音符播放多长时间。
如果你想静默一段时间,你也应该将 PWM 频率设置为 0。
我不知道 mbed 是否需要您实际 "start" PWM 或者它是否免费-运行。
你需要设置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();
}
虽然我不知道这听起来是否像你想要的那样:-)
您好,我正在尝试在 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
}
}
我对 mbed 和您使用的环境都不是很熟悉 - 但有些事情似乎很明显:
- 您正在与 PWM 发生器对话并设置频率
- 您似乎在笔记组之间等待(暂停)- 至少您愿意。您并没有告诉 PWM 在这些时间段内保持静音(频率 = 0)。
- 您似乎还设置了 PWM 占空比(我假设 "spkr = 0.5" 行就是这样做的)
全部O.K,但是: - 您似乎没有等待 PWM 实际 播放 音符,具体取决于您希望音调出现多长时间(PWM 频率设置为每个音符 - 这就像将手指放在锡口哨的孔上而不是吹...)
你绝对应该在 spkr.period () 行之间分配一些 wait() ,这取决于你希望每个音符播放多长时间。
如果你想静默一段时间,你也应该将 PWM 频率设置为 0。
我不知道 mbed 是否需要您实际 "start" PWM 或者它是否免费-运行。
你需要设置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();
}
虽然我不知道这听起来是否像你想要的那样:-)