一、硬件设计
本项目用到的是一个无源蜂鸣器的模块,接到了STM32的PB7引脚,对应的是定时器4的通道2---TIM4_CH2。
蜂鸣器利用PWM输出播放音乐的相关原理,可以参考以下文章STM32CubeMx使用教程(五)—— 使用PWM控制蜂鸣器演唱孤勇者_stm32控制蜂鸣器唱歌-优快云博客,在软件部分我将贴出相关的公式,以及具体代码的实现。
二、软件设计
我们通过调整来PSC的值,来修改蜂鸣器输出的频率,从而输出不同的音符。来看一个简单的例子:
根据周期输出的公式:Tout= ((arr+1)*(psc+1))/Tclk, 频率为 F=1/Tout。
如果我们要输出一个低音DO(262hz),Tclk对应的是我们单片机的时钟总线的频率,我们的ARR值配置为1000,那么PSC就该为(72000/262),此时的Tout约为0.0038,而频率=1/周期,所以此时蜂鸣器输出的频率就约为262Hz。接下来看下面Beep.h中这些宏定义就能够明白它们的由来了。
#ifndef __BEEP_H
#define __BEEP_H
#include "main.h"
#define proport 72000 //Tclk/(arr+1)=72000000/(1000)
//根据Tout= ((arr+1)*(psc+1))/Tclk推出psc值就是本句define定义的值,Tout为音调频率131Hz的倒数,Tclk=72MHz
#define L1 ((proport/262)-1)//低调 do 的频率
#define L2 ((proport/296)-1)//低调 re 的频率
#define L3 ((proport/330)-1)//低调 mi 的频率
#define L4 ((proport/349)-1)//低调 fa 的频率
#define L5 ((proport/392)-1)//低调 sol 的频率
#define L6 ((proport/440)-1)//低调 la 的频率
#define L7 ((proport/494)-1)//低调 si 的频率