Ardunino - 带PWM的蜂鸣器

时间:2018-03-28 23:41:52

标签: audio arduino frequency

我正在尝试制作带有蜂鸣器的复音音乐播放器。 Arduino的。我正在关注this教程作为指导,但我无法弄明白。代码就像:

EC2Cloud cloud = Jenkins.instance.clouds.find { it instanceof EC2Cloud }
KeyPair key_pair= cloud.getKeyPair()
private_key_text = key_pair.keyMaterial
def secret_key = hudson.util.Secret.decrypt(cloud.getSecretKey()).toString()

我被困在“digitalWrite(speakerOut,HIGH);”线。在我调用playTone函数之前确定我设置了“tone_ = melody [i];”但在函数中我们只在延迟函数中使用它。

我的问题是它如何跟随旋律数组?基于此,我将添加一个蜂鸣器,并通过另一个阵列控制它,但现在我无法做任何事情......

1 个答案:

答案 0 :(得分:0)

我看到您的困惑,因为您的程序正在阻塞(只是循环延迟),您不能并行添加更多旋律。解决方案是使用计时器/计数器和迭代过程将代码重写为无阻塞界面。为了简单起见,假设简单的数字1位声音。为了确保后面的复音,我们需要使用PWM,以便我们可以将更多的通道添加在一起。

  1. 让我们以单音开头

    对于每个声音通道,您都需要存储实际状态,例如:

    • 语气test [T]的时间段,T
    • 音频PWM周期T = ftimer/ftone [T]中的实际时间,其中t
    • 音调幅度0 <= t <= T [-]或音量应为A
    • 扬声器状态A <= T/2(打开/关闭)


    其中[T]代表某个计时器/计数器的周期,该周期将通过(采样率)将所有值转换为整数进行更新。现在,您只需创建一个on函数,该函数就会以足够高的频率从某个计时器定期调用,并确定扬声器的状态(开/关)。

    mono tone

  2. 旋律

    只需添加一些计数器update [T],它代表当前音调应播放多少个周期。并在n中递减,如果递减为零,则从您的旋律表中获取新音调。因此,您还需要添加一些索引,以从您的旋律中播放当前正在播放的音调。

  3. 复音

    您可以通过硬件连接或连接更多数字引脚(每个通道一个)来实现。但这也可以通过软件手段来实现。只需通过对每个应声道的update值进行逻辑运算,即可将每个声道逻辑上加在一起,并根据其结果(on)设置发言人。那个工作但是输出质量不是很好。更好的方法是使用算术加法(A|B)并将结果用作PWM输出,其输出具有用于音调合成的采样频率的几倍。

    polyphony

    您也可以使用DAC代替PWM ...

我没有为ARDUINO编码,所以我无法共享完整代码。但是在我的AVR32上,C / C ++代码如下所示:

A+B

因此,我只有一组//--------------------------------------------------------------------------- #ifndef _music_h #define _music_h //--------------------------------------------------------------------------- #ifdef VCL_H #define U8 BYTE #define U16 WORD #define U32 DWORD #endif //--------------------------------------------------------------------------- //#define _music_shifted_notes //--------------------------------------------------------------------------- // volume #define music_A 5 // max channels #define music_sys_T 3 // _music update freq #define music_f ftim0/music_sys_T //--------------------------------------------------------------------------- // music frequency 100*f [Hz], C_0 means C#0, P means pause //--------------------------------------------------------------------------- #define P 0 #ifdef _music_shifted_notes // musics data shifted frequencies C4 -> C1 #define C1 26163 #define C_1 27718 #define D1 29366 #define D_1 31113 #define E1 32963 #define F1 34923 #define F_1 36999 #define G1 39200 #define G_1 41530 #define A1 44000 #define A_1 46616 #define B1 49388 #define C2 52325 #define C_2 55437 #define D2 58733 #define D_2 62225 #define E2 65925 #define F2 69846 #define F_2 73999 #define G2 78399 #define G_2 83061 #define A2 88000 #define A_2 93233 #define B2 98777 #define C3 104650 #define C_3 110873 #define D3 117466 #define D_3 124451 #define E3 131851 #define F3 139691 #define F_3 147998 #define G3 156798 #define G_3 166122 #define A3 176000 #define A_3 186466 #define B3 197553 #define C4 209300 #define C_4 221746 #define D4 234932 #define D_4 248902 #define E4 263702 #define F4 279383 #define F_4 295996 #define G4 313596 #define G_4 332244 #define A4 352000 #define A_4 372931 #define B4 395107 #else // real note frequuencies #define C0 1635 #define C_0 1732 #define D0 1835 #define D_0 1945 #define E0 2060 #define F0 2183 #define F_0 2312 #define G0 2450 #define G_0 2596 #define A0 2750 #define A_0 2914 #define B0 3087 #define C1 3270 #define C_1 3465 #define D1 3671 #define D_1 3889 #define E1 4120 #define F1 4365 #define F_1 4625 #define G1 4900 #define G_1 5191 #define A1 5500 #define A_1 5827 #define B1 6174 #define C2 6541 #define C_2 6930 #define D2 7342 #define D_2 7778 #define E2 8241 #define F2 8731 #define F_2 9250 #define G2 9800 #define G_2 10383 #define A2 11000 #define A_2 11654 #define B2 12347 #define C3 13081 #define C_3 13859 #define D3 14683 #define D_3 15556 #define E3 16481 #define F3 17461 #define F_3 18500 #define G3 19600 #define G_3 20765 #define A3 22000 #define A_3 23308 #define B3 24694 #define C4 26163 #define C_4 27718 #define D4 29366 #define D_4 31113 #define E4 32963 #define F4 34923 #define F_4 36999 #define G4 39200 #define G_4 41530 #define A4 44000 #define A_4 46616 #define B4 49388 #define C5 52325 #define C_5 55437 #define D5 58733 #define D_5 62225 #define E5 65925 #define F5 69846 #define F_5 73999 #define G5 78399 #define G_5 83061 #define A5 88000 #define A_5 93233 #define B5 98777 #define C6 104650 #define C_6 110873 #define D6 117466 #define D_6 124451 #define E6 131851 #define F6 139691 #define F_6 147998 #define G6 156798 #define G_6 166122 #define A6 176000 #define A_6 186466 #define B6 197553 #define C7 209300 #define C_7 221746 #define D7 234932 #define D_7 248902 #define E7 263702 #define F7 279383 #define F_7 295996 #define G7 313596 #define G_7 332244 #define A7 352000 #define A_7 372931 #define B7 395107 #define C8 418601 #define C_8 443492 #define D8 469863 #define D_8 497803 #define E8 527404 #define F8 558765 #define F_8 591991 #define G8 627193 #define G_8 664488 #define A8 704000 #define A_8 745862 #define B8 790213 #endif #define H0 B0 #define H1 B1 #define H2 B2 #define H3 B3 #define H4 B4 #define H5 B5 #define H6 B6 #define H7 B7 #define H8 B8 #define H_0 B_0 #define H_1 B_1 #define H_2 B_2 #define H_3 B_3 #define H_4 B_4 #define H_5 B_5 #define H_6 B_6 #define H_7 B_7 #define H_8 B_8 //--------------------------------------------------------------------------- // music tempo delays [ms] //--------------------------------------------------------------------------- #define T32 62 #define T20 100 #define T16 125 #define T10 200 #define T9 222 #define T8 250 #define T7 285 #define T6 333 #define T5 400 #define T4 500 #define T3 666 #define T2 1000 #define T1 2000 //--------------------------------------------------------------------------- typedef struct { U32 T,t,n,on; U32 *melody; } _music; //--------------------------------------------------------------------------- void music_play(_music *m,U32 *melody) { m->melody=melody; m->t=0; m->T=0; m->on=0; m->n=1; } //--------------------------------------------------------------------------- void music_stop(_music *m) { m->melody=NULL; m->t=0; m->T=0; m->on=0; m->n=1; } //--------------------------------------------------------------------------- void music_update(_music *m) { if (m->melody==NULL) { m->on=0; return; } m->n--; if (!m->n) { U32 x; m->T=m->melody[0]; m->melody++; if (m->T) m->T=(100*music_f)/m->T; if (m->melody==NULL) { m->on=0; return; } m->n=(m->melody[0]*music_f)/1000; m->melody++; m->on=1; m->t=0; if (m->n==0) m->melody=NULL; } m->t++; if (m->t==m->T){ m->on=1; m->t=0; } if (m->t==music_A) m->on=0; } //--------------------------------------------------------------------------- void music_sys_init(_music *m,int n) { for (int i=0;i<n;i++) music_stop(m+i); } //--------------------------------------------------------------------------- void music_sys_update(_music *m,int n,U32 pin) { static U32 t=0,A=0; int i; t++; if (t==music_sys_T) { t=0; A=0; for (i=0;i<n;i++) { music_update(m+i); if (m[i].on) A++; } if (A) gpio_set_gpio_pin(pin); } if (t==A) gpio_clr_gpio_pin(pin); } //--------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------- 代表我的所有频道,并在某个计时器中以_music的频率调用music_sys_update,我使用的是ftim0 [Hz]。

ftim0=200000

因此,只需将其移植到您的环境中,即可享受乐趣:)...