目录
一、外观区别
1.其实判断拿到的蜂鸣器是有源蜂鸣器还是无源蜂鸣器最简单准确的判断就是给蜂鸣器两端接上电,能发出声音的就是有源蜂鸣器,不能发出声音的就是无源蜂鸣器
2.部分有源蜂鸣器有贴纸,无源蜂鸣器没有贴纸
二、原理区别
1.无源蜂鸣器是没有正负之分的,只要在两个腿上加载不同的频率的电信号就可以实现发声。比如PWM波形,其中占空比影响声音大小,频率影响音色。
2.有源蜂鸣器是有正负之分的,只需要在两个腿上加上电压信号就会发声,发出的声音音调单一、频率固定,这是因为有源蜂鸣器比无源蜂鸣器内部多了振荡结构。占空比影响声音大小,频率影响音色。
三、STM32代码
1.驱动有源蜂鸣器响一秒停一秒
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
Delay_s(1);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
Delay_s(1);
}
}
2.使用PWM驱动无源蜂鸣器
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "PWM.h"
uint8_t i;
int main(void)
{
PWM_Init();
while (1)
{
TIM_SetCompare1(TIM2,50);
}
}
PWM.C
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
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=100-1;//ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//PSC;注意PSC和ARR的取值都要在0~65535
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 ;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=50;//用来设置CCR寄存器的值
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_Cmd(TIM2,ENABLE);
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2,Compare);
}
PWM.H
#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare);
#endif