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

STM32-通用定時器-PWM輸出

通過TIM輸出比較做一個定時器

評論