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