相信大家對蜂鳴器都不會陌生,很多產品和方案中都會用到蜂鳴器,大部分都是使用蜂鳴器來做提示或報警,比如按鍵按下、開始工作、工作結束或是故障等等。這里對單片機在蜂鳴器驅動上的應用作一下描述。
蜂鳴器的介紹、原理及其驅動方式
(一)蜂鳴器的介紹
1.蜂鳴器的作用:蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用於計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。
2.蜂鳴器的分類:蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
3.蜂鳴器的電路圖形符號蜂鳴器在電路中用字母“H”或“HA”(舊標准用“FM”、“LB”、“JD”等)表示。
(二)蜂鳴器的結構原理
1.壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振盪器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發光二極管。多諧振盪器由晶體管或集成電路構成。當接通電源后(1.5~15V直流工作電壓),多諧振盪器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極經極化和老化處理后,再與黃銅片或不銹鋼片粘在一起。
2.電磁式蜂鳴器 電磁式蜂鳴器由振盪器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振盪器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。
(三)驅動方式
慣用驅動蜂鳴器的方式有兩種:一種是PWM 輸出口直接驅動,另一種是利用I/O定時翻轉電平產生驅動波形對蜂鳴器進行驅動。
PWM 輸出口直接驅動是利用PWM輸出口本身可以輸出一定的方波來直接驅動蜂鳴器。在單片機的軟件設置中有幾個系統寄存器是用來設置PWM口的輸出的,可以設置占空比、周期等等,通過設置這些寄存器產生符合蜂鳴器要求的頻率的波形之后,只要打開PWM輸出,PWM輸出口就能輸出該頻率的方波,這個時候利用這個波形就可以驅動蜂鳴器了。比如頻率為2000Hz的蜂鳴器的驅動,可以知道周期為500μs,這樣只需要把PWM的周期設置為500μs,占空比電平設置為250μs,就能產生一個頻率為2000Hz的方波,通過這個方波再利用三極管就可以去驅動這個蜂鳴器了。
而利用I/O 定時翻轉電平來產生驅動波形的方式會比較麻煩一點,必須利用定時器來做定時,通過定時翻轉電平產生符合蜂鳴器要求的頻率的波形,這個波形就可以用來驅動蜂鳴器了。比如為2500Hz的蜂鳴器的驅動,可以知道周期為400μs,這樣只需要驅動蜂鳴器的I/O口每200μs翻轉一次電平就可以產生一個頻率為2500Hz,占空比為1/2duty的方波,再通過三極管放大就可以驅動這個蜂鳴器了。
有源蜂鳴器與無源蜂鳴器有什么區別
這里的“源”不是指電源。而是指震盪源。 也就是說,有源蜂鳴器內部帶震盪源,所以只要一通電就會叫。而無源內部不帶震盪源,所以如果用直流信號無法令其鳴叫。必須用2K~5K的方波去驅動它。因此有源蜂鳴器往往比無源的貴,就是因為里面多個震盪電路。無源蜂鳴器的優點是:便宜、聲音頻率可控,可以做出“多來米發索拉西”的效果、在一些特例中,可以和LE復用一個控制口。有源蜂鳴器的優點是:程序控制方便 。
模塊使用
在此我們利用蜂鳴器實現一個簡單的整點報時功能,在這里我們選用有源蜂鳴器,只要通電就會發聲,這樣程序控制簡單,無源蜂鳴器的控制發聲,需要利用PWM進行輸出,PWM控制輸出可參見溫度傳感器DS18B20。
1、所需材料:
• 有源蜂鳴器一個
• 樹莓派
• 杜邦線數根
2、引腳連接說明:
有源蜂鳴器 | 樹莓派 |
- | GND |
+ | 5v |
S | GPIO 7 |
3、程序編寫:
為了使蜂鳴器鳴叫的程序模塊化,將這一部分代碼放到獨立的 libbeep.py 文件中,代碼如下:
- import RPi.GPIO as GPIO
- import time
- PIN_NO = 7 #GPIO編號,可自定義
- GPIO.setmode(GPIO.BOARD)
- GPIO.setup(PIN_NO, GPIO.OUT)
- #嗶1次,時長作為參數傳遞
- def beep(seconds):
- GPIO.output(PIN_NO, GPIO.HIGH)
- time.sleep(seconds)
- GPIO.output(PIN_NO, GPIO.LOW)
- #嗶N次,時長、間隔時長、重復次數作為參數傳遞
- def beepAction(secs, sleepsecs, times):
- for i in range(times):
- beep(secs)
- time.sleep(sleepsecs)
- #beepAction(0.02,0.02,30)
在 alarm.py 中實現整點報時,代碼如下:
- import RPi.GPIO as GPIO
- import time
- import libbeep
- while True:
- t = time.localtime() #讀取系統時間
- h = t.tm_hour
- m = t.tm_min
- s = t.tm_sec
- w = time.strftime('%w',t)#函數接收以時間元組,並返回以可讀字符串表示的當地時間,%w一年中的星期數(00-53)星期一為星期的開始
- print h,m,s,w
- time.sleep(0.3)
- if m == 0 and s == 0:
- if h>22 or h<8:#為了晚上22點之后,上午8點之前不被打擾
- print "continued"
- continue
- if h>12:
- h = h-12
- libbeep.beepAction (0.3,0.5,h)
- time.sleep(1)
- if m == 30 and s == 0:
- if h>22 or h<8:
- print "continued"
- continue
- libbeep.beepAction (0.05,0.05,2)
- time.sleep(1)
為了方便測試,我們可以把系統時間調整接近整點的時刻,在運行腳本,等待整點,感受自己制作的整點報時
使用此命令更改系統時間:
sudo date -s"10:59:57 2015-04-03"
執行腳本: sudo Python alarm.py
最后等待鈴聲響起!