基于stm32處理器的PWM 異步驅(qū)動蜂鳴器
這兩天應(yīng)工作需求研究了一下M3處理器的PWM(脈寬調(diào)制)實現(xiàn)對蜂鳴器的異步控制。鑒于阻塞式對蜂鳴器的控制比較耗時,影響用戶體驗,因此對原有阻塞式控制方案進(jìn)行了改善,提出了異步控制蜂鳴器的實現(xiàn)方法。以下主要對實現(xiàn)中需要注意的重點知識以及所遇到的問題進(jìn)行了討論。
PWM波利用M3的定時器產(chǎn)生,出于對平臺資源的有效利用,選擇定時器1用來輸出脈寬調(diào)制信號。這就引出了本文的重點,M3定時器的應(yīng)用。
M3的定時器資源一共有11個,其中兩個高級定時器(Timer1和Timer8)、4個通用定時器(Timer2-Timer5)、2個普通定時器(Timer6-Timer7)、2個看門狗定時器以及一個SysTick定時器。相對于普通定時器來說,高級定時器的功能更為強大,相對應(yīng)的應(yīng)用自然更為復(fù)雜,這個主要體現(xiàn)在電機控制中,比如直接輸出具有調(diào)節(jié)死區(qū)時間的PWM。不過本項目的應(yīng)用不涉及此點,也就不做討論了。
M3的高級定時器理解為一個可供用戶編程的預(yù)分頻器驅(qū)動16bit的計數(shù)器。主要功能包括利用它的輸入捕獲模式可以實現(xiàn)對輸入信號脈沖寬度的測量,利用PWM和輸出比較模式可以實現(xiàn)波形輸出。
M3具有復(fù)雜的時鐘系統(tǒng),它的外設(shè)都有自己獨立的時鐘控制,這就造成在應(yīng)用上相對比較復(fù)雜一些,但是這為系統(tǒng)在降低功耗方面帶了不小的優(yōu)勢。在實際應(yīng)用中我們可以關(guān)掉那些不用的外設(shè),這樣就可以大大的降低功耗。因此,要想熟練的掌握M3,就必須對它的時鐘樹要很清楚,定時器的應(yīng)用當(dāng)然也不例外。我們就從時鐘開始一步步的揭秘M3定時器的奧妙之處。
高級定時器1的時鐘信號流向通過圖1可以清楚的看到。M3處理器使用外部8M高速時鐘,然后通過內(nèi)部的倍頻因數(shù)為9的鎖相環(huán)將頻率加倍到72M,將此時鐘作為系統(tǒng)時鐘。系統(tǒng)時鐘通過分頻因數(shù)為1的AHB預(yù)分頻器將72M時鐘提供給AHB總線,AHB總線通過分頻因數(shù)為1的APB2預(yù)分頻器將72M的時鐘提供給APB2總線。APB2總線將時鐘通過一個倍頻器,與其他倍頻器不同的是這個倍頻器根據(jù)APB2分頻因數(shù)有系統(tǒng)自動設(shè)置,如果APB2分頻因數(shù)為1,則保持時鐘不變,否則進(jìn)行2倍頻。通過倍頻之后,接將72M的時鐘信號提供給高級定時器1,而時鐘信號在定時器內(nèi)部又通過PSC的分頻來驅(qū)動定時器1的計數(shù)器。我們對定時器的操作實際上主要是通過設(shè)置PSC的分頻值和計數(shù)器的裝載值來達(dá)到準(zhǔn)確的定時和輸出需要的波形等功能。。
圖1 Timer1的時鐘信號流向
理解了定時器的工作原理及時鐘信號工作情況后,我們就來具體分析一下如何應(yīng)用。從上文可以看出要想讓M3的定時器工作首先必須得打開時鐘,因此在系統(tǒng)進(jìn)行初始化后得到72M的時鐘后,打開Timer1的時鐘。這個可以通過設(shè)置PB2ENR寄存器的第二位實現(xiàn),后者也可以利用庫函數(shù)RCC_APB2PeriphClockCmd直接使能。接下來就需要設(shè)置計數(shù)器初始裝載值TIME1_ARR、分頻器PSC,具體設(shè)置根據(jù)公式1進(jìn)行設(shè)置。例如定時器1輸入時鐘為72M時,設(shè)置PSC(預(yù)分頻器)為7199,當(dāng)ARR(計數(shù)器裝載數(shù))為9時,一次中斷我們就可以得1ms的定時。至于怎么配置中斷函數(shù)以及中斷函數(shù)然后編寫此處不做贅述,詳情可以參考STM32中文參考手冊。
Time = (1+ARR)*(1+PSC)/Fsys
公式1 定時器時間計算公式
接下來討論一下PWM的產(chǎn)生,在STM32定時器1-8中除了Timer6和Timer7不能產(chǎn)生PWM外,其它都可以產(chǎn)生。高級定時器1和8可以產(chǎn)生7路的PWM波,其它的可以產(chǎn)生4路。對于波的輸出頻率也利用公式1進(jìn)行計算,至于波的占空比取CCR/ARR。我們以圖2中3路不同占空比的波來看,它們的頻率都一樣約為1.2khz,計算值與測量值存在13hz的誤差,這個是處理器本身的精度造成的。對于第一個波形來說ARR = 59999、CCR = 30000,就得到了約等于1.2Khz且50%占空比的波。而第二個波的ARR = 59999、CCR = 15000,就得到了頻率約為1.2khz且25%占空比的波。
圖2 Time1 PWM波仿真圖
既然需要輸出波對Beep進(jìn)行控制,那么就需要進(jìn)行IO口的設(shè)置,基本IO口的設(shè)置大家應(yīng)該比較清楚,這里只介紹比較容易出錯的地方,這就是關(guān)于管腳重映射,具體設(shè)置見圖表1。由于在本項目中Beep是連接到PA11的,由表1可見PA11沒有完全映像,因此對它只進(jìn)行復(fù)用設(shè)置或者設(shè)置成部分映像。這里對時鐘的設(shè)置除了打開PA口時鐘,還需打開復(fù)用時鐘。
表1 定時器1管腳復(fù)用功能映像
除了以上設(shè)置之外當(dāng)然還有一些基本設(shè)置比如設(shè)置計數(shù)器向上加模式、極性為正、輸出使能、使用PWM模式1或者模式2、使能預(yù)裝載寄存器等基本設(shè)置。
因為要實現(xiàn)異步控制,因此還利用了M3的定時器2,利用定時器2對PWM波的輸出進(jìn)行控制。定時器2的應(yīng)用與1類似,只需配置成定時模式即可。根據(jù)需要定時一定的時間,在中斷處理函數(shù)中關(guān)掉定時器1即可。
轉(zhuǎn)載請注明出處。