
7.1實(shí)驗(yàn)內(nèi)容
通過(guò)本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:
- PWM輸出功能實(shí)現(xiàn);
- 定時(shí)器基本原理;
- 蜂鳴器驅(qū)動(dòng)原理;
7.2實(shí)驗(yàn)原理
7.2.1蜂鳴器驅(qū)動(dòng)原理
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。比如臺(tái)式電腦的主機(jī)開機(jī)會(huì)"滴"一聲、洗衣機(jī)按下按鍵及洗衣完成都會(huì)有聲響,以上這些聲音都是通過(guò)蜂鳴器來(lái)發(fā)出的。蜂鳴器的驅(qū)動(dòng)方式可分為:有源蜂鳴器(內(nèi)有驅(qū)動(dòng)線路)和無(wú)源蜂鳴器(使用外部驅(qū)動(dòng))。這里的“源”不是指電源。而是指震蕩源。 也就是說(shuō),有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會(huì)叫。而無(wú)源內(nèi)部不帶震蕩源,所以如果用直流信號(hào)無(wú)法令其鳴叫。必須用2K~5K的方波去驅(qū)動(dòng)它。
有源蜂鳴器不需要外部的激勵(lì)源,只需要接入直流電源,即可自動(dòng)發(fā)出聲音(聲音頻率相對(duì)固定),它的工作發(fā)聲原理是:直流電源輸入經(jīng)過(guò)振蕩系統(tǒng)的放大取樣電路在諧振裝置作用下產(chǎn)生聲音信號(hào)。
7.2.2定時(shí)器基本原理
GD32F30X系列MCU的timer主要有以下五類,主要包括高級(jí)定時(shí)器/通用定時(shí)器L0/通用定時(shí)器L1/通用定時(shí)器L2/基本定時(shí)器。各個(gè)定時(shí)器支持的功能可在該表中查閱,其中黑點(diǎn)代表改類型的定時(shí)器支持該功能,X代表改類型的定時(shí)器不支持該功能。

定時(shí)器可支持主從模式,可實(shí)現(xiàn)多個(gè)定時(shí)器級(jí)聯(lián),相關(guān)定時(shí)器的級(jí)聯(lián)信號(hào)說(shuō)明如下表所示。以TIMER0為例,其觸發(fā)信號(hào)可以選擇TIMER4_TRGO/TIMER1_TRGO/TIMER2_TRGO/TIMER3_TRGO。

以TIMER1為例,其主要特性如下:
?總通道數(shù):4;
?計(jì)數(shù)器寬度:16位;
?時(shí)鐘源可選:內(nèi)部時(shí)鐘,內(nèi)部觸發(fā),外部輸入,外部觸發(fā);
?多種計(jì)數(shù)模式:向上計(jì)數(shù),向下計(jì)數(shù)和中央計(jì)數(shù);
?正交編碼器接口:被用來(lái)追蹤運(yùn)動(dòng)和分辨旋轉(zhuǎn)方向和位置;
?霍爾傳感器接口:用來(lái)做三相電機(jī)控制;
?可編程的預(yù)分頻器:16位,運(yùn)行時(shí)可以被改變;
?每個(gè)通道可配置:輸入捕獲模式,輸出比較模式,可編程的PWM模式,單脈沖模式;
?自動(dòng)重裝載功能;
?中斷輸出和DMA請(qǐng)求:更新事件,觸發(fā)事件,比較/捕獲事件;
?多個(gè)定時(shí)器的菊鏈?zhǔn)沟靡粋€(gè)定時(shí)器可以同時(shí)啟動(dòng)多個(gè)定時(shí)器;
?定時(shí)器的同步允許被選擇的定時(shí)器在同一個(gè)時(shí)鐘周期開始計(jì)數(shù);
?定時(shí)器主-從管理。
本例程主要使用TIMER1 PWM模式對(duì)蜂鳴器進(jìn)行驅(qū)動(dòng),在此簡(jiǎn)單介紹PWM輸出功能。
PWM輸出有兩種模式:PWM模式0和PWM模式1,其配置在CHxCOMCTL寄存器中,具體說(shuō)明如下。

根據(jù)計(jì)數(shù)模式,PWM輸出分為兩種波形:
- EAPWM(邊沿對(duì)齊PWM)
EAPWM 的周期由TIMERx_CAR寄存器值決定,占空比由TIMERx_CHxCV寄存器值決定。下圖顯示了EAPWM的輸出波形和中斷。

- CAPWM(中央對(duì)齊PWM)
CAPWM 的周期由(2*TIMERx_CAR寄存器值)決定,占空比由(2*TIMERx_CHxCV寄存器值)決定。 下圖顯示了CAPWM的輸出波形和中斷。

7.3硬件設(shè)計(jì)
蜂鳴器驅(qū)動(dòng)電路如下圖所示,在本例程中,通過(guò)BEEP_PWM(PA15)引腳驅(qū)動(dòng)三極管實(shí)現(xiàn)蜂鳴器的驅(qū)動(dòng),當(dāng)BEEP_PWM輸出高電平時(shí),三極管導(dǎo)通,蜂鳴器鳴叫;當(dāng)BEEP_PWM輸出低電平時(shí),三極管截?cái)啵澍Q器停止鳴叫。

當(dāng)我們通直流電到有源蜂鳴器的時(shí)候,它會(huì)發(fā)送預(yù)設(shè)的聲音,通常是連續(xù)的蜂鳴聲或間歇的蜂鳴聲等。 工作電壓不變,改變通斷時(shí)間,獲得不同的長(zhǎng)音,如連續(xù)聲,快短聲,慢長(zhǎng)聲等。
7.4代碼解析
本例程實(shí)現(xiàn)通過(guò)調(diào)整PWM的周期占空比以及對(duì)應(yīng)PWM輸出的時(shí)間,實(shí)現(xiàn)不同音調(diào)的蜂鳴器播放,進(jìn)而實(shí)現(xiàn)模擬音樂播放的效果,例程中模擬的是孤勇者的音樂。
7.4.1主函數(shù)代碼解析
主函數(shù)如下所示,主要包括串口/LED初始化,蜂鳴器PWM初始化,TIMER初始化(該timer僅實(shí)現(xiàn)基本定時(shí)的功能,通過(guò)該timer控制蜂鳴器PWM輸出時(shí)間),以及啟動(dòng)蜂鳴器等。
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配置函數(shù)
蜂鳴器PWM配置函數(shù)如下所示,通過(guò)調(diào)用driver_timer_channel_init底層驅(qū)動(dòng)函數(shù)實(shí)現(xiàn)對(duì)對(duì)應(yīng)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通道進(jìn)行輸出,引腳為PA15,通過(guò)該定義可實(shí)現(xiàn)對(duì)蜂鳴器相關(guān)參數(shù)的一站式定義。
C TIMER_CH_DEF(PWM_BEEP,TIMER1,0,TIMER_CH_PWM_HIGH,A,15,AF_PP,GPIO_TIMER1_PARTIAL_REMAP0);
7.4.3基本定時(shí)器初始化函數(shù)
基本定時(shí)器初始化函數(shù)如下,啟動(dòng)了TIMER5作為中斷功能,定時(shí)周期為10000個(gè)定時(shí)器時(shí)鐘,其回調(diào)函數(shù)為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的定義如下,該函數(shù)在TIMER5的中斷中調(diào)用,該函數(shù)實(shí)現(xiàn)的功能主要為配置修改TIMER5的周期以及蜂鳴器PWM輸出的周期占空比,進(jìn)而實(shí)現(xiàn)對(duì)不同音調(diào)的播放。
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; } }
音樂的相關(guān)數(shù)據(jù)定義在music數(shù)組中,其參數(shù)含義如下:M6代表蜂鳴器PWM的周期,下一個(gè)50代表該P(yáng)WM輸出的時(shí)間(對(duì)應(yīng)TIEMR5的周期),以上兩個(gè)數(shù)據(jù)一組,后面的數(shù)據(jù)類似。
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, // //不僅笑著這近鄉(xiāng)情怯 仍無(wú)法避免 // 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, // //而長(zhǎng)野的天 依舊那么暖 風(fēng)吹起了從前 // 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, // //從前初識(shí)這世間 萬(wàn)般留戀 看著天邊似在眼前 也甘愿赴湯蹈火去走它一遍 // 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, // //如今走過(guò)這世間 萬(wàn)般留戀 翻過(guò)歲月不同側(cè)臉 措不及防闖入你的笑顏 // 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, // //我曾難自拔與世界之大 也沉溺于其中夢(mèng)話 // 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, // //我曾將青春翻涌成她 也曾指尖彈出盛夏 心之所動(dòng)且就隨緣去吧 // 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, // //逆著光行走任風(fēng)吹雨打吧 // 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 //愛你對(duì)峙過(guò)絕望不肯哭一場(chǎng) };
7.5實(shí)驗(yàn)結(jié)果
將本例程燒錄到紅楓派開發(fā)板中,運(yùn)行后將會(huì)通過(guò)蜂鳴器聽到相關(guān)音樂
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6071文章
45257瀏覽量
660111 -
PWM
+關(guān)注
關(guān)注
116文章
5808瀏覽量
222526 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
896瀏覽量
47468 -
Timer
+關(guān)注
關(guān)注
1文章
64瀏覽量
13415 -
GD32
+關(guān)注
關(guān)注
7文章
427瀏覽量
26608
發(fā)布評(píng)論請(qǐng)先 登錄
【星空派GD32F303開發(fā)板試用體驗(yàn)】開發(fā)記錄匯總
【星空派GD32F303開發(fā)板試用體驗(yàn)】開箱+環(huán)境搭建
【星空派GD32F303開發(fā)板試用體驗(yàn)】開箱+環(huán)境搭建
【星空派GD32F303開發(fā)板試用體驗(yàn)】+板卡概覽
星空派GD32F303開發(fā)板的相關(guān)資料下載
STM32CUBEMX開發(fā)GD32F303(12)----輸出PWM及修改PWM頻率與占空比

GD32F303固件庫(kù)開發(fā)(12)----輸出PWM及修改PWM頻率與占空比

STM32CUBEMX開發(fā)GD32F303(14)----IIC之配置OLED

GD32F303固件庫(kù)開發(fā)

【GD32F303紅楓派開發(fā)板使用手冊(cè)】第二講 GPIO-流水燈實(shí)驗(yàn)

【GD32F303紅楓派開發(fā)板使用手冊(cè)】第三講 GPIO-按鍵查詢檢測(cè)實(shí)驗(yàn)

【GD32F303紅楓派開發(fā)板使用手冊(cè)】第五講 FMC-片內(nèi)Flash擦寫讀實(shí)驗(yàn)

【GD32F303紅楓派開發(fā)板使用手冊(cè)】第十六講 USART-DMA串口收發(fā)實(shí)驗(yàn)

【GD32F303紅楓派開發(fā)板使用手冊(cè)】第二十講 SPI-SPI NAND FLASH讀寫實(shí)驗(yàn)

評(píng)論