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