日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GPIO—蜂鸣器

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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輸出指定頻率,驅動蜂鳴器發聲。

  • 引腳初始化:GPIO端口時鐘使能、GPIO引腳設置為輸出(PA8);
  • 封裝蜂鳴器函數:其中方波周期的延時,使用HAL庫延時函數HAL_Delay()實現;
  • 主函數改變方波的延時時間(即改變其周期),控制蜂鳴器聲音;
  • 本實驗配套代碼位于“5_程序源碼\7_GPIO—蜂鳴器\”。

    14.3.2軟件設計講解

  • GPIO選擇與接口定義
  • 代碼段 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時輸出低電平,三極管不導通。

  • GPIO初始化
  • 代碼段 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

    總結

    以上是生活随笔為你收集整理的GPIO—蜂鸣器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。