stm32的定時器輸入捕獲與輸出比較_第1頁
stm32的定時器輸入捕獲與輸出比較_第2頁
stm32的定時器輸入捕獲與輸出比較_第3頁
stm32的定時器輸入捕獲與輸出比較_第4頁
stm32的定時器輸入捕獲與輸出比較_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

/stm32的定時器輸入捕獲與輸出比較

(2015-09-2809:26:24)轉載▼標簽:

it

分類:

stm32

明確一點對比AD的構造,stm32有3個AD,每個AD有很多通道,使用哪個通道就配置成哪個通道,這里定時器也如此,有很多定時器TIMx,每個定時器有很多CHx(通道),可以配置為輸入捕捉——-—測量頻率用,也可以配置為輸出比較———-—輸出PWM使用輸入捕捉:可以用來捕獲外部事件,并為其賦予時間標記以說明此事件的發(fā)生時刻。?

外部事件發(fā)生的觸發(fā)信號由單片機中對應的引腳輸入(具體可以參考單片機的datasheet),也可以通過模擬比較器單元來實現(xiàn).??時間標記可用來計算頻率,占空比及信號的其他特征,以及為事件創(chuàng)建日志,主要是用來測量外部信號的頻率.?

輸出比較:定時器中計數(shù)寄存器在初始化完后會自動的計數(shù)。從bottom計數(shù)到top。并且有不同的工作模式。

?另外還有個比較寄存器。一旦計數(shù)寄存器在從bottom到top計數(shù)過程中與比較寄存器匹配則會產生比較中斷(比較中斷使能的情況下).??然后根據(jù)不同的工作模式計數(shù)寄存器將清零或者計數(shù)到top值。1、朋友,可以解釋一下輸入捕獲的工作原理不?很簡單,當你設置的捕獲開始的時候,cpu會將計數(shù)寄存器的值復制到捕獲比較寄存器中并開始計數(shù),當再次捕捉到電平變化時,這是計數(shù)寄存器中的值減去剛才復制的值就是這段電平的持續(xù)時間,你可以設置上升沿捕獲、下降沿捕獲、或者上升沿下降沿都捕獲.它沒多大用處,最常用來測頻率。

計數(shù)寄存器的初值,是自己寫進去的嗎?是的,不過默認不要寫入

我如果捕獲上升沿,兩個值相減,代表的時兩個上升沿中間那段電平的時間。對不?是的

timer1有五個通道(對應五個IO引腳),在同一時刻,只能捕獲一個引腳的值,對不?那是肯定的,通道很像ADC通道,是可以進行切換的.

那輸出比較的原理你可以幫我介紹一下不?這里有兩個單元:一個計數(shù)器單元和一個比較單元,比較單元就是個雙緩沖寄存器,比較單元的值是可以根據(jù)不同的模式設置的,與此同時,計數(shù)器在不停的計數(shù),并不停的與比較寄存器中的值進行比較,當計數(shù)器的值與比較寄存器的值相等的時候一個比較匹配就發(fā)生了,根據(jù)自己的設置,匹配了是io電平取反、變低、還是變高,就會產生不同的波形了。

比較單元的值是人為設進去的吧?是的,但是他要根據(jù)你的控制寄存器的配置,來初始化你的比較匹配寄存器。

上面這個總看不懂,好像不不止你說的那幾種情況:“匹配了是io電平取反、變低、還是變高,就會產生不同的波形了”就是比較匹配了你要IO電平怎么辦?是清0還是置1?還是怎么樣?這樣才能產生波形啊要不然你要比較單元有什么用呢?

設置輸出就是置1,清除輸出就是置0,切換輸出就是將原來的電平取反,對不?是的你理解的很快011:計數(shù)器向上計數(shù)達到最大值時將引腳置1,達到0時,引腳電平置0,,對不?恩

定時器1的輸出比較模式怎么用。利用這個功能輸出一個1KHZ,占空比為10%的程序怎么寫啊?求高人指點1、陪定時器1的功能為特殊功能,不是普通IO

在PERCFG這里

2、P1SEL引腳選擇

3、P1DIR設為輸出

4、T3CC0設置周期

5、T3CC1設置占空比?6、T3CCTL0設置通道0

7、T3CCTL1設置通道1

8、T3CTL設為模模式?9、用T3CTL打開即可************以下是用定時器做頻率源,用定時器測量該頻率的應用程序!!!***********調試STM32的定時器好幾天了,也算是對STM32的定時器有了點清楚的認識了。我需要測量4路信號的頻率然后通過DMA將信號的頻率傳輸?shù)酱鎯ζ鲄^(qū)域,手冊說的很明白每個定時器有4個獨立通道。然后我就想能不能將這4路信號都連接到一個定時器的4個通道上去.理論上應該是行的通的。剛開始俺使用的是TIM2的123通道,TIM4的2通道來進行頻率的測量。由于沒有頻率發(fā)生器,所以我用tim3作為信號源,用TIM2,TIM4來進行測量就ok了(剛好4個通道了)。請看一開始的程序,以TIM2的1,3通道為例子(2通道設置方法一樣):TIM_ICInitStructure.TIM_ICMode=TIM_ICMode_ICAP;

//配置為輸入捕獲模式

TIM_ICInitStructure。TIM_Channel=TIM_Channel_1;

//選擇通道1TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;

//輸入上升沿捕獲TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;

//通道方向選擇

TIM_ICInitStructure。TIM_ICPrescaler=TIM_ICPSC_DIV1;

//每次檢測到捕獲輸入就觸發(fā)一次捕獲TIM_ICInitStructure。TIM_ICFilter=0x0;

//濾波TIM_ICInit(TIM2,&TIM_ICInitStructure);

//TIM2通道1配置完畢

TIM_ICInitStructure.TIM_ICMode=TIM_ICMode_ICAP;

//配置為輸入捕獲模式

TIM_ICInitStructure。TIM_Channel=TIM_Channel_3;

//選擇通道3TIM_ICInitStructure。TIM_ICPolarity=TIM_ICPolarity_Rising;

//輸入上升沿捕獲TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;

//

TIM_ICInitStructure。TIM_ICPrescaler=TIM_ICPSC_DIV1;

//每次檢測到捕獲輸入就觸發(fā)一次捕獲

TIM_ICInitStructure.TIM_ICFilter=0x0;

//濾波TIM_ICInit(TIM2,&TIM_ICInitStructure);

//TIM2通道3配置完畢

以上是輸入捕獲配置還需要做的工作就是(參考stm32參考手冊的TIM的結構框圖):

TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);

//參考TIM結構圖選擇濾波后的TI1輸入作為觸發(fā)源,觸發(fā)下面程序的復位

TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);

//復位模式—選中的觸發(fā)輸入(TRGI)的上升沿初始化計數(shù)器,并且產生一個更新線號

TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

//主從模式選擇這樣我們就可以很輕松的就得到了連接在TIM2的通道1上的信號的頻率,但是3通道的頻率的值永遠都是跳動的不準,測試了半天也沒有找到根本原因,請看TIM的結構框圖的一部分紅色箭頭所指,這才找到原因,觸發(fā)的信號源只有這四種,而通道3上的計數(shù)器的值不可能在接受到信號的上升沿時候,有復位這個動作,找到原因了。這就是3通道上的數(shù)據(jù)不停跳動的原因,要想得到信號的頻率也是有辦法的,可以取連續(xù)兩次捕捉的值之差,這個值就是信號的周期,自己根據(jù)實際情況去算頻率吧.有以上可以得到:stm32的TIM2的四個通道可以同時配置成輸入捕捉模式,但是計算CH3,CH4信號的頻率步驟有點繁瑣(取前后捕捉的差值),但是他的CH1,和CH2可以輕松得到:通道1

TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);

//參考TIM結構圖選擇濾波后的TI1輸入作為觸發(fā)源,觸發(fā)下面程序的復位

TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);

//復位模式-選中的觸發(fā)輸入(TRGI)的上升沿初始化計數(shù)器,并且產生一個更新線號TIMx->CRR1的值即為信號的周期通道2:

TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);

//參考TIM結構圖選擇濾波后的TI1輸入作為觸發(fā)源,觸發(fā)下面程序的復位

TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);

//復位模式-選中的觸發(fā)輸入(TRGI)的上升沿初始化計數(shù)器,并且產生一個更新線號TIMx->CRR2的值即為信號的周期STM32的定時器外設功能強大得超出了想像力,STM32一共有8個都為16位的定時器.其中TIM6、TIM7是基本定時器;TIM2、TIM3、TIM4、TIM5是通用定時器;TIM1和TIM8是高級定時器.這些定時器使STM32具有定時、信號的頻率測量、信號的PWM測量、PWM輸出、三相6步電機控制及編碼器接口等功能,都是專門為工控領域量身訂做的。?

基本定時器:具備最基本的定時功能,下面是它的結構:?

我們來看看它的啟動代碼:?voidTIM2_Configuration(void)?{

基本定時器TIM2的定時配置的結構體(包含定時器配置的所有元素例如:TIM_Period=計數(shù)值)?

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;?

設置TIM2_CLK為72MHZ(即TIM2外設掛在APB1上,把它的時鐘打開.)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);?

設置計數(shù)值位1000

TIM_TimeBaseStructure.TIM_Period=1000;?

將TIM2_CLK為72MHZ除以72=1MHZ為定時器的計數(shù)頻率

TIM_TimeBaseStructure.TIM_Prescaler=71;?

這個TIM_ClockDivision是設置時鐘分割,這里不分割還是1MHZ的計數(shù)頻率?

TIM_TimeBaseStructure。TIM_ClockDivision=TIM_CKD_DIV1;

設置為向上計數(shù)模式;(計數(shù)模式有向上,向下,中央對齊1,中央對齊2,中央對齊3)

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

將配置好的設置放進stm32f10x-tim。c的庫文件中?

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);?

清除標志位?

TIM_ClearFlag(TIM2,TIM_FLAG_Update);?

使能TIM2中斷?

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);?

使能TIM2外設

?

TIM_Cmd(TIM2,ENABLE);

?}

通用定時器:就比基本定時器復雜得多了。除了基本的定時,它主要用在測量輸入脈沖的頻率、脈沖寬與輸出PWM脈沖的場合,還具有編碼器的接口.

?我們來詳細講解:如何生成PWM脈沖?通用定時器可以利用GPIO引腳進行脈沖輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡稱為比較寄存器。?這里直接舉例說明定時器的PWM輸出工作過程:若配置脈沖計數(shù)器TIMx_CNT為向上計數(shù),而重載寄存器TIMx_ARR(相當于庫函數(shù)寫法的TIM_Period的值N)被配置為N,即TIMx_CNT的當前計數(shù)值數(shù)值X在TIMxCLK時鐘源的驅動下不斷累加,當TIMx_CNT的數(shù)值X大于N時,會重置TIMx_CNT數(shù)值為0重新計數(shù).

而在TIMxCNT計數(shù)的同時,TIMxCNT的計數(shù)值X會與比較寄存器TIMx_CCR預先存儲了的數(shù)值A進行比較,當脈沖計數(shù)器TIMx_CNT的數(shù)值X小于比較寄存器TIMx_CCR的值A時,輸出高電平(或低電平),相反地,當脈沖計數(shù)器的數(shù)值X大于或等于比較寄存器的值A時,輸出低電平(或高電平)。?如此循環(huán),得到的輸出脈沖周期就為重載寄存器TIMx_ARR存儲的數(shù)值(N+1)乘以觸發(fā)脈沖的時鐘周期,其脈沖寬度則為比較寄存器TIMx_CCR的值A乘以觸發(fā)脈沖的時鐘周期,即輸出PWM的占空比為A/(N+1)。?如果不想看的可以直接看我標注的紅色字體,就大體可以理解.

下面我們來編寫具體代碼和講解:?voidTIM3_GPIO_Config(void)

{配置TIM3復用輸出PWM的IO?

GPIO_InitTypeDefGPIO_InitStructure;?

打開TIM3的時鐘?

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

打開GPIOA和GPIOB的時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);?

配置PA6.PA7的工作模式?

GPIO_InitStructure.GPIO_Pin=

GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

?

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;?

GPIO_Init(GPIOA,&GPIO_InitStructure);

配置PB0.PB1的工作模式?

GPIO_InitStructure.GPIO_Pin=

GPIO_Pin_0|GPIO_Pin_1;?

GPIO_Init(GPIOB,&GPIO_InitStructure);?}

voidTIM3_Mode_Config(void)?{

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;//初始化TIM3的時間基數(shù)單位

TIM_OCInitTypeDef

TIM_OCInitStructure;//初始化TIM3的外設

u16CCR1_Val=500;

u16CCR2_Val=375;

u16CCR3_Val=250;

u16CCR4_Val=125;//PWM信號電平跳變值(即計數(shù)到這個數(shù)值以后都是低電平之前都是高電平)

?

TIM3的時間基數(shù)單位設置(如計數(shù)終止值:999,從0開始;計數(shù)方式:向上計數(shù))

TIM_TimeBaseStructure.TIM_Period=999;

TIM_TimeBaseStructure.TIM_Prescaler=0;

?

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;?

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);?

TIM3的外設的設置

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;

//TIM脈沖寬度調制模式1

?

TIM_OCInitStructure。TIM_OutputState=TIM_OutputState_Enable;//這個暫時不知道,stm32固件庫里沒有搜到.應該是定時器輸出聲明使能的意思

TIM_OCInitStructure。TIM_Pulse=CCR1_Val;//設置了待裝入捕獲比較寄存器的脈沖值

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;

//TIM輸出比較極性高

TIM_OC1Init(TIM3,&TIM_OCInitStructure);?

?

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的預裝載寄存器

下面3路PWM輸出和上面的一樣不再解說?

TIM_OCInitStructure.TIM_OutputStat(yī)e=TIM_OutputState_Enable;?

TIM_OCInitStructure.TIM_Pulse=CCR2_Val;

TIM_OC2Init(TIM3,&TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論