GPIO—蜂鸣器
14.1關于蜂鳴器
蜂鳴器是一種常見的電子發聲元器件,采用直流電壓供電,廣泛應用于計算機、打印機、報警器、電子玩具、汽車電子設備等產品中,常見的蜂鳴器可分為有源蜂鳴器和無源蜂鳴器。
有源蜂鳴器:內部有震蕩源,只要通電即可自動發出固定頻率的聲音。
無源蜂鳴器:內部無震蕩源,需要外部脈沖信號驅動發聲,聲音頻率可變。
兩種蜂鳴器實物如圖 14.1.1 所示,從外觀上來看兩種蜂鳴器形狀相似,有源蜂鳴器底部有黑膠密封,無源蜂鳴器底部可看到電路板(圖中綠色部分),兩種蜂鳴器都標注有正負極。
14.2硬件設計
通常蜂鳴器需要的驅動電流比較大,使用GPIO直接驅動蜂鳴器比較吃力,通常使用如圖 14.2.1 所示電路。由GPIO控制三極管通斷,蜂鳴器由系統電源驅動,MCU只需要很小的電流便可控制蜂鳴器。 Q1為NPN三極管,發射極(E)接地,基極(B)接單片機引腳PA8,集電極(C)接蜂鳴器到電源。
當PA8輸出低電平,UBE<Uon,三極管斷開,此時蜂鳴器不工作。
當PA8輸出高電平,UBE>Uon,三極管導通,此時蜂鳴器工作。
14.3軟件設計
14.3.1軟件設計思路
實驗目的:本實驗通過控制GPIO輸出指定頻率,驅動蜂鳴器發聲。
本實驗配套代碼位于“5_程序源碼\7_GPIO—蜂鳴器\”。
14.3.2軟件設計講解
代碼段 14.3.1 蜂鳴器引腳宏定義(driver_buzzer.h)
/********************* * 引腳宏定義 **********************/ #define Buzzer_GPIO_PIN GPIO_PIN_8 #define Buzzer_GPIO_PORT GPIOA #define Buzzer_GPIO_CLK_EN() __HAL_RCC_GPIOA_CLK_ENABLE() /********************* * 函數宏定義 **********************/ #define Buzzer(flag) HAL_GPIO_WritePin(Buzzer_GPIO_PORT, Buzzer_GPIO_PIN, flag?GPIO_PIN_SET:GPIO_PIN_RESET)根據原理圖可知蜂鳴器的控制引腳是PA8,因此引腳組和引腳號分別對應GPIOG、GPIO_PIN_8,引腳
時鐘使能函數是__HAL_RCC_GPIOA_CLK_ENABLE()。對其輸出函數宏定義成接口Buzzer(flag),flag為1時輸出高電平,三極管導通,flag為0時輸出低電平,三極管不導通。
代碼段 14.3.2 蜂鳴器引腳初始化(driver_buzzer.c)
/* * 函數名:void BuzzerInit(void) * 輸入參數:無 * 輸出參數:無 * 返回值:無 * 函數作用:初始化蜂鳴器的引腳 */ void BuzzerInit(void) { // 定義 GPIO 的結構體變量 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能蜂鳴器的 GPIO 對應的時鐘 Buzzer_GPIO_CLK_EN(); GPIO_InitStruct.Pin = Buzzer_GPIO_PIN; // 選擇蜂鳴器的引腳 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 設置為推挽輸出模式 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 引腳反轉速度設置為快 // 初始化引腳配置 HAL_GPIO_Init(Buzzer_GPIO_PORT, &GPIO_InitStruct); // 關閉蜂鳴器 Buzzer(0); }引腳初始化內容與前面LED類似,這里不再贅述。
代碼段 14.3.3 方波輸出函數(driver_buzzer.c)
/* * 函數名:void ControlBuzzerRang(uint16_t period) * 輸入參數:period-蜂鳴器發出響聲的周期,f=1/(2*period) * *輸出參數:無 * 返回值:無 * 函數作用:輸出方波 */ void ControlBuzzerRang(uint16_t period) { Buzzer(1); HAL_Delay(period); Buzzer(0); HAL_Delay(period); }通過HAL_Delay()延時函數來實現方波周期的變換,從而控制PA8輸出方波的頻率來改變蜂鳴器發聲的
響度。
代碼段 14.3.4 蜂鳴器主函數(main.c)
// 初始化蜂鳴器 BuzzerInit(); while(1) { for(i=0; i<10; i++) { ControlBuzzerRang(i); // 蜂鳴器響 i ms,然后不響 i ms,構成一個 1/(2*i)kHz 頻率的蜂鳴器響應 } }首先對蜂鳴器的引腳進行初始化;然后通過一個for()循環改變局部變量i的值使其從0每次遞增1至10,
而這個i就是方波輸出周期的一半。通過改變局部變量i來改變方波的周期,從而改變蜂鳴器的音調。
蜂鳴器實驗本質和LED實驗一樣,生活中很多模塊也一樣,只需要控制GPIO即可控制模塊,實現相應
效果。
這里只是簡單的控制了蜂鳴器供讀者參考,在一些應用中,通過定時器或PWM控制蜂鳴器頻率,實現
播放簡單音樂。
14.4實驗效果
本實驗對應配套資料的“5_程序源碼\7_GPIO—蜂鳴器\”。打開工程后,編譯,下載,可以聽到蜂鳴器
發出聲音。
百問網技術論壇:
http://bbs.100ask.net/
百問網嵌入式視頻官網:
https://www.100ask.net/index
百問網開發板:
淘寶:https://100ask.taobao.com/
天貓:https://weidongshan.tmall.com/
技術交流群(鴻蒙開發/Linux/嵌入式/驅動/資料下載)
QQ群:869222007(已滿)752871361
單片機-嵌入式Linux交流群:
QQ群:536785813
總結
- 上一篇: python中spark有什么功能_Sp
- 下一篇: E-triples II_2019牛客暑