新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32開發(fā)板學習日記-[5]TIM的PMW模式

STM32開發(fā)板學習日記-[5]TIM的PMW模式

作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
脈沖寬度調(diào)制模式可以產(chǎn)生一個由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號。

在TIMx_CCMRx寄存器中的OCxM位寫入’110’(PWM模式1)或’111’(PWM模式2),能夠獨立地設置每個OCx輸出通道產(chǎn)生一路PWM。必須設置TIMx_CCMRx寄存器OCxPE位以使能相應的預裝載寄存器,最后還要設置TIMx_CR1寄存器的ARPE位使能自動重裝載的預裝載寄存器(在向上計數(shù)或中心對稱模式中)。
因為僅當發(fā)生一個更新事件的時候,預裝載寄存器才能被傳送到影子寄存器,因此在計數(shù)器開始計數(shù)之前,必須通過設置TIMx_EGR寄存器中的UG位來初始化所有的寄存器。
OCx的極性可以通過軟件在TIMx_CCER寄存器中的CCxP位設置,它可以設置為高電平有效活或低電平有效。TIMx_CCER寄存器中的CCxE位控制OCx輸出使能。

本文引用地址:http://butianyuan.cn/article/201611/321139.htm


在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx始終在進行比較,(依據(jù)計數(shù)器的計數(shù)方向)以確定是否符合TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。然而為了與OCREF_CLR的功能(在下一個PWM周期之前,ETR信號上的一個外部事件能夠清除OCxREF)一致,OCxREF信號只能在下述條件下產(chǎn)生:
●當比較的結果改變

●當輸出比較模式(TIMx_CCMRx寄存器中的OCxM位)從“凍結”(無比較,OCxM=’000’)切換到某個PWM模式(OCxM=’110’或’111’)。這樣在運行中可以通過軟件強置PWM輸出。
根據(jù)TIMx_CR1寄存器中CMS位的狀態(tài),定時器能夠產(chǎn)生邊沿對齊的PWM信號或中央對齊的PWM信號。

110:PWM模式1-在向上計數(shù)時,一旦TIMx_CNTTIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。
111:PWM模式2-在向上計數(shù)時,一旦TIMx_CNTTIMx_CCR1時通道1為有效電平,否則為無效電平。


PWM 邊沿對齊模式
向上計數(shù)配置
當TIMx_CR1寄存器中的DIR位為低的時候執(zhí)行向上計數(shù)。參看13.3.2節(jié)。
下面是一個PWM模式1的例子。當TIMx_CNT

向下計數(shù)的配置


當TIMx_CR1寄存器的DIR位為高時執(zhí)行向下計數(shù)。

在PWM模式1,當TIMx_CNT>TIMx_CCRx時參考信號OCxREF為低,否則為高。如果TIMx_CCRx中的比較值大于TIMx_ARR中的自動重裝載值,則OCxREF保持為’1’。該模式下不能產(chǎn)生0%的PWM波形。
PWM 中央對齊模式
當TIMx_CR1寄存器中的CMS位不為’00’時為中央對齊模式(所有其他的配置對OCxREF/OCx信號都有相同的作用)。根據(jù)不同的CMS位的設置,比較標志可以在計數(shù)器向上計數(shù)時被置1、在計數(shù)器向下計數(shù)時被置1、或在計數(shù)器向上和向下計數(shù)時被置1。TIMx_CR1寄存器中的計數(shù)方向位(DIR)由硬件更新,不要用軟件修改它。下圖給出了一些中央對齊的PWM波形的例子
●TIMx_ARR=8
●PWM模式1
●TIMx_CR1寄存器中的CMS=01,在中央對齊模式1時,當計數(shù)器向下計數(shù)時設置比較標志。通用定時器(TIMx)

使用中央對齊模式的提示:
●進入中央對齊模式時,使用當前的上/下計數(shù)配置;這就意味著計數(shù)器向上還是向下計數(shù)取決于TIMx_CR1寄存器中DIR位的當前值。此外,軟件不能同時修改DIR和CMS位。
●不推薦當運行在中央對齊模式時改寫計數(shù)器,因為會產(chǎn)生不可預知的結果。特別地:
─如果寫入計數(shù)器的值大于自動重加載的值(TIMx_CNT>TIMx_ARR),則方向不會被更新。例如,如果計數(shù)器正在向上計數(shù),它就會繼續(xù)向上計數(shù)。
─如果將0或者TIMx_ARR的值寫入計數(shù)器,方向被更新,但不產(chǎn)生更新事件UEV。
●使用中央對齊模式最保險的方法,就是在啟動計數(shù)器之前產(chǎn)生一個軟件更新(設置TIMx_EGR 位中的UG位),不要在計數(shù)進行過程中修改計數(shù)器的值。

本例展示了如何設置TIM工作在脈沖寬度調(diào)制模式(PWM Pulse Width Modulation
mode)。

TIM3時鐘設置為36MHz,預分頻設置為0,TIM2計數(shù)器時鐘可表達為:
TIM3 counter clock = TIMxCLK / (Prescaler +1) = 36 MHz

設置TIM3_CCR1寄存器值為500,則TIM3通道1產(chǎn)生一個頻率為36MHz,占空比(duty cycle)為50%的PWM信號。

同理,根據(jù)寄存器TIM3_CCR2 、TIM3_CCR3和 TIM3_CCR4的值,TIM3通道2產(chǎn)生一個頻率為36MHz,占空比(duty cycle)為37.5%的PWM信號;TIM3通道1產(chǎn)生一個頻率為36MHz,占空比(duty cycle)為25%的PWM信號;TIM3通道1產(chǎn)生一個頻率為36MHz,占空比(duty cycle)為12.5%的PWM信號。

可以通過示波器,在相應管腳觀察到輸出信號。

u16 CCR1_Val = 500;
u16 CCR2_Val = 375;
u16 CCR3_Val = 250;
u16 CCR4_Val = 125;





TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInit(TIM3, &TIM_OCInitStructure);

啟用CCR1寄存器的影子寄存器(直到產(chǎn)生更新事件才更改設置)

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);


TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

TIM_OCInit(TIM3, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);


TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

TIM_OCInit(TIM3, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);


TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

TIM_OCInit(TIM3, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3, ENABLE);


TIM_Cmd(TIM3, ENABLE);

while (1)
{
}
}




評論


技術專區(qū)

關閉