新聞中心

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

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

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

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

        本文引用地址:http://www.104case.com/article/201611/321139.htm


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

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

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


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

        向下計數的配置


        當TIMx_CR1寄存器的DIR位為高時執行向下計數。

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

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

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

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

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

        同理,根據寄存器TIM3_CCR2 、TIM3_CCR3和 TIM3_CCR4的值,TIM3通道2產生一個頻率為36MHz,占空比(duty cycle)為37.5%的PWM信號;TIM3通道1產生一個頻率為36MHz,占空比(duty cycle)為25%的PWM信號;TIM3通道1產生一個頻率為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寄存器的影子寄存器(直到產生更新事件才更改設置)

        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)
        {
        }
        }




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 奇台县| 临清市| 乌什县| 麻江县| 承德市| 晋城| 镇原县| 娄底市| 镇巴县| 天镇县| 巨野县| 九寨沟县| 潢川县| 文登市| 小金县| 蒙自县| 纳雍县| 康定县| 仁化县| 安阳市| 平泉县| 阿勒泰市| 堆龙德庆县| 河间市| 开阳县| 兴国县| 南投市| 阿勒泰市| 靖西县| 寿宁县| 广南县| 新密市| 革吉县| 七台河市| 大理市| 灵石县| 龙泉市| 浦北县| 寻甸| 开鲁县| 东港市|