<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32學(xué)習(xí)筆記(5):通用定時(shí)器PWM輸出

          STM32學(xué)習(xí)筆記(5):通用定時(shí)器PWM輸出

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          1.TIMER輸出PWM基本概念

          本文引用地址:http://www.ex-cimer.com/article/201611/322602.htm

          脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡單一點(diǎn),就是對脈沖寬度的控制。一般用來控制步進(jìn)電機(jī)的速度等等。

          STM32的定時(shí)器除了TIM6和TIM7之外,其他的定時(shí)器都可以用來產(chǎn)生PWM輸出,其中高級(jí)定時(shí)器TIM1和TIM8可以同時(shí)產(chǎn)生7路的PWM輸出,而通用定時(shí)器也能同時(shí)產(chǎn)生4路的PWM輸出。

          1.1PWM輸出模式

          STM32的PWM輸出有兩種模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位確定的(“110”為模式1,“111”為模式2)。模式1和模式2的區(qū)別如下:

          110:PWM模式1-在向上計(jì)數(shù)時(shí),一旦TIMx_CNT時(shí)通道1為有效電平,否則為無效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。

          111:PWM模式2-在向上計(jì)數(shù)時(shí),一旦TIMx_CNT時(shí)通道1為無效電平,否則為有效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為有效電平,否則為無效電平。

          由此看來,模式1和模式2正好互補(bǔ),互為相反,所以在運(yùn)用起來差別也并不太大。

          而從計(jì)數(shù)模式上來看,PWM也和TIMx在作定時(shí)器時(shí)一樣,也有向上計(jì)數(shù)模式、向下計(jì)數(shù)模式和中心對齊模式,關(guān)于3種模式的具體資料,可以查看《STM32參考手冊》的“14.3.9 PWM模式”一節(jié),在此就不詳細(xì)贅述了。

          1.2PWM輸出管腳

          PWM的輸出管腳是確定好的,具體的引腳功能可以查看《STM32參考手冊》的“8.3.7定時(shí)器復(fù)用功能重映射”一節(jié)。在此需要強(qiáng)調(diào)的是,不同的TIMx有分配不同的引腳,但是考慮到管腳復(fù)用功能,STM32提出了一個(gè)重映像的概念,就是說通過設(shè)置某一些相關(guān)的寄存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這些重映像的管腳也是由參考手冊給出的。比如說TIM3的第2個(gè)通道,在沒有重映像的時(shí)候,指定的管腳是PA.7,如果設(shè)置部分重映像之后,TIM3_CH2的輸出就被映射到PB.5上了,如果設(shè)置了完全重映像的話,TIM3_CH2的輸出就被映射到PC.7上了。

          1.3PWM輸出信號(hào)

          PWM輸出的是一個(gè)方波信號(hào),信號(hào)的頻率是由TIMx的時(shí)鐘頻率和TIMx_ARR預(yù)分頻器所決定的,具體設(shè)置方法在前面一個(gè)學(xué)習(xí)筆記中有詳細(xì)的交代。而輸出信號(hào)的占空比則是由TIMx_CRRx寄存器確定的。其公式為“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通過向CRR中填入適當(dāng)?shù)臄?shù)來輸出自己所需的頻率和占空比的方波信號(hào)。

          2.TIMER輸出PWM實(shí)現(xiàn)步驟

          1.設(shè)置RCC時(shí)鐘;

          2.設(shè)置GPIO時(shí)鐘;

          3.設(shè)置TIMx定時(shí)器的相關(guān)寄存器;

          4.設(shè)置TIMx定時(shí)器的PWM相關(guān)寄存器。

          第1步設(shè)置RCC時(shí)鐘已經(jīng)在前文中給出了詳細(xì)的代碼,在此就不再多說了。需要注意的是通用定時(shí)器TIMx是由APB1提供時(shí)鐘,而GPIO則是由APB2提供時(shí)鐘。注意,如果需要對PWM的輸出進(jìn)行重映像的話,還需要開啟引腳復(fù)用時(shí)鐘AFIO。

          第2步設(shè)置GPIO時(shí)鐘時(shí),GPIO模式應(yīng)該設(shè)置為復(fù)用推挽輸出GPIO_Mode_AF_PP,如果需要引腳重映像的話,則需要用GPIO_PinRemapConfig()函數(shù)進(jìn)行設(shè)置。

          第3步設(shè)置TIMx定時(shí)器的相關(guān)寄存器時(shí),和前一篇學(xué)習(xí)筆記一樣,設(shè)置好相關(guān)的TIMx的時(shí)鐘和技術(shù)模式等等。具體設(shè)置參看“TIMER基本定時(shí)功能”的學(xué)習(xí)筆記。

          第4步設(shè)置PWM相關(guān)寄存器,首先要設(shè)置PWM模式(默認(rèn)情況下PWM是凍結(jié)的),然后設(shè)置占空比(根據(jù)前面所述公式進(jìn)行計(jì)算),再設(shè)置輸出比較極性:當(dāng)設(shè)置為High時(shí),輸出信號(hào)不反相,當(dāng)設(shè)置為Low時(shí),輸出信號(hào)反相之后再輸出。最重要是是要使能TIMx的輸出狀態(tài)和使能TIMx的PWM輸出使能。

          相關(guān)設(shè)置完成之后,就可以通過TIM_Cmd()來打開TIMx定時(shí)器,從而得到PWM輸出了。

          3.TIMER輸出PWM源代碼

          由于我現(xiàn)在手上的奮斗開發(fā)板是將PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要進(jìn)行引腳重映像。打開TIM3之后,PWM輸出,使得LED點(diǎn)亮,通過改變PWM_cfg()中的占空比可以調(diào)節(jié)LED的亮度。

          #include "stm32f10x_lib.h"

          void RCC_cfg();

          void GPIO_cfg();

          void TIMER_cfg();

          void PWM_cfg();

          //占空比,取值范圍為0-100

          int dutyfactor = 50;

          int main()

          {

          int Temp;

          RCC_cfg();

          GPIO_cfg();

          TIMER_cfg();

          PWM_cfg();

          //使能TIM3計(jì)時(shí)器,開始輸出PWM

          TIM_Cmd(TIM3, ENABLE);

          while(1);

          }

          void RCC_cfg()

          {

          //定義錯(cuò)誤狀態(tài)變量

          ErrorStatus HSEStartUpStatus;

          //將RCC寄存器重新設(shè)置為默認(rèn)值

          RCC_DeInit();

          //打開外部高速時(shí)鐘晶振

          RCC_HSEConfig(RCC_HSE_ON);


          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();