7.1 實驗內(nèi)容
通過本實驗主要學(xué)習(xí)以下內(nèi)容:
? PWM輸出功能實現(xiàn);
? 定時器基本原理;
? 蜂鳴器驅(qū)動原理;
7.2 實驗原理
7.2.1 蜂鳴器驅(qū)動原理
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計算機、打印機、復(fù)印機、報警器、電子玩具、汽車電子設(shè)備、電話機、定時器等電子產(chǎn)品中作發(fā)聲器件。比如臺式電腦的主機開機會"滴"一聲、洗衣機按下按鍵及洗衣完成都會有聲響,以上這些聲音都是通過蜂鳴器來發(fā)出的。蜂鳴器的驅(qū)動方式可分為:有源蜂鳴器(內(nèi)有驅(qū)動線路)和無源蜂鳴器(使用外部驅(qū)動)。這里的“源”不是指電源。而是指震蕩源。 也就是說,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會叫。而無源內(nèi)部不帶震蕩源,所以如果用直流信號無法令其鳴叫。必須用2K~5K的方波去驅(qū)動它。
有源蜂鳴器不需要外部的激勵源,只需要接入直流電源,即可自動發(fā)出聲音(聲音頻率相對固定),它的工作發(fā)聲原理是:直流電源輸入經(jīng)過振蕩系統(tǒng)的放大取樣電路在諧振裝置作用下產(chǎn)生聲音信號。
7.2.2 定時器基本原理
GD32F30X系列MCU的timer主要有以下五類,主要包括高級定時器/通用定時器L0/通用定時器L1/通用定時器L2/基本定時器。各個定時器支持的功能可在該表中查閱,其中黑點代表改類型的定時器支持該功能,X代表改類型的定時器不支持該功能。
定時器可支持主從模式,可實現(xiàn)多個定時器級聯(lián),相關(guān)定時器的級聯(lián)信號說明如下表所示。以TIMER0為例,其觸發(fā)信號可以選擇TIMER4_TRGO/TIMER1_TRGO/TIMER2_TRGO/TIMER3_TRGO。
以TIMER1為例,其主要特性如下:
? 總通道數(shù): 4;
? 計數(shù)器寬度: 16位;
? 時鐘源可選:內(nèi)部時鐘,內(nèi)部觸發(fā),外部輸入,外部觸發(fā);
? 多種計數(shù)模式:向上計數(shù),向下計數(shù)和中央計數(shù);
? 正交編碼器接口:被用來追蹤運動和分辨旋轉(zhuǎn)方向和位置;
? 霍爾傳感器接口:用來做三相電機控制;
? 可編程的預(yù)分頻器: 16位,運行時可以被改變;
? 每個通道可配置:輸入捕獲模式,輸出比較模式,可編程的PWM模式,單脈沖模式;
? 自動重裝載功能;
? 中斷輸出和DMA請求:更新事件,觸發(fā)事件,比較/捕獲事件;
? 多個定時器的菊鏈使得一個定時器可以同時啟動多個定時器;
? 定時器的同步允許被選擇的定時器在同一個時鐘周期開始計數(shù);
? 定時器主-從管理。
本例程主要使用TIMER1 PWM模式對蜂鳴器進行驅(qū)動,在此簡單介紹PWM輸出功能。
PWM輸出有兩種模式:PWM模式0和PWM模式1,其配置在CHxCOMCTL寄存器中,具體說明如下。
根據(jù)計數(shù)模式,PWM輸出分為兩種波形:
? EAPWM(邊沿對齊 PWM)
EAPWM 的周期由 TIMERx_CAR 寄存器值決定,占空比由 TIMERx_CHxCV 寄存器值決定。下圖顯示了 EAPWM 的輸出波形和中斷。
? CAPWM(中央對齊PWM)
CAPWM 的周期由(2*TIMERx_CAR 寄存器值)決定,占空比由(2*TIMERx_CHxCV 寄存器值)決定。 下圖顯示了 CAPWM 的輸出波形和中斷。
7.3 硬件設(shè)計
蜂鳴器驅(qū)動電路如下圖所示,在本例程中,通過BEEP_PWM(PA15)引腳驅(qū)動三極管實現(xiàn)蜂鳴器的驅(qū)動,當BEEP_PWM輸出高電平時,三極管導(dǎo)通,蜂鳴器鳴叫;當BEEP_PWM輸出低電平時,三極管截斷,蜂鳴器停止鳴叫。
當我們通直流電到有源蜂鳴器的時候,它會發(fā)送預(yù)設(shè)的聲音,通常是連續(xù)的蜂鳴聲或間歇的蜂鳴聲等。 工作電壓不變,改變通斷時間,獲得不同的長音,如連續(xù)聲,快短聲,慢長聲等。
7.4 代碼解析
本例程實現(xiàn)通過調(diào)整PWM的周期占空比以及對應(yīng)PWM輸出的時間,實現(xiàn)不同音調(diào)的蜂鳴器播放,進而實現(xiàn)模擬音樂播放的效果,例程中模擬的是孤勇者的音樂。
7.4.1 主函數(shù)代碼解析
主函數(shù)如下所示,主要包括串口/LED初始化,蜂鳴器PWM初始化,TIMER初始化(該timer僅實現(xiàn)基本定時的功能,通過該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配置函數(shù)
蜂鳴器PWM配置函數(shù)如下所示,通過調(diào)用driver_timer_channel_init底層驅(qū)動函數(shù)實現(xiàn)對對應(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通道進行輸出,引腳為PA15,通過該定義可實現(xiàn)對蜂鳴器相關(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ù)如下,啟動了TIMER5作為中斷功能,定時周期為10000個定時器時鐘,其回調(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ù)實現(xiàn)的功能主要為配置修改TIMER5的周期以及蜂鳴器PWM輸出的周期占空比,進而實現(xiàn)對不同音調(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的周期,下一個50代表該PWM輸出的時間(對應(yīng)TIEMR5的周期),以上兩個數(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)情怯 仍無法避免
// ???????????????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,
// ???????????????//而長野的天 依舊那么暖 風(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,
// ???????????????//從前初識這世間 萬般留戀 看著天邊似在眼前 也甘愿赴湯蹈火去走它一遍
// ???????????????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,
// ???????????????//如今走過這世間 萬般留戀 翻過歲月不同側(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,
// ???????????????//我曾難自拔與世界之大 也沉溺于其中夢話
// ???????????????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,
// ???????????????//逆著光行走任風(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 //愛你對峙過絕望不肯哭一場
};
7.5 實驗結(jié)果
將本例程燒錄到紅楓派開發(fā)板中,運行后將會通過蜂鳴器聽到相關(guān)音樂,具體可聽以下視頻聲音。
相關(guān)實驗視頻,請看飛書文檔
紅楓派開發(fā)板使用手冊:??????????????????????????????????????????????????GD32F303紅楓派使用手冊 - 飛書云文檔 (feishu.cn)