STM32 无源蜂鸣器播放音乐(PWM+标准库)

1、STM32通过定时器输出PWM的基本原理

注:本图来自江科大

1.1、图中蓝色线---->CNT计数器的计数值,CNT的值通过定时器一直自增,当达到ARR中装载值时清零。

1.2、图中黄色线----->ARR寄存器中的装载值,这个值可以通过TIM_SetAutoreload()函数进行配置

1.3、途中红色线------>CCR寄存器中的装载值,这个值可以通过TIM_SetCompare1()函数进行配置(四个比较通道,不同通道用不同的比较函数)

1.4、通过比较CNT的值和CCR寄存器的值输出高低电平。

2、无源蜂鸣器

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。我们可以通过配置ARR寄存器来设置不同的频率,因而发出不同的声音。

3、乐谱中的频率

4、PWM代码部分

#include "stm32f10x.h"                  // Device header

void PassionBuzzer_Init()
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //开启GPIOA的时钟
	
	//GPIO初始化
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;  //配置时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 1000-1;   // 72M/72/1000=1000Hz,也就是1ms
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;   //分频器,对TIM2时钟周期进行分频
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;   //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);     //结构体整体初始化,赋予默认值,然后对需要的变量进行配置
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //选择模式,总共8种模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   //输出的极性选择,若选择极性为低,则输出高低电平取反
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //输出状态使能
	TIM_OCInitStructure.TIM_Pulse = 500-1;      //初始化CCR的值,设置占空比为50%
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_ARRPreloadConfig(TIM2,ENABLE);   //AAR寄存器使能
	TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);  //使能TIM2在CCR1上的预装载寄存器
	
	TIM_Cmd(TIM2,ENABLE);   //运行控制
}

void PassionBuzzer_Set_Freq_Duty(uint16_t freq,uint16_t duty)
{
	TIM_SetAutoreload(TIM2,1000000/freq -1);    //根据频率设置加载值
	TIM_SetCompare1(TIM2,(1000000/freq-1)*duty/100);   //设置占空比
}

这里我们找来一首孤勇者来进行测试,孤勇者乐理代码地址:

https://github.com/Lesterbor/GuYongZhe_PassiveBuzzer_STM32

下载后打开,并将这两个文件移植到我们的工程里面。

将里面的代码改成自己刚才实现的代码就好了。

主函数里调用MUSIC_Analysis()就可以欣赏孤勇者了~~~

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32无源蜂鸣器是一种低成本的音频装置,它可以通过振动产生声音。虽然它的音质相对较差,但对于一些简单的音乐播放需求来说,是一种有效的选择。 要在STM32上使用无源蜂鸣器播放音乐,首先需要将音乐转换为适合蜂鸣器播放的格式。蜂鸣器只能发出单音,因此需要将音乐转换为一系列频率不同的音符。 接下来,可以使用STM32的GPIO(通用输入/输出)引脚来控制蜂鸣器。通过改变GPIO引脚的电平,可以产生不同的频率振动,从而发出不同的音符。 编写STM32的程序来控制蜂鸣器播放音乐。首先,配置GPIO引脚为输出模式,并将其设置为低电平以确保蜂鸣器不会一直处于激活状态。 接下来,使用一个循环来依次播放音符。在每个循环中,将GPIO引脚设置为高电平,以产生振动,并保持一段时间来产生音符的持续时间。然后,将GPIO引脚恢复为低电平,以停止振动。 通过循环控制不同音符的播放次数和间隔时间,可以实现音乐的播放。为了控制音乐的速度和节奏,可以调整循环的延迟时间。 需要注意的是,由于无源蜂鸣器的音质受限,播放的音乐可能会有失真或低音不够丰富的问题。如果需要更好的音质,可以考虑使用外部音频芯片或模块来实现音乐播放功能。 ### 回答2: 在STM32微控制器上使用无源蜂鸣器播放音乐可以通过PWM(脉宽调制)技术实现。无源蜂鸣器是一种简单而廉价的电子元件,它可以发出事先设计好的音调。以下是实现步骤: 1. 首先,在STM32开发环境中编写代码,配置IO引脚和定时器以产生PWM信号。为了控制无源蜂鸣器的音调,我们需要使用定时器来生成不同频率的PWM信号。 2. 在代码中定义音符的频率和持续时间。音符的频率决定了所发出的声音,持续时间决定了音符的长度。 3. 在代码中定义一个主循环,在该循环中依次播放每个音符。通过改变PWM信号的频率和持续时间,可以产生不同的音调和音乐效果。 4. 使用延迟函数或定时器中断来控制音符的持续时间。当一个音符播放完毕后,延迟一段时间以控制音符之间的间隔,从而使音乐更加流畅。 5. 在主循环中循环播放所有音符,直到所有音符播放完毕或者接收到停止播放的指令。 通过以上步骤,我们可以使用STM32微控制器和无源蜂鸣器播放音乐。需要注意的是,由于无源蜂鸣器只能发出简单的音调,所以播放的音乐可能会有限制。如果需要播放更复杂的音乐,可能需要使用其他音频设备或者扬声器。 ### 回答3: 要在STM32上使用无源蜂鸣器播放音乐,您可以通过PWM(脉冲宽度调制)的方式来控制蜂鸣器的音调和音乐。下面是实现的步骤: 1. 首先,连接无源蜂鸣器STM32开发板上的GPIO引脚上。确保接线正确。 2. 在STM32的代码中,配置相关的GPIO引脚为PWM输出模式。 3. 初始化一个定时器,用于产生PWM信号,并设置其频率为所需的音调。 4. 创建一个数组,用于存储音乐的音符和其对应的频率。您可以根据需要添加不同的音符和频率。 5. 在代码中使用循环来播放音乐。使用定时器产生的PWM信号来控制蜂鸣器的音高,通过定时器的开启和停止来控制音符的长度和间隔。 6. 在循环中,依次读取音乐数组中的音符和频率,并将当前音符的频率写入定时器的自动重装载寄存器。 7. 播放下一个音符前,通过延时函数来控制音符的持续时间。 8. 重复步骤6和7,直到所有的音乐都播放完毕。 9. 如果您希望播放连续的音乐,可以在播放结束后重新开始播放。 这就是如何在STM32上使用无源蜂鸣器播放音乐的一般步骤。您可以根据实际需求自定义音乐和频率,以实现更多的功能和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值