7.1實驗內容
通過本實驗主要學習以下內容:
- PWM輸出功能實現;
- 定時器基本原理;
- 蜂鳴器驅動原理;
7.2實驗原理
7.2.1蜂鳴器驅動原理
蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。比如臺式電腦的主機開機會"滴"一聲、洗衣機按下按鍵及洗衣完成都會有聲響,以上這些聲音都是通過蜂鳴器來發出的。蜂鳴器的驅動方式可分為:有源蜂鳴器(內有驅動線路)和無源蜂鳴器(使用外部驅動)。這里的“源”不是指電源。而是指震蕩源。 也就是說,有源蜂鳴器內部帶震蕩源,所以只要一通電就會叫。而無源內部不帶震蕩源,所以如果用直流信號無法令其鳴叫。必須用2K~5K的方波去驅動它。
有源蜂鳴器不需要外部的激勵源,只需要接入直流電源,即可自動發出聲音(聲音頻率相對固定),它的工作發聲原理是:直流電源輸入經過振蕩系統的放大取樣電路在諧振裝置作用下產生聲音信號。
7.2.2定時器基本原理
GD32F30X系列MCU的timer主要有以下五類,主要包括高級定時器/通用定時器L0/通用定時器L1/通用定時器L2/基本定時器。各個定時器支持的功能可在該表中查閱,其中黑點代表改類型的定時器支持該功能,X代表改類型的定時器不支持該功能。
定時器可支持主從模式,可實現多個定時器級聯,相關定時器的級聯信號說明如下表所示。以TIMER0為例,其觸發信號可以選擇TIMER4_TRGO/TIMER1_TRGO/TIMER2_TRGO/TIMER3_TRGO。
以TIMER1為例,其主要特性如下:
?總通道數:4;
?計數器寬度:16位;
?時鐘源可選:內部時鐘,內部觸發,外部輸入,外部觸發;
?多種計數模式:向上計數,向下計數和中央計數;
?正交編碼器接口:被用來追蹤運動和分辨旋轉方向和位置;
?霍爾傳感器接口:用來做三相電機控制;
?可編程的預分頻器:16位,運行時可以被改變;
?每個通道可配置:輸入捕獲模式,輸出比較模式,可編程的PWM模式,單脈沖模式;
?自動重裝載功能;
?中斷輸出和DMA請求:更新事件,觸發事件,比較/捕獲事件;
?多個定時器的菊鏈使得一個定時器可以同時啟動多個定時器;
?定時器的同步允許被選擇的定時器在同一個時鐘周期開始計數;
?定時器主-從管理。
本例程主要使用TIMER1 PWM模式對蜂鳴器進行驅動,在此簡單介紹PWM輸出功能。
PWM輸出有兩種模式:PWM模式0和PWM模式1,其配置在CHxCOMCTL寄存器中,具體說明如下。
根據計數模式,PWM輸出分為兩種波形:
- EAPWM(邊沿對齊PWM)
EAPWM 的周期由TIMERx_CAR寄存器值決定,占空比由TIMERx_CHxCV寄存器值決定。下圖顯示了EAPWM的輸出波形和中斷。
- CAPWM(中央對齊PWM)
CAPWM 的周期由(2*TIMERx_CAR寄存器值)決定,占空比由(2*TIMERx_CHxCV寄存器值)決定。 下圖顯示了CAPWM的輸出波形和中斷。
7.3硬件設計
蜂鳴器驅動電路如下圖所示,在本例程中,通過BEEP_PWM(PA15)引腳驅動三極管實現蜂鳴器的驅動,當BEEP_PWM輸出高電平時,三極管導通,蜂鳴器鳴叫;當BEEP_PWM輸出低電平時,三極管截斷,蜂鳴器停止鳴叫。
當我們通直流電到有源蜂鳴器的時候,它會發送預設的聲音,通常是連續的蜂鳴聲或間歇的蜂鳴聲等。 工作電壓不變,改變通斷時間,獲得不同的長音,如連續聲,快短聲,慢長聲等。
7.4代碼解析
本例程實現通過調整PWM的周期占空比以及對應PWM輸出的時間,實現不同音調的蜂鳴器播放,進而實現模擬音樂播放的效果,例程中模擬的是孤勇者的音樂。
7.4.1主函數代碼解析
主函數如下所示,主要包括串口/LED初始化,蜂鳴器PWM初始化,TIMER初始化(該timer僅實現基本定時的功能,通過該timer控制蜂鳴器PWM輸出時間),以及啟動蜂鳴器等。
C int main(void) { uint16_t t=0; driver_init(); bsp_uart_init(&BOARD_UART); bsp_led_group_init(); bsp_led_on(&LED0); bsp_led_off(&LED1); bsp_beep_init(1000000,50); TIMER_INT.timer_updata_callback=Music_switch; bsp_timer_init(10000,5000); buzzer_on(); printf("\r\n Bepp music play\r\n"); while(1) { if(int_flag==1) { int_flag=0; t++; bsp_led_toggle(&LED0); printf("\r\n Bepp music play loop %d\r\n",t); } } }
7.4.2蜂鳴器PWM配置函數
蜂鳴器PWM配置函數如下所示,通過調用driver_timer_channel_init底層驅動函數實現對對應TIMER周期和占空比的配置。
C void bsp_beep_init(uint32_t counter_frequency,uint16_t period) { driver_timer_channel_init(&PWM_BEEP,counter_frequency,period); }
PWM_BEEP的定義如下,采用TIMER1的CH0通道進行輸出,引腳為PA15,通過該定義可實現對蜂鳴器相關參數的一站式定義。
C TIMER_CH_DEF(PWM_BEEP,TIMER1,0,TIMER_CH_PWM_HIGH,A,15,AF_PP,GPIO_TIMER1_PARTIAL_REMAP0);
7.4.3基本定時器初始化函數
基本定時器初始化函數如下,啟動了TIMER5作為中斷功能,定時周期為10000個定時器時鐘,其回調函數為Music_switch。
C TIMER_INT.timer_updata_callback=Music_switch; bsp_timer_init(10000,5000); void bsp_timer_init(uint32_t counter_frequency,uint16_t period) { driver_timer_base_int_init(&TIMER_INT,counter_frequency,period); nvic_irq_enable(TIMER5_IRQn,0,0); } TIMER_BASE_DEF(TIMER_INT,TIMER5);
Music_switch的定義如下,該函數在TIMER5的中斷中調用,該函數實現的功能主要為配置修改TIMER5的周期以及蜂鳴器PWM輸出的周期占空比,進而實現對不同音調的播放。
C void Music_switch(void) { static uint16_t i=0; buzzer_set(music[i],12); i++; bsp_timer_init(10000,music[i]*50); i++; if( i==(sizeof(music)/sizeof(music[0])) ) { i=0; bsp_led_toggle(&LED1); int_flag=1; } }
音樂的相關數據定義在music數組中,其參數含義如下:M6代表蜂鳴器PWM的周期,下一個50代表該PWM輸出的時間(對應TIEMR5的周期),以上兩個數據一組,后面的數據類似。
C uint16_t music[]= { // //這一路上走走停停 順著少年漂流的痕跡 // M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,25,M3,25,M2,25,M1,25,L6,100,Z0,10, // //邁出車站的前一刻 竟有些猶豫 // M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M3,25,M2,50,M1,50,M2,100,Z0,50, // //不僅笑著這近鄉情怯 仍無法避免 // M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M3,25,M2,50,M1,50,L6,100,Z0,10, // //而長野的天 依舊那么暖 風吹起了從前 // M3,25,M2,25,M1,25,M2,25,M1,100, M3,25,M2,25,M1,25,M2,25,M1,50,M1,50, M5,25,M3,25,M2,25,M1,25,M2,25,M1,100,M1,150,Z0,30, // //從前初識這世間 萬般留戀 看著天邊似在眼前 也甘愿赴湯蹈火去走它一遍 // M1,50,M2,50,M3,50,M1,50,M6,50,M5,25,M6,25,M6,50,M6,50, M1,25,M7,50,M6,25,M7,25,M7,100,Z0,5, M7,50,M6,25,M7,25,M7,50,M3,50,H1,25,H2,25,H1,25,M7,25,M6,50,M5,50, M6,50,M5,25,M6,25,M6,25,M5,25,M6,25,M5,25,M6,50,M5,25,M2,25,M2,25,M5,50,M5,50,M3,100,M3,100,Z0,25, // //如今走過這世間 萬般留戀 翻過歲月不同側臉 措不及防闖入你的笑顏 // M1,50,M2,50,M3,50,M1,50,M6,50,M5,25,M6,25,M6,50,M6,50, M1,25,M7,50,M6,25,M7,25,M7,100,Z0,5, M7,50,M6,25,M7,25,M7,50,M3,50,H1,25,H2,25,H1,25,M7,25,M6,50,M5,50, M6,50,H3,25,H3,25,H3,50,M5,50,M6,50,H3,25,H3,25,H3,25,M5,50,M6,25,M6,100,M6,100,M6,100,Z0,25, // //我曾難自拔與世界之大 也沉溺于其中夢話 // H1,50,H2,50,H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H2,25,H3,25,H3,50, H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,25,H3,50,H3,50, // //不得真假 不做掙扎 不懼笑話 // H2,50,H1,25,M6,25,M6,25,H1,50, M6,25,H2,25,H1,25,M6,50,M6,25,H1,50,H1,50, H3,100,H3,25,H4,25,H3,50,H3,25,H2,50,H2,50,Z0,25, // //我曾將青春翻涌成她 也曾指尖彈出盛夏 心之所動且就隨緣去吧 // H1,50,H2,50,H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H2,50, H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H3,50,H3,50, H2,50,H1,25,M6,25,M6,25,H3,50,H3,50, H2,50,H1,25,M6,25,M6,25,H1,50,H1,50,H1,100,H1,100,Z0,10, // //逆著光行走任風吹雨打吧 // M6,25,H3,50,H3,50,H2,50,H1,25,M6,25,M6,25,H3,50,H2,50,H1,25,M6,25,M6,25,H1,50,H1,50,H1,50,H1,100,Z0,10, M6,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10, //愛你孤身走暗巷 H1,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10, //愛你不跪的模樣 H1,50,H2,50,H3,50,H2,50,H3,50,H2,50,H3,100,H3,50,H3,50,H2,50,H3,100,H5,100,H3,100,Z0,10 //愛你對峙過絕望不肯哭一場 };
7.5實驗結果
將本例程燒錄到紅楓派開發板中,運行后將會通過蜂鳴器聽到相關音樂
-
單片機
+關注
關注
6037文章
44558瀏覽量
635357 -
PWM
+關注
關注
114文章
5186瀏覽量
213958 -
蜂鳴器
+關注
關注
12文章
891瀏覽量
45949 -
Timer
+關注
關注
1文章
64瀏覽量
12788 -
GD32
+關注
關注
7文章
403瀏覽量
24353
發布評論請先 登錄
相關推薦
評論