无源蜂鸣器

蜂鸣器。左边的是有源蜂鸣器,右边的无源。从外观上看,无源蜂鸣器略矮(约1mm)。有源蜂鸣器触发就会发声,发声频率固定。无源蜂鸣器要用方波驱动,方波频率即为其发声频率:

没有像样的规格书,频率范围未知。网店商品描述中提到一句2k-5k,that's all。一些关于声音频率的数据:

  • 人耳的敏感范围约为 20Hz - 20 kHz
  • 钢琴的频率范围约 16Hz - 5.6 kHz(参考
  • 标准音 A4 频率为 440Hz
  • 人耳/大脑对频率呈倍数关系的两个音感知为同一个音,但是音高不同。西方音乐使用的Chromatic Scale音阶,将一个Scale平均分为12个pitch,每个pitch称为一个semitone。因此,相邻semitone之间的频率相差12√2倍(2的12次方根,约1.0595) 。例如,标准音A4为440Hz,A#4 则为 440 x 12√2 = 466.164Hz

STM32 的 General Purpose Timer 可以工作在 Output Compare (OC)模式下,从pin脚输出方波。控制输出方波的频率,即可驱动蜂鸣器发出不同的声音。OC模式工作原理简述如下。

先将OC置之不理,单看Timer的计数部分,主要是3个寄存器:CNT, ARR, PSC。Timer时钟源频率除以 PSC后才是Timer 的计数频率。CNT从0开始往上依次计数,当达到 ARR时,将回到0重新开始。而OC部分则有寄存器CCR,每当CNT与CCR相等时,可以设置输出pin的值,例如将其置高、置低或者toggle。输出方波要使用toggle方式。

将CCR设固定值,例如0。OC频率 = Timer时钟源频率 / PSC / (1+ARR)。对于toggle方式,2个OC周期才是1个方波周期,因此,输出方波的频率 = OC频率 / 2 = Timer时钟源频率 / PSC / (1+ARR) / 2。

可见,输出方波频率取决于 PSC及 ARR。对16位 Timer,PSC及 ARR取值范围为 0 - 65535。

若时钟源频率为72MHz,取PSC=36,则方波频率 = 1MHz / (1+ARR)。当ARR取值范围为 49-65535 时,可获得的方波频率范围为 15Hz - 20kHz,覆盖了人耳的敏感范围和钢琴的频率范围。

相关设置如下,其中时钟源选择内部72MHz:

 

 计时器设置中的 Counter Period即为 PSC,设为36;而OC Channel设置中的 Pulse 则为 CCR,设为0:

 

演奏一首好听的歌--可惜不是你-- 中的两句:

 

简谱音符对照到钢琴琴键,再查询得到其频率:

 

 演奏的实现如下。_App_music[] 数组包含曲子的所有音符,每个音符2个元素,一个是音符的频率,另一个是时长:

static float _App_music[] = { //
        440.000, 1, // (1)
                783.991, 2, //
                659.255, 2, //
                523.251, 1, //
                587.330, 3, //
                ...

#define _App_GET_ARR(f) ( (uint32_t)(1000000/(float)(f) - 1) )
#define _App_TIME_UNIT  250
#define _App_IDLE_DELAY 10

void App_Init() {

    const size_t cnt = sizeof(_App_music) / sizeof(float);
    for (int i = 0; i < cnt; i += 2) {
        float f = _App_music[i];
        uint32_t t = (uint32_t) (_App_TIME_UNIT * _App_music[i + 1]);
        __HAL_TIM_SET_AUTORELOAD(&htim3,_App_GET_ARR(f))
        ;
        HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_1);
        HAL_Delay(t);
        HAL_TIM_OC_Stop(&htim3, TIM_CHANNEL_1);
        HAL_Delay(_App_IDLE_DELAY);
    } // for

}

 

实测表明,蜂鸣器的有效频率范围约为 200Hz - 10 kHz。

 

转载于:https://www.cnblogs.com/vinccc/p/8305793.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值