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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【STM32 基础实验蜂鸣器发声】

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32 基础实验蜂鸣器发声】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、認識蜂鳴器
    • (1)蜂鳴器
    • (2)蜂鳴器分類
  • 二、基于stm32f10c8t6 基礎實驗蜂鳴器發聲
    • (1)本實驗蜂鳴器型號說明
    • (2)蜂鳴器發聲原理
    • (3)代碼部分
    • (4)效果展示
  • 三、總結與擴展
      • 附上參考文獻鏈接與視頻鏈接出處

一、認識蜂鳴器

(1)蜂鳴器

蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。

(2)蜂鳴器分類

BUZZER蜂鳴器的分類:
1、按其驅動方式的原理分,可分為:有源蜂鳴器(內含驅動線路,也叫自激式蜂鳴器)和無源蜂鳴器(外部驅動,也叫他激式蜂鳴器);
2、按構造方式的不同,可分為:電磁式蜂鳴器壓電式蜂鳴器
3、按封裝的不同,可分為:DIP BUZZER(插針蜂鳴器)和SMD BUZZER(貼片式蜂鳴器);
4、按電流的不同,可分為:直流蜂鳴器交流蜂鳴器,其中,以直流最為常見壓電式蜂鳴器,用的是壓電材料,即當受到外力導致壓電材料發生形變時壓電材料會產生電荷。同樣,當通電時壓電材料會發生形變。
電磁式蜂鳴器,主要是利用通電導體會產生磁場的特性,用一個固定的永久磁鐵與通電導體產生磁力推動固定在線圈上的鼓膜。
由于兩種蜂鳴器發音原理不同,壓電式結構簡單耐用但音調單一,適用于報警器等設備。而電磁式由于音質好,所以多用于語音、音樂等設備。

二、基于stm32f10c8t6 基礎實驗蜂鳴器發聲

(1)本實驗蜂鳴器型號說明

筆者本次實驗用到的是有源蜂鳴器與無源蜂鳴器,見下圖所示:
有源蜂鳴器模塊:
無源蜂鳴器模塊:

(2)蜂鳴器發聲原理

有源蜂鳴器模塊低電平觸發,通過配置I/O口,給它低電平即可發聲。可見電路圖如下:
有源蜂鳴器電路圖:
無源蜂鳴器模塊,通過配置方波,方波的話可以聯想到PWM,使配置PWM占空比、頻率即可驅動發聲。可見電路圖如下:
無源蜂鳴器電路圖:

然后了解一下PWM
我們就以以STM32單片機為例,其IO口只能輸出高電平和低電平。

假設高電平為5V、低電平則為0V,那么要輸出不同的模擬電壓就要用到PWM。通過改變IO口輸出的方波的占空比,從而獲得使用數字信號模擬成的模擬電壓信號。

電壓是以一種脈沖序列被加到模擬負載上去的,接通時是高電平1,斷開時是低電平0。接通時直流供電輸出,斷開時直流供電斷開。通過對接通和斷開時間的控制,理論上來講,可以輸出任意不大于最大電壓值5V的模擬電壓。

比方說,占空比為50%那就是高電平時間一半,低電平時間一半。在一定的頻率下,就可以得到模擬的2.5V輸出電壓。那么75%的占空比,得到的電壓就是3.75V,如下圖所示。

也就是說,在一定的頻率下,通過不同的占空比即可得到不同大小的輸出模擬電壓,PWM就是通過這種原理實現數字模擬信號轉換的。

PWM應用
以經常使用的呼吸燈舉例。
LED呼吸燈本次實驗也使用了一顆LED來實現呼吸燈,襯托無源蜂鳴器的實驗現象,

一般人眼睛對于80Hz以上刷新頻率則完全沒有閃爍感,那么我們平時見到的LED燈,當它的頻率大于50Hz的時候,人眼就會產生視覺暫留效果,基本就看不到閃爍了,而是誤以為是一個常亮的LED燈。

由于頻率很高時看不到閃爍,占空比越大LED越亮,占空比越小LED越暗。所以,在頻率一定時,可以用不同占空比改變LED燈的亮度,使其達到一個呼吸燈的效果。

(3)代碼部分

有源蜂鳴器部分代碼:(用了一顆LED循環閃爍,表示正在跑程序)
beep.c

#include "sys.h" #include "beep.h"void BEEP_Init(void){GPIO_InitTypeDef GPIO_InitStructure;//聲明結構體——GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//時鐘使能GPIOB//RCC APB2PeriphClockcmd(RCC APB2Periph GPIOB | RCC APB2Periph AFIO,ENABLE); //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//定義引腳pin_8 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//頻率50MhzGPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_8);//低電平觸發所以置位高電平}

main.c

#include "stm32f10x.h" #include "beep.h" #include "delay.h" #include "led.h"int main() {BEEP_Init();delay_init(); LED_Init();while(1){shansuo();GPIO_SetBits(GPIOB,GPIO_Pin_8); delay_ms(500);GPIO_ResetBits(GPIOB,GPIO_Pin_8); delay_ms(500);} } // An highlighted block var foo = 'bar';

無源蜂鳴器部分代碼:(用了一顆LED循環呼吸燈,表示正在跑程序)
pwm.c

#include "stm32f10x.h"void PWM_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//輸出比較的結構體RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//時鐘使能GPIOARCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //復用時開啟//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); //重映射//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //解除PA15調試功能GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_7;//定義引腳pin_0|Pin_15GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出模式,改變引腳控制權給片上外設GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//頻率50MhzGPIO_Init(GPIOA,&GPIO_InitStructure);TIM_InternalClockConfig(TIM2);TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInitStructure.TIM_Period = 100-1; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 計數到20為2ms //ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 720-1; //設置用來作為TIMx時鐘頻率除數的預分頻值 10Khz的計數頻率 //pscTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位TIM_OCStructInit(&TIM_OCInitStructure);//用StructInit賦初始值函數,可避免語法錯誤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 = 0;//輸出比較配置CCR條件碼寄存器 //占空比50% 占空比10% 占空比90% TIM_OC1Init(TIM2,&TIM_OCInitStructure);//查看引腳定義表知道,非重映射默認只有PA0輸出TIM_OC2Init(TIM3,&TIM_OCInitStructure);/*公式:PWM頻率:Freq = CK_PSC/(PSC+1)/(ARR+1)PWM占空比:Doty = CCR/(ARR+1)PWM分辨率:Reso = 1/(ARR+1) */TIM_Cmd(TIM2, ENABLE); //使能TIMx外設TIM_Cmd(TIM3, ENABLE); //使能TIMx外設}void PWM_SetCompare1(uint16_t Compare1)//單獨更改通道1的值對應TIM_OC1Init ,從而改變CCR實現占空比變化 {TIM_SetCompare1(TIM2, Compare1);}void PWM_SetCompare2(uint16_t Compare2)//單獨更改通道1的值對應TIM_OC2Init ,從而改變CCR實現占空比變化 {TIM_SetCompare2(TIM3, Compare2);}

main.c

#include "stm32f10x.h" #include "sys.h" #include "delay.h" #include "pwm.h"uint8_t i;int main(void) { delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);PWM_Init();while(1){for(i=0;i<=100;i++){PWM_SetCompare1(i);PWM_SetCompare2(i);delay_ms(20);}for(i=0;i<=100;i++){PWM_SetCompare1(100-i);PWM_SetCompare2(100-i);delay_ms(20);}} }

(4)效果展示

(聲音可能刺耳,注意調節音量;聲音已做過處理)
實驗現象:有源蜂鳴器發聲鳴叫

有源蜂鳴器


實驗現象:無源蜂鳴器發聲鳴叫

無源蜂鳴器

三、總結與擴展

總結:
根據以上內容,學習有源蜂鳴器,跟LED類似還是容易理解的,給電信號驅動發聲。
無源蜂鳴器主要是應用PWM使能方波,驅動發聲。
針對可能出現的問題,說明一下:
(1)蜂鳴器模塊的觸發的電平與代碼對應
(2)蜂鳴器聲音小,可能是額定電壓或功率不夠,可適當提高電壓;還可能是硬件壞了的問題,或者銅暴露出來導致的短路。
所以要有信心一步步積累理論和實踐經驗,一起學習加油!
擴展:可通過有源蜂鳴器可以做警報、提醒,如聲光報警、人體紅外等實驗。無源蜂鳴器可以做鬧鈴、音樂等實驗。那么就分享到這,大膽嘗試實踐探索吧,歡迎討論。

附上參考文獻鏈接與視頻鏈接出處

鏈接: 參考PWM知乎
鏈接: 參考PWM視頻
鏈接: 有源蜂鳴器視頻
鏈接: 無源蜂鳴器視頻
鏈接: 源碼例程
提取碼:3232

總結

以上是生活随笔為你收集整理的【STM32 基础实验蜂鸣器发声】的全部內容,希望文章能夠幫你解決所遇到的問題。

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