我想要TIM定時器輸出的PWM波形:0.1%精度占空比, 頻率范圍:200Hz - 10KHz。請問能實現嗎?
Ⅰ寫在前面
如果有朋友下載了上一篇文章我提供的例程,在“bsp_timer.h”文件下,你就會發現有如下一段被我注釋了的【說明性文字】。
這個工程是我從之前項目中提取出來(復制部分代碼),從新整理的一個的工程。里面的這個被注釋了的描述文字是之前整理的,今天重新對其說明一下。
這里句題外話:
我一般都是注重讓大家明白其原理,提供的工程代碼以簡單為原則。比如:沒有添加系統,沒有添加參數越界檢查等額外的代碼。不是讓你直接拷貝過去就用,一般需要結合你實際工程,對其修改。
Ⅱ解讀那段文字
想要認真掌握定時器輸出PWM的朋友,可以品味一下那段文字。
1.定時器的位數
在STM32中,定時器分16位和32位,這個好理解。簡單的來說,就是16位定時器相關的寄存器包含計數器是16位的,計數的范圍是0 ~ 0xFFFF。同理,32位計數范圍為0 ~ 0xFFFF FFFF。
當然,上面提到的相關的寄存器,其實只有幾個,計數器、自動重載寄存器、捕獲/比較寄存器等,具體請參看手冊中關于TIM寄存器章節。
截圖中,頻率的范圍,其實說明了32位定時器的優勢。但是,在STM32中,有些型號的MCU是沒有32位的定時器的(具體請見選型手冊,或數據手冊)。
2.占空比,周期(頻率)
PWM占空比是指在一個脈沖循環內,通電時間相對于總時間所占的比例。
比如:拿1KHz波形來說,占空比為20%,即高電平0.2ms。
在STM32定時器中,占空比其實是對應【捕獲/比較寄存器】的值,你可看見我提供的代碼:
#define PWM_TIM_SetComparex TIM_SetCompare1
捕獲/比較寄存器有1,2,3,4,對應的其實是你輸出的通道。
占空比的數值,需要結合PWM的頻率,所以代碼中是:
pwm_pulse = (pwm_period + 1)*Dutycycle / 100;
pwm_period:是PWM周期值;
/100代表:占空比的大小。
周期值:其實就是【自動重載寄存器 (TIMx_ARR)】是值;
看見我標記為紅色的文字沒有?這兩個值決定了PWM的周期和占空比。
3.計算頻率和占空比
頻率 = 1/周期; 1KHz的周期 = 0.001秒,即1ms.
波形頻率(周期)案例:
假如計數時鐘CK_CNT(看上圖)一秒鐘計數10M次:
我們需要1KHz波形,即1ms(波形1K)CNT計數個數為10K個,自動重載寄存器ARR設定值為10K。
我們需要10KHz波形,同理:自動重載寄存器設定值為100K。
占空比(1KHz波形)案例:
假如CK_CNT一秒鐘計數1M次:
我們需要1KHz,0.1占空比波形:同上分析,ARR的值為1K,則捕獲/比較寄存器 1 (TIMx_CCR1)值為1。(為什么是1? 1KHz * 0.1%就等于1)
我們需要10KHz,0.1占空比波形:同理計算CCR1值:等于1KHz * 0.1%就等于0.1。顯然
兩案例的結論:
1.100K > 65535,對于16位定時器來說,肯定不行啊。對于32位定時器就行。
2.CCR1的值不可能為0.1。
3.我們就需要改變計數時鐘CK_CNT來達到要求,也就是分頻。
4.自己設定邊界值,通過修改TIMx_PSC、TIMx_ARR和TIMx_CCR三個寄存器參數,來滿足自己要求。如果不能滿足,那么選擇32位定時器。如果32位都還不能滿足,那就······
-
PWM
+關注
關注
114文章
5141瀏覽量
213393 -
STM32
+關注
關注
2266文章
10871瀏覽量
354791 -
定時器
+關注
關注
23文章
3237瀏覽量
114467
發布評論請先 登錄
相關推薦
評論