一般來(lái)講,一個(gè)STM32定時(shí)器輸出基于同一頻率的各路信號(hào)比較方便。但經(jīng)常也會(huì)有人問(wèn)使用STM32一個(gè)定時(shí)器是否可以實(shí)現(xiàn)多路不同頻率的輸出。從實(shí)現(xiàn)這個(gè)功能角度來(lái)講,答案是肯定的,并可以滿足相應(yīng)的應(yīng)用需求。
這里利用STM32G4的Nucleo開(kāi)發(fā)板進(jìn)行一個(gè)簡(jiǎn)單的實(shí)現(xiàn)示例,順便交流和分享些思路,以拓寬STM32定時(shí)器的應(yīng)用場(chǎng)景。示例中使用STM32定時(shí)器輸出模式中的比較切換模式,即Toggle模式,結(jié)合定時(shí)器的比較事件及DMA傳輸來(lái)完成。
我使用STM32G431RB片內(nèi)TIM1,通過(guò)它實(shí)現(xiàn)4路不同頻率的PWM輸出,分別是20KHz,50KHz,70KHz,80KHz,讓TIM1運(yùn)行在10Khz的循環(huán)計(jì)數(shù)狀態(tài)。TIMER的計(jì)數(shù)時(shí)鐘源為170Mhz,沒(méi)有對(duì)時(shí)鐘進(jìn)行分頻。
基于上述條件,TIM1的10KHz更新頻率所對(duì)應(yīng)的計(jì)數(shù)脈沖個(gè)數(shù)則為17000,那么,20KHz、50KHz、70KHz、80KHz所對(duì)應(yīng)的計(jì)數(shù)脈沖個(gè)數(shù)分別是8500、3400、2428、2125,分別對(duì)應(yīng)著TIM1四個(gè)通道CH1/CH2/CH3/CH4的PWM輸出?!究蓞⒖枷旅姹砀瘛?/p>
現(xiàn)在開(kāi)始使用STM32CubeMx進(jìn)行初始化配置。TIM1的時(shí)基配置如下:
將TIM1的CH1/CH2/CH3/CH4的比較輸出模式配置為匹配切換模式。這里關(guān)閉了CCR寄存器的預(yù)裝功能。
上圖中綠色圓圈里的用于比較的初始數(shù)據(jù),依據(jù)不同通道的占空比來(lái)擬定,不是很重要,只會(huì)影響到第一個(gè)脈沖的占空比。當(dāng)然,也不能亂寫(xiě)。【為什么呢,請(qǐng)自行思考下】
再來(lái)看看有關(guān)DMA的配置,4個(gè)通道都開(kāi)啟了基于比較事件的DMA觸發(fā)請(qǐng)求,并使用循環(huán)傳輸模式。
基于CubeMx配置完成后,生成初始化工程代碼。
下面進(jìn)行用戶代碼的添加和整理。假設(shè)四個(gè)通道輸出的占空比分別為70%,70%,40%,40%。為了實(shí)現(xiàn)4路不同輸出頻率及占空比的波形,需擬定一些用于比較切換的數(shù)據(jù),借助各個(gè)通道的比較事件觸發(fā)DMA,讓DMA適時(shí)修改相應(yīng)通道的比較寄存器的值,即修改CCRx的值?!具@個(gè)地方的實(shí)現(xiàn)原理很難一兩句完全寫(xiě)清楚,有興趣的請(qǐng)先了解STM32定時(shí)器的比較切換模式,再結(jié)合DMA傳輸琢磨琢磨。下面表格是實(shí)現(xiàn)上面輸出需要用到的一些數(shù)據(jù)?!?/p>
結(jié)合上述表格的數(shù)據(jù),定義一些宏參數(shù)和內(nèi)存數(shù)組。內(nèi)存數(shù)組用來(lái)存放各個(gè)通道不同時(shí)刻的比較值?!颈鞠敕旁创a文本上來(lái)的,因?yàn)榭赡苡腥诵枰?yàn)證測(cè)試。但這里實(shí)在不好排版,只能貼圖了。抱歉!】
上面的四個(gè)數(shù)組分別對(duì)應(yīng)四個(gè)通道做比較切換輸出時(shí)需用到的比較值。這些數(shù)據(jù)的擬定需好好琢磨下。我剛開(kāi)始在代碼里都是放的具體數(shù)據(jù),但考慮到不太好理解各個(gè)數(shù)據(jù)的含義。我這里特意將它們改成宏替換,旨在以宏替換的形式順便做個(gè)比較直觀的注釋,希望幫到有需要或感興趣的工程師。
接下來(lái)添加具體的功能實(shí)現(xiàn)代碼。代碼不多,很簡(jiǎn)單,都是基于HAL庫(kù)的??吹胶瘮?shù)名就大致知道什么意思了。下面的代碼就是本示例中用到功能代碼。它們的功能分別是使能相關(guān)定時(shí)器通道的比較輸出事件;開(kāi)啟基于定時(shí)器比較事件的DMA傳輸并完成相關(guān)配置;使能各個(gè)定時(shí)器通道比較事件的DMA請(qǐng)求;使能TIM1的主輸出功能并開(kāi)啟計(jì)數(shù)器的工作。
編譯調(diào)試整理后,運(yùn)行程序查看結(jié)果.
從上面示波器測(cè)得結(jié)果來(lái)看,輸出波形滿足前面提到的設(shè)計(jì)要求。頻率、占空比跟我們?cè)O(shè)計(jì)要求的一致。【注:手機(jī)模式下可點(diǎn)擊圖片放大查看】
在上面代碼的基礎(chǔ)上,我保持4個(gè)通道輸出的脈沖頻率不變,對(duì)各自占空比做下調(diào)整,分別調(diào)整為30%,30%,60%,60%【在上面代碼里只需調(diào)整那幾個(gè)Dutyn值】,顯然也能很好地實(shí)現(xiàn)各自的輸出。波形圖如下:
在上面示例中,我將TIM1的10Khz更新頻率做為配置CH1~CH4四個(gè)通道輸出的一個(gè)參考或基準(zhǔn)。既然一個(gè)定時(shí)器可以實(shí)現(xiàn)4路不同頻率,那么多個(gè)定時(shí)器實(shí)現(xiàn)更多不同頻率的PWM輸出也就不難了。
關(guān)于使用1個(gè)定時(shí)器實(shí)現(xiàn)多路不同頻率輸出的示例就介紹到這里。本質(zhì)上它是基于定時(shí)器比較輸出功能的比較切換模式與DMA的靈活運(yùn)用,拋磚引玉似地給大家提供些方法或思路。當(dāng)我們將STM32各種定時(shí)器事件、定時(shí)器比較輸出切換模式以及DMA傳輸靈活而巧妙加以運(yùn)用時(shí),往往可以實(shí)現(xiàn)很多客制化的東西。
-
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119816 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3231瀏覽量
114327 -
PWM輸出
+關(guān)注
關(guān)注
1文章
66瀏覽量
5113 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
280瀏覽量
14713 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
114瀏覽量
6144
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論