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)?,蜂鳴器停止鳴叫。
當(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)音樂,具體可聽以下視頻聲音。
相關(guān)實(shí)驗(yàn)視頻,請(qǐng)看飛書文檔
紅楓派開發(fā)板使用手冊(cè):??????????????????????????????????????????????????GD32F303紅楓派使用手冊(cè) - 飛書云文檔 (feishu.cn)