有人使用STM32定時器的PWM功能,遇到點小疑問,這里一起看看。
他先將STM32某定時器計數(shù)周期設(shè)為0xff,單向遞增計數(shù)模式,OC比較值設(shè)為0x7F。在某時刻將新的計數(shù)周期0x7F與比較值0x3F加載到影子寄存器。當正在進行的一個周期結(jié)束后,經(jīng)示波器測量確實可以看到其下一個周期發(fā)生變化,但其周期明顯與預(yù)設(shè)值對應(yīng)不上!再次經(jīng)過一個周期,定時器才會按照預(yù)設(shè)值穩(wěn)定輸出。
以上是咨詢者不算很清晰的描述【其實咨詢TIMER問題最好配上時序圖】,但可以了解到他要做的事情就是在ARR=0xff,ccr=0x7F的PWM輸出狀態(tài)下,于某時刻賦予ARR和CCR新值以改變輸出波形。
事情不算復(fù)雜,疑點就是為什么需要2個周期延時后才能有基于新配置的穩(wěn)定輸出。【他這里說的2個周期顯然不清楚到底指的前后哪個周期值】
這個問題主要涉及到定時器寄存器的預(yù)裝功能。有些時候我們需要保證輸出波形完整性、連續(xù)性,開啟ARR及CCR的預(yù)裝功能就比較合適,使用CubeMx配置時做些勾選即可。開啟預(yù)裝后,修改ARR及CCR的值,生效時間點最長可能延后1個舊計數(shù)周期。不過這里要注意,我們修改ARR及CCR的值若不是特別需求,建議在一個計數(shù)周期內(nèi)完成修改,不要一個值在更新事件之前完成賦值,另一個則發(fā)生在該更新事件之后。
我也將上面提醒告知咨詢者,他反饋問題依然沒能解決,準確說是疑惑依然沒能解除。他這里的確只是提出疑惑,并未提出具體需求。另外,他還將問題的復(fù)現(xiàn)過程做了如下補充:
第一步:
1 - 關(guān)閉預(yù)裝載(ARR/CCR)
2 - 設(shè)定ARR=CCR=0xFF
3 - 開啟輸出比較功能(連接到示波器查看波形)
第二步:
1 - 設(shè)置示波器觸發(fā)(延遲一段時間拉高某個IO引腳以觸發(fā)示波器采集)
2 - 立即清空CNT
3 - 使能預(yù)裝載
4 - 設(shè)定ARR=0X7F,CCR=0X3F
現(xiàn)象:本周期結(jié)束后其計數(shù)周期確實會相應(yīng)改變,但改變之后的前兩個周期明顯與設(shè)定值不符,即經(jīng)過2個周期后才可穩(wěn)定輸出。
復(fù)現(xiàn)過程表述得比較清晰了,他也再次明確了疑惑點。同時還強調(diào)說網(wǎng)上很多人碰到類似問題或疑惑。他在STM32L4系列和STM32H7系列上都遇到了同樣問題。既然這樣,現(xiàn)在我們使用STM32L4系列的TIM1來進行驗證,參照他的操作步驟來組織代碼,看看來龍去脈。
我是這樣測試驗證的。
在關(guān)閉ARR/CCR的預(yù)裝前提下給二者分別賦值0xff和0x7f,啟動CH1的PWM輸出并使能該通道的輸出比較中斷。在第一個脈沖的比較中斷里按照咨詢者的做法修改ARR/CCR值。為了便于觀察效果,我也開啟了更新中斷,通過更新中斷記錄脈沖個數(shù),輸出幾個脈沖后就將定時器及輸出都關(guān)閉掉。【選擇PWM模式1,極性為高有效】
編寫代碼、編譯除錯后,運行得到如下結(jié)果:【黃色波形結(jié)尾的4個脈沖是基于新參數(shù)的輸出。綠色波形的上升沿指示修改數(shù)據(jù)的時間點,這里輔助顯示下,重點在黃色波形?!?/p>
上面輸出波形應(yīng)該說跟客戶反饋的是一致的。我們來一起看看。
在第一個脈沖的比較中斷處,也是第一個脈沖的正中央【紅色箭頭所指位置】處做參數(shù)修改。修改步驟按照咨詢者提供的來實現(xiàn)。
即按照上面的3小步操作【第1小步是咨詢者設(shè)置示波器的動作,不用理它】。
這里是開啟預(yù)裝功能后才修改ARR/CCR值,這兩個新值目前只能暫居預(yù)裝寄存器,實際起作用的ARR/CCR值仍是之前的0xff和0x7f。而且,還在此處對計數(shù)器做了清零,即從此刻起PWM輸出脈沖重頭來。這樣從上圖紅色箭頭到藍色箭頭之間的波形依然是基于ARR=0xff,CCR=0x7f參數(shù)運行的。定時器于藍色箭頭所指位置處發(fā)生更新事件,新數(shù)據(jù)【0x7f,0x3f】生效起作用。
顯然從修改時刻算起到數(shù)據(jù)生效 剛好延時1個舊周期,結(jié)合到這里,恰好是新周期的2倍。修改數(shù)據(jù)后整整花了2個周期的時間才生效就是這么來的。
如果在上面操作步驟的基礎(chǔ)上拿掉對計數(shù)器清零操作,其它不變,輸出結(jié)果又不一樣了。見下面截圖:
同樣,紅色箭頭所指位置為修改數(shù)據(jù)的時刻。由于此時沒有對計數(shù)器清零,計數(shù)器按部就班計數(shù),PWM輸出按預(yù)定配置輸出,繼續(xù)運行半個舊周期后計數(shù)器溢出產(chǎn)生更新事件于藍色箭頭所指位置。藍色箭頭所指位置以后PWM輸出按新參數(shù)運行。不難看出,這次新數(shù)據(jù)的生效從修改時刻算起僅延時半個舊周期,相當于后續(xù)的1個新周期。
這里強調(diào)下,我這里測試時選擇的剛好是舊周期的中間點,所以延時生效為半個舊周期。具體應(yīng)用時的延時跟我們修改參數(shù)所選的時間點有關(guān),一般來講,它最長不會超過1個舊周期,最短極限為0。
當然,如果說我們不關(guān)心修改數(shù)據(jù)前后波形的完整性,直接關(guān)閉預(yù)裝功能也行,或者手動產(chǎn)生更新事件也可以??傊?,我們根據(jù)實際應(yīng)用需求來定。
聊到這里,關(guān)于咨詢者的疑惑基本解釋得差不多了。
或許眼尖的人看到上面第一種操作輸出的PWM波形里面有個非常細窄的尖脈沖,它是怎么回事呢?示波器問題?非也!【見下圖橢圓形框住的細長線】
此處尖脈沖產(chǎn)生的原因是------
當發(fā)生比較中斷時我們才去做修改參數(shù)動作,在做計數(shù)器清零操作前,計數(shù)器的值已經(jīng)大于設(shè)置的CCR值【0x7f】,按照當前PWM輸出模式及極性選擇,輸出則變?yōu)榈碗娖搅恕5?,在中斷里我們很快又將計?shù)器值做了個清零,此時計數(shù)器值又小于CCR值【0x7f】了。同樣,按照當前PWM配置,輸出又變回高電平,最終就產(chǎn)生了這么個一下一上的尖脈沖?!咀ⅲ哼@里涉及PWM輸出原理,需要的自行補課?!?/p>
-
STM32
+關(guān)注
關(guān)注
2266文章
10873瀏覽量
354832 -
控制
+關(guān)注
關(guān)注
4文章
1010瀏覽量
122628 -
定時器
+關(guān)注
關(guān)注
23文章
3237瀏覽量
114475
發(fā)布評論請先 登錄
相關(guān)推薦
評論