有源蜂鳴器與無源蜂鳴器區別
有源蜂鳴器與無源蜂鳴器區別在于是否有振蕩源。
有源蜂鳴器即有震蕩源的蜂鳴器,通常只需要在正負極上加對應的供電電壓就可以驅動發聲。
無源蜂鳴器即無震蕩源的蜂鳴器,這個時候就需要搭建驅動電路(后面章節會提到相關驅動電路)進行驅動蜂鳴器進行發聲了。
有源蜂鳴器
有源蜂鳴器的話相當于在這個模塊內部已經為我們搭建好了驅動電路了,這個時候我們只需要在蜂鳴器兩端加上對應的電壓驅動即可(注意有源蜂鳴器引腳區分正負)。
例如下面的這張圖可以看到一般有源蜂鳴器會清楚的寫出驅動的電壓參數以及輸出的頻率是多少的,因為內部加了震蕩源了,所以一般輸出頻率都是固定的(通常引腳是長腳正,短腳負 )。
圖中的這個有源蜂鳴器的驅動電壓是5V,輸出頻率是2.3KHz左右的。
無源蜂鳴器
無源蜂鳴器需要自己外搭驅動電路,此時對于蜂鳴器本身來說引腳是不分正負的。
同樣可以查看自己手中的無源蜂鳴器提供的參數,重要的就是兩個,一個驅動電壓,一個是驅動的頻率(常見:2-5KHz)。這里給出一個簡單的驅動電路可以用來驅動無源蜂鳴器發聲的。

這里我用來試驗的是輸入2KHz驅動的蜂鳴器,看下實際接線圖:

這里使用的是PWM發生器來給蜂鳴器提供一個方波信號驅動其發聲,最快速方法就是搭建洞洞板來驅動就能快速知道這個無源蜂鳴器是否可以正常驅動及好壞。
模塊化有源蜂鳴器及無源蜂鳴器驅動方式的說明

單片機驅動比較常用的是這種模塊化的蜂鳴器,可以看到兩者之間的外觀是一模一樣的(這里有些廠商會用貼紙區分,有些是一樣的),如果是貼紙是一樣的,只能通過輸入信號聽蜂鳴器是否發聲分辨是有源還是無源。
VCC,GND按參數供電5V,這里供電建議還是使用穩壓電源會好些(有些人用USB轉TTL或者STlink進行供電發現無法驅動的情況,市面上還是有部分USB轉串口和stlink是劣質的,很容易出現供電不足的情況,所以模塊的供電都是建議使用穩壓電壓進行供電),然后在I/O口輸入一個低電平(看自己手中的模塊寫的是高/低電平驅動然后輸入對應的電平,這里是低電平驅動)看蜂鳴器是否發聲:
- 蜂鳴器發聲-->模塊為有源蜂鳴器
- 蜂鳴器無聲-->壞了或者為無源蜂鳴器
然后把 I/O口輸入從低電平換成一個方波信號來驅動,輸入方波信號后可以聽到蜂鳴器發聲就是無源蜂鳴器,依舊無聲的話,排查自己的方波信號是否驅動能力不夠大/信號地和電源地沒有共地的問題,如果驅動能力足夠且都有共地的話那可能就是模塊壞了。
有源、無源蜂鳴器代碼驅動
有源蜂鳴器:單片機IO口輸出一個高/低電平信號
無源蜂鳴器:單片機IO口輸出一個方波(占空比不為0%或者100%的)
這里只舉例STM32F103C8T6的驅動主函數代碼,需要整個工程的可以評論區留言!(其他單片機arduino,51等都是同理,配置好IO口輸出即可)
有源蜂鳴器驅動代碼(main.c):
##現象:蜂鳴器響一下停一下,按這樣一直循環
int main(void)
{
/*開啟時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //開啟GPIOB的時鐘
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,賦值為推挽輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIO引腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,賦值為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //實現GPIOB的初始化
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_9); //將PB9引腳設置為低電平,蜂鳴器鳴叫
Delay_ms(200); //延時100ms
GPIO_SetBits(GPIOB, GPIO_Pin_9); //將PB9引腳設置為高電平,蜂鳴器停止
Delay_ms(200); //延時100ms
}
}
無源蜂鳴器驅動代碼(pwm.c)
#這個的現象主要和設置的頻率和占空比有關,自行在主函數確定好即可輸出對應的現象
void PWM_Init(void)
{
/*開啟時鐘*/
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); //將PA0引腳初始化為復用推挽輸出
/*配置時鐘源*/
TIM_InternalClockConfig(TIM2); //選擇TIM2為內部時鐘,若不調用此函數,TIM默認也為內部時鐘
/*時基單元初始化*/
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的值
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; //輸出比較模式,選擇PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性,選擇為高,若選擇極性為低,則輸出高低電平取反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸出使能
TIM_OCInitStructure.TIM_Pulse = 0; //初始的CCR值
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //將結構體變量交給TIM_OC1Init,配置TIM2的輸出比較通道1
/*TIM使能*/
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定時器開始運行
}
/**
* 函 數:PWM設置CCR
* 參 數:Compare 要寫入的CCR的值,范圍:0~100
* 注意事項:CCR和ARR共同決定占空比,此函數僅設置CCR的值,并不直接是占空比
* 占空比Duty = CCR / (ARR + 1)
*/
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare); //設置CCR1的值
//這里的ARR+1正好是100 所以CCR設置為多少占空比就是多少
}
無源蜂鳴器驅動代碼主要是PWM的輸出,這個時候改變頻率改變的是輸出聲音的音調。
總結
1.區分好有源、無源蜂鳴器后再進行驅動,不要不發聲就認為模塊是壞的。
2.有些貼片式的無源蜂鳴器有多個引腳,有些是固定引腳要看手冊區分好引腳的功能。
3.有源區分正負,一般長腳正,短腳負;無源不分正負。
審核編輯 黃宇
-
有源蜂鳴器
+關注
關注
0文章
31瀏覽量
12039 -
無源蜂鳴器
+關注
關注
0文章
43瀏覽量
11610
發布評論請先 登錄
有源晶振與無源晶振的不同點有哪些呢
開發單片機需要具備多少的模電技能
無源探頭與有源探頭的安全性差異解析
單片機怎么驅動電機?
有源濾波器與無源濾波器的區別
單片機和伺服有什么區別
無源晶振vs有源晶振:參數差異如何影響系統設計
關于有源蜂鳴器及無源蜂鳴器的區別及驅動各類單片機案例
評論