STM32单片机PWM信号控制蜂鸣器实战教程

单片机型号STM32H743,PWM信号控制无源蜂鸣器

蜂鸣器简介:根据输入信号种类可以把蜂鸣器分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器需要输入直流电,也就是简单的拉高引脚电平就可以响;无源蜂鸣器需要输入一定频率的方波信号才能响。

无源蜂鸣器实现思路:既然这个元器件需要输入一定频率的方波,就需要想办法产生这个方波。一个方案是通过ms或us定时器,拉高电平延时一段时间,再拉低电平延时一段时间,周期重复,产生方波。但是这个方案需要很多延时,MCU在延时期间只能干等着,浪费资源。另一个方案是通过定时器输出PWM信号。需要注意的是,先通过电路图找到控制蜂鸣器的MCU引脚,查找datasheet看这个引脚是否能复用为定时器。如下图我用的控制蜂鸣器的IO口是PI0,可以复用为TIM5通道4。只有能复用为定时器,才能通过方案2产出PWM信号。否则只能使用方案一

 

那什么是PWM信号?

PWM信号简介:PWM,又称脉冲宽度调制,就是根据自己需要的频率和占空比输出定制方波。原理如下图所示,

 

以向上计数模式为例,定时器以固定频率从0开始计数,当计数值CNT=ARR时就归0重新开始计数;ARR的值越大,从0增加到ARR的时间越长,方波的周期就越长、频率就越小。所以ARR和输出方波的频率有关。

当计数值<CCRx时,该引脚输出低电平,当计数值>CCRx时输出高电平。例如ARR=200,CCRx=100,计数值在0~100时输出低电平,计数值增加到100~200时输出高电平,此时占空比为50%。如果设置CCRx=50,那占空比=75%。也就是修改CCRx可以调整高电平在周期内的持续时间。

在编写代码的时候会设置几个重要值

1是psc(时钟预分频系数),2是ARR(自动重装载值),这两个参数在计算方波频率的时候会用到;3是CCRx,用来调整占空比。设置好这三个数后,就不用我们去人工操心了,定时器会自动帮我们处理,什么时候该拉高电平,什么时候该拉低电平。

实战代码:

TIM_HandleTypeDef TIM5_Handler; //定时器 5PWM 句柄
TIM_OC_InitTypeDef TIM5_CH4Handler; //定时器 5 通道 4 句柄
//PWM 输出初始化
//arr:自动重装值 psc:时钟预分频数
//方波频率= 时钟频率/(时钟预分频数+1)/(自动重装值+1)
//本例中 方波频率 = 200MHz/364/200 = 2747.3Hz
void TIM5_PWM_Init( )
{ 
 TIM3_Handler.Instance=TIM5; //定时器 5,根据项目情况修改
 TIM3_Handler.Init.Prescaler=363; //psc定时器分频,根据项目情况修改
 TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
 TIM3_Handler.Init.Period=199; //arr自动重装载值,根据项目情况修改
 TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
 HAL_TIM_PWM_Init(&TIM5_Handler); //初始化 PWM
 
 TIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择 PWM1
 TIM3_CH4Handler.Pulse=100; //设置比较值,此值用来确定占空比,根据项目情况修改
 TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
 HAL_TIM_PWM_ConfigChannel(&TIM5_Handler,&TIM5_CH4Handler,
 TIM_CHANNEL_4); //配置 TIM5 通道 4
 HAL_TIM_PWM_Start(&TIM5_Handler,TIM_CHANNEL_4);//开启 PWM 通道 4 
}


//定时器底层驱动,时钟使能,引脚配置
//此函数会被 HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
 GPIO_InitTypeDef GPIO_Initure;
 __HAL_RCC_TIM5_CLK_ENABLE(); //使能定时器 5,根据项目情况修改
 __HAL_RCC_GPIOI_CLK_ENABLE(); //开启 GPIOB 时钟,根据项目情况修改

 GPIO_Initure.Pin=GPIO_PIN_0; //PI0,根据项目情况修改
 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
 GPIO_Initure.Pull=GPIO_PULLUP; //上拉
 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate= GPIO_AF2_TIM5; //PI0 复用为 TIM5_CH4,根据项目情况修改
 HAL_GPIO_Init(GPIOI,&GPIO_Initure);
}

经实践,方波的频率和占空比都会影响蜂鸣器的声音大小。我是根据蜂鸣器手册建议的2730Hz,占空比50%时声音最大。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32单片机PWM信号控制蜂鸣器实战教程

发表评论