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()就可以欣赏孤勇者了~~~

作者:heibai_emily

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 无源蜂鸣器音乐播放教程(PWM 标准库)

发表回复