1 概述
????????項目中經(jīng)常使用到STM32來輸出PWM,每次配置過后過不了多久就會忘記,稍微需要對配置做出修改時都要翻很久的手冊,所以決定結(jié)合實例把PWM配置的詳細步驟記錄下來,這樣在下次配置時可以很快的撿起來。
????????本文檔的行文結(jié)構(gòu)如下,首先,說明實際需求,即要輸出什么樣的PWM信號;然后,根據(jù)需求把手冊中相關(guān)的部分摘抄下來并輔以個人的理解和總結(jié);最后,詳細說明在軟件中怎么去配置并展示配置后的實驗效果。
2 需求
????????項目中用到4路PWM信號,硬件條件決定了其只能由定時器1和定時器3產(chǎn)生,每個定時器輸出兩路PWM信號,要求4個PWM信號相位同步,每個PWM信號如圖1所示。
圖1 PWM輸出波形要求
????????具體要求見表1。
? ? ? ? 表1 PWM要求
序號 | 名稱 | 要求 | 備注 |
1 |
周期 |
100us |
暫定 |
2 |
占空比 |
0~100%可調(diào) |
|
3 |
中斷觸發(fā)時刻 |
計數(shù)器下溢點 |
|
4 |
占空比更新時刻 |
計數(shù)器下溢點 |
3 STM高級定時器原理
圖 2高級定時器的原理框圖
????????圖中用紅色虛線框出來的部分是輸出PWM所需要的部分,包括時鐘源、計數(shù)器單元、比較寄存器及PWM輸出、TRGO輸出、外部觸發(fā)輸入,下面依次說明各部分原理。
3.1 時鐘源
計數(shù)器時鐘可由以下時鐘源提供:
- 內(nèi)部時鐘(CK_INT)
- 外部時鐘模式1:外部輸入引腳
- 外部時鐘模式2:外部觸發(fā)輸入ETR
- 外部觸發(fā)輸入(ITRx)
輸出PWM使用內(nèi)部時鐘(CK_INT),只需要關(guān)心怎么配置為內(nèi)部時鐘以及內(nèi)部時鐘的頻率。
?3.2 計數(shù)器單元
????????時鐘源輸出的時鐘經(jīng)過預(yù)分頻器分頻后作為計數(shù)器的時鐘。計數(shù)器在時鐘下可以增計數(shù)、減計數(shù)、增/減計數(shù)。自動重載寄存器控制計數(shù)器的計數(shù)范圍,即定時器的周期。重復(fù)計數(shù)器控制更新事件UEV產(chǎn)生的頻率。
3.2.1 預(yù)分頻器
????????預(yù)分頻器用于對計數(shù)器時鐘進行分頻,分頻系數(shù)可配置為1~65536。分頻系數(shù)可以動態(tài)修改,不過其具有緩沖功能,修改后的分頻系數(shù)只能在下一次更新事件UEV后生效(見3.2.3節(jié))。
3.2.2 計數(shù)器
1)計數(shù)器可以增計數(shù)、減計數(shù)、增\減計數(shù)。
- 增計數(shù)的范圍為0~自動重裝值(TIMx_ARR寄存器的值),計數(shù)值為自動重裝值時產(chǎn)生上溢事件,定時器周期=T_CK_CNT*(自動重裝值+1);
- 減計數(shù)的范圍為自動重裝值(TIMx_ARR寄存器的值)~0,計數(shù)值為0時產(chǎn)生下溢事件,定時器周期=T_CK_CNT*(自動重裝值+1);
- 增\減計數(shù)的范圍為0~自動重裝值(TIMx_ARR寄存器的值)~1,計數(shù)值為自動重裝值-1時生成上溢事件,計數(shù)值為1時生成下溢事件。計數(shù)器周期=T_CK_CNT*自動重裝值*2;
2)自動重裝值可以配置為預(yù)裝載或者不預(yù)裝載。不預(yù)裝載時,自動重裝值實時生效;預(yù)裝載時,自動重裝值在下一次更新事件UEV后生效(見3.2.3節(jié))。
3)增/減計數(shù)有3種,分別為中心對稱模式1/2/3,區(qū)別在于輸出比較中斷標志觸發(fā)的位置不同,具體見手冊。
3.2.3 重復(fù)計數(shù)器及更新事件(UEV)的產(chǎn)生
1.重復(fù)計數(shù)器
????????重復(fù)計數(shù)器僅用來控制更新事件的產(chǎn)生。它是一個自動重裝的減計數(shù)器,在更新事件UEV時自動重裝,重裝值為RCR寄存器的值。每次上溢或下溢事件時重復(fù)計數(shù)器減1。
2.更新事件的產(chǎn)生
?????????更新事件(UEV)可以被屏蔽或者啟用(TIM_CR1的UDIS位)。被屏蔽的情況下不會產(chǎn)生任何更新事件;被啟用的情況下,有兩種情況可以產(chǎn)生更新事件,分別為外部觸發(fā)和計數(shù)器內(nèi)部觸發(fā)。
????????外部觸發(fā)不受重復(fù)計數(shù)器的影響,只要觸發(fā)則立即產(chǎn)生更新事件。外部觸發(fā)有兩種,分別為軟件向TIM_EGR的UG位寫1和外部觸發(fā)輸入(見3.5節(jié))。
????????計數(shù)器內(nèi)部觸發(fā)受重復(fù)計數(shù)器的影響,只有重復(fù)計數(shù)器等于0時才可以產(chǎn)生更新事件。在重復(fù)計數(shù)器等于0時以下三種情況可以產(chǎn)生更新事件:
- 增計數(shù)時上溢事件時產(chǎn)生更新事件;
- 減計數(shù)時下溢事件時產(chǎn)生更新事件;
- 增\減計數(shù)時上溢和下溢均產(chǎn)生更新事件;
????????結(jié)合重復(fù)寄存器的原理可知,每N(RCR寄存器的值)+1次上溢或者N+1
次下溢事件產(chǎn)生1次更新事件?。
3.增\減計數(shù)模式下如何控制更新事件(UEV)在上溢還是下溢產(chǎn)生?
????????顯然,增\減計數(shù)模式時如果配置重復(fù)寄存器RCR為奇數(shù),更新事件將只能在上溢或下溢產(chǎn)生,那么該如何控制其在上溢還是在下溢產(chǎn)生呢?手冊中寫到:在啟動計數(shù)器前寫入RCR,則UEV將在上溢時產(chǎn)生,在計數(shù)器啟動后寫入RCR,則UEV將在下溢時產(chǎn)生。
但經(jīng)過實測試上述說法并不完全準確。實測結(jié)果如下:
- 在啟動計數(shù)器前對RCR寫入1,UEV在上溢產(chǎn)生;
- 在啟動計數(shù)器前先對RCR寫入1,再軟件強制觸發(fā)一個UEV,然后啟動計數(shù)器,UEV將在下溢產(chǎn)生。(HAL庫中有此操作,所以在CubeMx直接配置重復(fù)計數(shù)器為1,UEV仍在下溢產(chǎn)生);
- 啟動計數(shù)器后,在增計數(shù)過程中對RCR寫入1,UEV在上溢產(chǎn)生;
- 啟動計數(shù)器后,在減計數(shù)過程中對RCR寫入1,UEV在下溢產(chǎn)生。
????????可以這么理解,啟動計數(shù)器后首先觸發(fā)的是上溢事件,然后是下溢事件。因為重復(fù)計數(shù)器是一個在更新事件UEV時自動重裝載的計數(shù)器,在啟動計數(shù)器前寫入的1并沒有裝載到重復(fù)計數(shù)器,所以啟動計數(shù)器后更新事件UEV在上溢產(chǎn)生;如果在啟動計數(shù)器前軟件強制觸發(fā)一個UEV事件,則在啟動計數(shù)器時1已經(jīng)寫入重復(fù)計數(shù)器,所以更新事件UEV在下溢產(chǎn)生。
????????至于啟動計數(shù)器后寫入RCR的現(xiàn)象則更好解釋。因重復(fù)計數(shù)器只在UEV時更新,寫入RCR后不會立馬更新,所以增計數(shù)在上溢產(chǎn)生UEV事件然后更新重復(fù)計數(shù)器,減計數(shù)在下溢產(chǎn)生UEV事件然后更新重復(fù)計數(shù)器。
圖 3不同模式和配置下的更新事件(UEV)的觸發(fā)時刻
3.2.3 比較寄存器及PWM輸出
????????比較寄存器(TIM_CCRx)可以配置為預(yù)裝載和不預(yù)裝載。預(yù)裝載時,只有在下一次更新事件UEV時比較寄存器的值才會生效,不預(yù)裝載時,比較寄存器的值實時生效。配置為PWM模式時必須使能預(yù)裝載(使用HAL庫配置為PWM模式時默認已使能預(yù)裝載)。
????????比較寄存器可以配置為PWM模式和其他模式。這里僅介紹PWM模式,其他模式見手冊比較輸出模式章節(jié)。PWM模式分為PWM模式1和PWM模式2。
PWM模式1時:
- 計數(shù)器增計數(shù)時,計數(shù)器<TIM_CCRx則OCxREF輸出高電平,否則輸出低電平;
- 計數(shù)器減計數(shù)時,計數(shù)器≦TIM_CCRx則OCxREF輸出高電平,否則輸出低電平。
圖 4 PWM模式1、中心對齊模式的PWM波形
PWM模式2時:
- 計數(shù)器增計數(shù)時,計數(shù)器>TIM_CCRx則OCxREF輸出高電平,否則輸出低電平;
- 計數(shù)器減計數(shù)時,計數(shù)器≧TIM_CCRx則OCxREF輸出高電平,否則輸出低電平。
????????注意事項:不建議在運行中心對齊模式(增\減計數(shù))時對計數(shù)器執(zhí)行寫操作,使用中心對稱模式最為保險的方法為:在啟動計數(shù)器前通過軟件生成更新(對TIM_EGR的UG位寫1)來初始化所有寄存器(HAL庫中有此操作),并且不要在計數(shù)器運行過程中對其執(zhí)行寫操作。
3.4 外部觸發(fā)輸出(TRGO)
????????TRGO輸出受TIM_CR2寄存器MMS位控制,具體如圖5。
?圖 5?TRGO輸出配置
????????MMS為010時,更新事件UEV作為TRGO輸出,可用于同步其他定時器。
3.5?外部觸發(fā)輸入
????????定時器配置為從模式可與外部觸發(fā)輸入同步,有三種同步模式,分別為復(fù)位模式、門控模式和觸發(fā)模式,這里僅介紹復(fù)位模式,其他模式見手冊。復(fù)位模式:觸發(fā)事件時,計數(shù)器和預(yù)分頻器將重新初始化,同時還會生成更新事件UEV,所有的預(yù)裝載寄存器將會更新。觸發(fā)輸入可選:
- ITR0:內(nèi)部觸發(fā)0
- ITR1:內(nèi)部觸發(fā)1
- ITR2:內(nèi)部觸發(fā)2
- ITR3:內(nèi)部觸發(fā)3
- T1F_ED:TI1的邊沿檢測器
- TI1FP1:濾波后的定時器輸入1
- TI1FP2:濾波后的定時器輸入2
- ETRF:外部觸發(fā)輸入
????????其中ITR0~ITR3是從定時器的內(nèi)部觸發(fā)輸入,是主定時器的TRGO輸出。當定時器3作為從定時器時,它對應(yīng)的內(nèi)部觸發(fā)輸入來源如下:
表 2?定時器3作為從定時器時的觸發(fā)輸入來源
從定時器 |
ITR0 |
ITR1 |
ITR2 |
ITR3 |
TIM2 |
TIM1 |
TIM15 |
TIM3 |
TIM14 |
4 軟件配置
????????硬件條件決定了只能使用定時器1和定時器3各輸出兩路PWM信號。為實現(xiàn)同步,配置定時器3為從模式,使用定時器1的觸發(fā)輸出(TRGO)進行同步復(fù)位。
4.1 CubeMx中的配置
4.1.1 定時器1的配置
?圖 6?CubeMx中定時器1的配置1
?圖 7?CubeMx中定時器1的配置2
4.1.2 定時器3的配置?
圖 8?CubeMx中定時器2的配置
4.2 程序中的配置
?
?圖 9?程序中的配置1
?圖 10?程序中的配置2
5 實驗效果
????????實驗結(jié)果如圖10和圖11所示,定時器1和定時器3的PWM輸出同步,周期為10kHz,占空比為25%;定時器1的更新事件在下溢點觸發(fā),每個增\減計數(shù)周期觸發(fā)1次。
圖 11?實驗效果1-PWM信號周期、占空比、同步關(guān)系
?圖 12?定時器1更新事件UEV觸發(fā)時刻文章來源:http://www.zghlxwxcb.cn/news/detail-775501.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-775501.html
到了這里,關(guān)于STM32使用CubeMx配置定時器輸出PWM的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!