天天看點

STM32之PWM君

     pwm、、英語好的人估計又知道這三個大寫字母代表哪三個英語單詞了、小弟不才,就說中文意思好了:脈沖寬度調制,玩過飛思卡爾的人估計對pwm非常的不陌生吧、電機驅動需要pwm,控制舵機的轉向需要pwm,總之、可以說,pwm,you

are so good。

 好了、、言歸正傳,廣大的網際網路的網友們,咱們又見面了,大家早上晚上中午好好好、額、、好像也沒見過面,stm32的pwm,可謂是小強中的小強,stm32的pwm,就是由定時器産生的,但是奇怪的是除了定時器tim6和tim7不能産生pwm外,其他的定時器都可以産生,而且還有多路之分,“進階官員”tim1和tim8說:老子可以産生多達7路,而其他的定時器默默的哀傷,因為自己最多隻能産生4路(四個通道)。

上篇部落格介紹了幾位寄存器大神(http://www.cnblogs.com/alvis-jing/p/3691901.html),請把他們的腳步繼續留下,因為還需用到,如不肯留,給他們最殘酷的懲罰:金錢美女伺候、好了,言歸正傳,接下來,為了誕生pwm,我們還将有請以下的幾位寄存器大神(由于大神們都比較低調,在此就不隆重介紹了,大家有興趣的找下“葵花兄”)

注:對于寄存器,本部落格就不再深入的講解,大家也可以參照stm32的參考手冊,因為本部落格講解的是思路和用庫函數,是以就不再細講寄存器,請見諒

1、捕獲/比較模式寄存器1(timx_ccmr1)

2、捕獲/比較使能寄存器(timx_ccer)

3、捕獲/比較寄存器2(timx_ccr2)

那好,我們該怎麼利用定時器來産生pwm呢??再此之前,我們來了解産生pwm的背後那不為人知的秘密:

脈沖寬度調制模式可以産生一個由timx_arr寄存器确定頻率、由timx_ccrx寄存器确定占空比的信号。

  在timx_ccmrx寄存器中的ocxm位寫入’110’(pwm模式1)或’111’(pwm模式2),能夠獨立地設定每個ocx輸出通道産生一路pwm。必須設定timx_ccmrx寄存器ocxpe位以使能相應的預裝載寄存器,(請注意這句話!!!!)最後還要設定timx_cr1寄存器的arpe位,(在向上計數或中心對稱模式中)使能自動重裝載的預裝載寄存器。

  在pwm模式(模式1或模式2)下,timx_cnt和timx_ccrx始終在進行比較,(依據計數器的計數方向)以确定是否符合timx_ccrx≤timx_cnt或者timx_cnt≤timx_ccrx。

 是以,該寄存器的值一直與cnt比較,根據比較結果産生相應的動作,利用這裡一點,我們通過修改這個寄存器的值,就可以控制pwm的輸出脈寬了,(在這裡有專門的庫函數可以操作,是以是相當友善)

那怎麼操作呢??在這裡,我們通過一直沒有提過的非常重要的概念:重映射,把tim3_ch2的pa7重映射到pb5,而pb5是連接配接led的,是以我們可以通過觀察led的亮度才體驗pwm、、也難為了led君,老是被觀察,臉也不紅下、、

所謂的重映射,就是把原本預設的引腳給誘惑到另一個引腳上,專業上給的是重映射,但是我覺得并非這麼簡單、果然,它還有一個功能:複用、、是以第一步:

我們要打開複用的時鐘和把io口設成複用推挽輸出,當然也要打開tim3的時鐘,見代碼:(映射有部分映射和全部映射,都有可用的函數,在這裡我們是部分映射,但是,映射了一個引腳,另外的引腳也被牽扯下來了,哎)

    接下來:

通用計時器的初始化:(由于上篇部落格已講解,在這就不細講了哈,請見諒哈http://www.cnblogs.com/alvis-jing/p/3691901.html)請看代碼:

     接下來,就是pwm的重頭戲了,在這裡,我們要設定tim3_ch2為pwm模式,(注意,由于tim3可以産生四路pwm,每路都有不同的但類似的函數來控制)在這裡,我們是通過

    void tim_oc2init(tim_typedef* timx,

tim_ocinittypedef* tim_ocinitstruct)來實作的

打開"stm32f10x_tim.h"可以看到,在這裡,我們隻顯示一些跟我們有用的參數: 

tim_ocmode輸出模式;—>pwm2

tim_outputstate輸出使能;—>使能pwm

tim_ocpolarity輸出極性;—>極性為高           代碼如下:

     接下來,最關鍵的一步也是最容易遺漏的:就是使能預裝載寄存器,在這裡我們通過庫函數

    tim_oc2preloadconfig

    使能或者失能timx在ccr2上的預裝載寄存器   請看代碼:

 好了,最後一步,我們開啟定時器tim3,這個大家也不陌生了吧、、還是老規矩;知道的,來人,賞美女十個,還不知道的,拉出去調戲十分鐘 

親、、在這裡、、你覺得你能看到led從暗到亮了嗎??你想看,led君還不肯呢、沒錯了、、但這是為什麼呢??

原因就是這裡設定産生的pwn是固定脈寬的、、那我們怎麼來改變它呢??咦、庫函數為我們提供了這樣的一個好機會:

tim_setcompare2   設定timx捕獲比較2寄存器值

通過這個函數我們就可以設定脈沖寬度,進而控制pwm了、、代碼如下:

    好了,我們來總結下步驟:

    1、開啟tim3定時器的時鐘,如果有複用,也要打開複用的時鐘。

    2、初始化tim3

    3、設定tim3_ch2的pwm模式,并使能其輸出(注:要使能預裝載寄存器)

    4、開啟tim3

    5、改變脈沖寬度,進而改變pwm

 少了一些自認為是幽默風趣的語言、、為了是讓自己不再顯得那麼吊兒郎當、、這篇部落格在這又到了尾聲、、本人也在學習階段、、盡量把自己當成讀者,讓讀者看得懂、、有寫錯之處望指出來、不勝感激、、希望能對你有了解上的幫助、、