版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、在輸入捕獲模式下,當(dāng)檢測到ICx信號上升(shngshng)/下降邊沿時,計數(shù)器的當(dāng)前值被存儲在捕獲比較寄存器TIMx_CCRx中。當(dāng)捕獲事件發(fā)生時,相應(yīng)的CCxIF 標(biāo)志(TIMx_SR 寄存器) 被置1。如果中斷或者DMA功能被使能,就會產(chǎn)生中斷或者DMA請求(qngqi)。如果捕獲發(fā)生時,CCxIF標(biāo)志已經(jīng)被置位,這時過采樣標(biāo)志CCxOF就會被置位。向CCxIF寫0或者讀去TIM_CCRx中的數(shù)據(jù),將清除捕獲標(biāo)志。CCxOF位只能通過手動寫入0進行清除。假如我設(shè)置為上升沿捕獲(bhu),那么當(dāng)一個上升沿到來的時候,定時器當(dāng)前的計數(shù)值(TIMx_CNT)就會寫入TIMx_CCRx中。我們讀
2、取這個數(shù)據(jù)。等到下一個上升沿到了時,就會有另一個計數(shù)器值TIMx_CNT記錄。根據(jù)這兩個數(shù)據(jù)值差,我們能算出來輸入數(shù)據(jù)的周期。當(dāng)然,我們還有處理定時器溢出這個問題,定時器溢出了就不準(zhǔn)了。如果要測占空比,就需要同時捕獲上升沿和下降沿。相鄰兩個上升沿之間的計數(shù)是輸入的周期,相鄰兩次捕獲(一個上升沿一個下降沿)之間的時間是占或者空的時間。根據(jù)這個可以計算占空比或者PPM之類的東西。【實驗內(nèi)容】本次實驗,使用TIM4產(chǎn)生一個1K的頻率輸出,用TIM1進行捕獲。并測出頻率計算TIM1 的時基單元配置:關(guān)于TIM1的時基設(shè)置問題前文已經(jīng)討論過了。這里只有一點需要明確的,就是為了盡量減少更新事件,將TIM_
3、Period設(shè)置到最大即0 xFFFF。定時器時鐘設(shè)置成2M,這樣定時器的更新頻率就是30Hz,不會造成兩次捕獲之間產(chǎn)生多次更新。TIM1的完整配置代碼如下:void TIM1_ICConfig(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);/ /時基初始化 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; /死區(qū)控制用。 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; /計數(shù)器
4、方向 TIM_TimeBaseInitStructure.TIM_Prescaler = 84-1; /Timer clock = sysclock /(TIM_Prescaler+1) = 2M TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInitStructure.TIM_Period = 0 xFFFF; /Period = (TIM counter clock / TIM output clock) - 1 = 40Hz TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitS
5、tructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM1,&TIM_ICI
6、nitStructure); TIM_Cmd(TIM1,ENABLE);TIM4的配置就是基本的輸出配置,沒什么可說的。代碼如下:void TIM4_OCConfig(void) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Pres
7、caler = 0; TIM_TimeBaseInitStructure.TIM_RepetitionCounter =0; TIM_TimeBaseInitStructure.TIM_Period = 42000-1; /周期:42M/(42000)= 1K TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_
8、OCInitStructure.TIM_Pulse = 10000; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OC1Init(TIM4,&TIM_OCInitStructure); TIM_Cmd(TIM4,ENABLE);這個輸出頻率(pnl),在示波器上可以看到的:之后就是在主函數(shù)(hnsh)里邊進行測量了:CaptureNumber = 0;while(1) if(TIM_GetFlagS
9、tatus(TIM1,TIM_FLAG_CC1)=SET) TIM_ClearFlag(TIM1,TIM_FLAG_CC1); if(CaptureNumber = 0) counter = TIM_GetCapture1(TIM1); /第一次捕獲(bhu) CaptureNumber = 1; else if(CaptureNumber = 1) /處理第二次捕獲 if(TIM_GetFlagStatus(TIM1,TIM_FLAG_Update) != SET)/兩次捕獲間沒有發(fā)生溢出的處理 Time = TIM_GetCapture1(TIM1); Time = Time - coun
10、ter; else TIM_ClearFlag(TIM1,TIM_FLAG_Update); /產(chǎn)生了更新事件 Time = 0 xFFFF - counter + TIM_GetCapture1(TIM1)+1; /如果有更新事件產(chǎn)生時候的計算方式 CaptureNumber = 0; if(Time!=0) freq= 2000000/Time; /計算頻率 freq = freq; /避免變量freq被編譯器優(yōu)化掉 通用定時器作為輸入捕獲(bhu)的使用。我們將用TIM5的通道(tngdo)1(PA0)來做輸入(shr)捕獲,捕獲PA0上高電平的脈寬(用WK_UP按鍵輸入高電平),通過串
11、口打印高電平脈寬時間輸入捕獲簡介輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。STM32的定時器,除了TIM6和TIM7,其他定時器都有輸入捕獲功能。STM32的輸入捕獲,簡單的說就是通過檢測TIMx_CHx上的邊沿信號,在邊沿信號發(fā)生跳變(比如上升沿/下降沿)的時候,將當(dāng)前定時器的值(TIMx_CNT)存放到對應(yīng)的通道的捕獲/比較寄存器(TIMx_CCRx)里面,完成一次捕獲。同時還可以配置捕獲時是否觸發(fā)中斷/DMA等。我們用到TIM5_CH1來捕獲高電平脈寬,也就是要先設(shè)置輸入捕獲為上升沿檢測,記錄發(fā)生上升沿的時候TIM5_CNT的值。然后配置捕獲信號為下降沿捕獲,當(dāng)下降沿到來時,發(fā)生捕獲
12、,并記錄此時的TIM5_CNT值。這樣,前后兩次TIM5_CNT之差,就是高電平的脈寬,同時TIM5的計數(shù)頻率我們是知道的,從而可以計算出高電平脈寬的準(zhǔn)確時間。輸入捕獲的配置步驟:1)開啟TIM5時鐘和GPIOA時鐘,配置PA0為下拉輸入。要使用TIM5,我們必須先開啟TIM5的時鐘。這里我們還要配置PA0為下拉輸入,因為我們要捕獲TIM5_CH1上面的高電平脈寬,而TIM5_CH1是連接在PA0上面的。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);/使能TIM5時鐘RCC_APB2PeriphClockCmd(RCC_APB2Perip
13、h_GPIOA,ENABLE);/使能GPIOA時鐘2)初始化TIM5,設(shè)置TIM5的ARR和PSC。在開啟了TIM5的時鐘之后,我們要設(shè)置ARR和PSC兩個寄存器的值來設(shè)置輸入捕獲的自動重裝載值和計數(shù)頻率。這在庫函數(shù)中是通過TIM_TimeBaseInit函數(shù)實現(xiàn)的點擊(此處)折疊或打開TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=arr;/設(shè)定計數(shù)器自動重裝值TIM_TimeBaseStructure.TIM_Prescaler=psc;/設(shè)置預(yù)分頻值TIM_TimeBaseSt
14、ructure.TIM_ClockDivision=TIM_CKD_DIV1;/ TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/TIM 向上計數(shù)模式TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);3)設(shè)置(shzh)TIM5的輸入比較參數(shù),開啟(kiq)輸入捕獲輸入(shr)比較參數(shù)的設(shè)置包括映射關(guān)系,濾波,分頻以及捕獲方式等。這里我們需要設(shè)置通道1為輸入模式,且IC1映射到TI1(通道1)上面,并且不使用濾波(提高響應(yīng)速度)器,上升沿捕獲。庫函數(shù)是通過
15、TIM_ICInit函數(shù)來初始化輸入比較參數(shù)的:voidTIM_ICInit(TIM_TypeDef*TIMx,TIM_ICInitTypeDef*TIM_ICInitStruct);同樣,我們來看看參數(shù)設(shè)置結(jié)構(gòu)體TIM_ICInitTypeDef的定義:點擊(此處)折疊或打開typedefstructuint16_t TIM_Channel;/設(shè)置通道uint16_t TIM_ICPolarity;/設(shè) 置 輸 入 信 號 的 有效 捕獲 極性uint16_t TIM_ICSelection;/設(shè)置映射關(guān)系uint16_t TIM_ICPrescaler;/設(shè)置 輸入捕獲分頻系數(shù)uint16
16、_t TIM_ICFilter;/設(shè)置濾波器長度TIM_ICInitTypeDef;配置代碼是:點擊(此處)折疊或打開TIM_ICInitTypeDef TIM5_ICInitStructure;TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1;/選擇輸入端 IC1 映射到 TI1 上TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;/上升沿捕獲TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;/映射到 TI1
17、上TIM5_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;/配置輸入分頻,不分頻TIM5_ICInitStructure.TIM_ICFilter=0 x00;/IC1F=0000 配置輸入濾波器 不濾波TIM_ICInit(TIM5,&TIM5_ICInitStructure);4)使能捕獲和更新中斷(設(shè)置TIM5的DIER寄存器)因為我們要捕獲的是高電平信號的脈寬,所以,第一次捕獲是上升沿,第二次捕獲時下降沿,必須在捕獲上升沿之后,設(shè)置捕獲邊沿為下降沿,同時,如果脈寬比較長,那么定時器就會溢出,對溢出必須做處理,否則結(jié)果就不準(zhǔn)了。這兩件事,我
18、們都在中斷里面做,所以必須開啟捕獲中斷和更新中斷。這里我們使用定時器的開中斷函數(shù)TIM_ITConfig即可使能捕獲和更新中斷:TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/允許更新中斷和捕獲中斷5)設(shè)置中斷分組,編寫中斷服務(wù)函數(shù)設(shè)置中斷分組主要是通過函數(shù)NVIC_Init()來完成。分組完成后,我們還需要在中斷函數(shù)里面完成數(shù)據(jù)處理和捕獲設(shè)置等關(guān)鍵操作,從而實現(xiàn)高電平脈寬統(tǒng)計。在中斷服務(wù)函數(shù)里面,跟以前的外部中斷和定時器中斷實驗中一樣,我們在中斷開始的時候要進行中斷類型判斷,在中斷結(jié)束的時候要清除中斷標(biāo)志位。使用到的函數(shù)分別為TIM_G
19、etITStatus()函數(shù)和TIM_ClearITPendingBit()函數(shù)。if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)/判斷是否為更新中斷if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)/判斷是否發(fā)生捕獲事件TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update);/清除中斷和捕獲標(biāo)志位6)使能定時器(設(shè)置(shzh)TIM5的CR1寄存器)最后,必須(bx)打開定時器的計數(shù)器開關(guān),啟動(qdng)TIM5的計數(shù)器,開始輸入捕獲。TIM_Cmd(TIM5
20、,ENABLE);/使能定時器5例程:點擊(此處)折疊或打開#includetimer.h#includeled.h#includeusart.h/* 定時器5通道1輸入捕獲配置*/voidTIM5_Cap_Init(u16 arr,u16 psc)GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM5_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphCloc
21、kCmd(RCC_APB1Periph_TIM5,ENABLE);/*使能TIM5時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*使能GPIOA時鐘*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;/*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;/*PA0 輸入*/GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);/*PA0 下拉*/*初始化定時器5 TIM5*/
22、TIM_TimeBaseStructure.TIM_Period=arr;/*設(shè)定計數(shù)器自動重裝值 */TIM_TimeBaseStructure.TIM_Prescaler=psc;/*預(yù)分頻器 */TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/*設(shè)置時鐘分割:TDTS = Tck_tim*/TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/*TIM向上計數(shù)模式*/TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);/*根據(jù)T
23、IM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位*/* 初始化TIM5輸入捕獲參數(shù) */TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1;/*CC1S=01 選擇輸入端 IC1映射到TI1上*/TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;/*上升沿捕獲*/TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;/*映射到TI1上*/TIM5_ICInitStructure.TIM
24、_ICPrescaler=TIM_ICPSC_DIV1;/*配置輸入分頻,不分頻*/TIM5_ICInitStructure.TIM_ICFilter=0;/*IC1F=0000 配置(pizh)輸入濾波器 不濾波*/TIM_ICInit(TIM5,&TIM5_ICInitStructure);/*中斷(zhngdun)分組初始化*/NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;/*TIM5中斷(zhngdun)*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;/*先占優(yōu)先級2級*/NV
25、IC_InitStructure.NVIC_IRQChannelSubPriority=0;/*從優(yōu)先級0級*/NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/*IRQ通道被使能*/NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);/*允許更新中斷 ,允許CC1IE捕獲中斷*/TIM_Cmd(TIM5,ENABLE);/*使能定時器5*/u8 TIM5CH1_CAPTURE_STA=0;/輸入捕獲狀態(tài)u16TIM5CH1_CAPTURE_
26、VAL;/輸入捕獲值/* 定時器5中斷服務(wù)程序*/voidTIM5_IRQHandler(void)if(TIM5CH1_CAPTURE_STA&0X80)=0)/還未成功捕獲if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)if(TIM5CH1_CAPTURE_STA&0X40)/已經(jīng)捕獲到高電平了if(TIM5CH1_CAPTURE_STA&0X3F)=0X3F)/高電平太長了TIM5CH1_CAPTURE_STA|=0X80;/標(biāo)記成功捕獲了一次TIM5CH1_CAPTURE_VAL=0XFFFF;elseTIM5CH1_CAPTURE_STA+
27、;if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)if(TIM5CH1_CAPTURE_STA&0 x40)TIM5CH1_CAPTURE_STA|=0X80;/標(biāo)記成功捕獲到一次上升沿TIM5CH1_CAPTURE_VAL=TIM_GetCounter(TIM5);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);/CC1P=0 設(shè)置為上升沿捕獲elseTIM5CH1_CAPTURE_STA=0;/清空(qn kn)TIM5CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM5,0);
28、TIM5CH1_CAPTURE_STA|=0X40;/標(biāo)記捕獲(bhu)到了上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);/CC1P=1 設(shè)置(shzh)為下降沿捕獲TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update);/*清除中斷標(biāo)志位*/點擊(此處)折疊或打開externu8 TIM5CH1_CAPTURE_STA;/輸入捕獲狀態(tài) externu16TIM5CH1_CAPTURE_VAL;/輸入捕獲值intmain(void)u32 temp=0;delay_init(); /
29、延時函數(shù)初始化NVIC_Configuration();/設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級uart_init(9600);/串口初始化為9600LED_Init();/LED端口初始化TIM5_Cap_Init(0XFFFF,72-1);/以1Mhz的頻率計數(shù)while(1)delay_ms(10);if(TIM5CH1_CAPTURE_STA&0X80)/成功捕獲到了一次上升沿temp=TIM5CH1_CAPTURE_STA&0X3F;temp*=65536;/溢出時間總和temp+=TIM5CH1_CAPTURE_VAL;/得到總的高電平時間printf(HIGH:%
30、d usrn,temp);/打印總的高點平時間TIM5CH1_CAPTURE_STA=0;/開啟下一次捕獲以下筆記始發(fā)于觀海聽濤,原創(chuàng)(yun chun)人Apache,轉(zhuǎn)載請說明輸入捕獲作為定時器的一個功能,在工業(yè)測速上有很大的應(yīng)用。STM32的一些定時器具有四個外部(wib)通道,可利用一個定時器采集外部四路脈沖頻率,節(jié)約硬件資源和軟件代碼如需要測量(cling)一個或多個外部方波脈沖頻率,頻率低于單片機運行頻率,可如下操作:(以TIM4為例)初始化:(省略GPIO配置,將TIM4的四個通道引腳配置為上拉或浮空輸入,省略定時器RCC配置,省略中斷NVIC配置)void TIM_Config
31、uration(void) TIM_ICInitTypeDefTIM_ICInitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; / TIM4 時基TIM_DeInit(TIM4);TIM_TimeBaseStructure.TIM_Period =0 xffff; /自動重裝值 TIM_TimeBaseStructure.TIM_Prescaler =719; /預(yù)分頻值, 使TIMx_CLK=1MHzTIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; /輸入時鐘不分頻
32、TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; /向上計數(shù) TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);/TIM4_TimeBase/TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP; /輸入捕捉方式TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;/|TIM_Channel_2; /輸入通道TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolari
33、ty_Rising; /捕捉上升沿TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; /捕捉中斷TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; /捕捉不分頻TIM_ICInitStructure.TIM_ICFilter =0 x0; /捕捉輸入不濾波TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;/|TIM_Channel_2; /輸入
34、通道TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; /捕捉上升沿TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; /捕捉中斷TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; /捕捉不分頻TIM_ICInitStructure.TIM_ICFilter =0 x0; /捕捉輸入不濾波TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ICInitStructure
35、.TIM_Channel = TIM_Channel_3 ;/|TIM_Channel_2; /輸入(shr)通道TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; /捕捉(bzhu)上升沿TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; /捕捉(bzhu)中斷TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; /捕捉不分頻TIM_ICInitStructure.TIM_ICFilter =0 x0;
36、 /捕捉輸入不濾波TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_4 ;/|TIM_Channel_2; /輸入通道TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; /捕捉上升沿TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; /捕捉中斷TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_D
37、IV1; /捕捉不分頻TIM_ICInitStructure.TIM_ICFilter =0 x0; /捕捉輸入不濾波TIM_ICInit(TIM4, &TIM_ICInitStructure);/* TIM enable counter */TIM_Cmd(TIM4, ENABLE);/* Enable the CC2 Interrupt Request */TIM_ITConfig(TIM4,TIM_IT_CC1, ENABLE);TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);TI
38、M_ITConfig(TIM4, TIM_IT_CC4,ENABLE);復(fù)制代碼其中:TIM_TimeBaseStructure.TIM_Period = 0 xffff;為自動重裝值,與普通單片機一樣TIM_TimeBaseStructure.TIM_Prescaler = 719; 預(yù)分頻值, 使TIMx_CLK=100KHz ,系統(tǒng)時鐘運行于72M時720分頻,定時器運行于100KHZ,即10us每分度TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; 此句選擇定時器為輸入捕獲模式,但在我的庫函數(shù)下未定義,所以注釋掉,未影響程序執(zhí)行TIM_
39、ICInitStructure.TIM_Channel = TIM_Channel_1;配置通道1TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;上升沿捕獲TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;捕獲中斷TIM_ICInitStructure.TIM_ICFilter = 0 x0;不濾波TIM_ICInit(TIM4, &TIM_ICInitStructure);將配置應(yīng)用以上每個通道都需要將整個配置再寫一遍,使用與|是無效的。TIM_C
40、md(TIM4, ENABLE);使能定時器4TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);打開四個通道的捕獲中斷以上將TIM配置完成,下面是中斷內(nèi)代碼:voidTIM4_IRQHandler(void) /頻率(pnl)緩沖區(qū)計數(shù)static u16 this_time_CH1 = 0;static u16last_time_CH
41、1 = 0;static u8 capture_number_CH1 = 0;vu16tmp16_CH1;static u16 this_time_CH2 = 0;static u16 last_time_CH2 = 0;static u8 capture_number_CH2 = 0;vu16 tmp16_CH2;static u16 this_time_CH3 = 0;static u16 last_time_CH3 = 0;static u8 capture_number_CH3 = 0;vu16 tmp16_CH3;static u16 this_time_CH4 = 0;static
42、 u16 last_time_CH4 = 0;static u8 capture_number_CH4 = 0;vu16 tmp16_CH4;if(TIM_GetITStatus(TIM4, TIM_IT_CC1) = SET) TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); if(capture_number_CH1 = 0) capture_number_CH1 = 1; last_time_CH1 = TIM_GetCapture1(TIM4); else if(capture_number_CH1 = 1) capture_number_CH1 = 0
43、; this_time_CH1 = TIM_GetCapture1(TIM4); if(this_time_CH1 last_time_CH1) tmp16_CH1 = (this_time_CH1 - last_time_CH1); elsetmp16_CH1 = (0 xFFFF - last_time_CH1) + this_time_CH1); /TIM2counter clock = 1MHzFreqBufcnt = (1000000L * 100) /tmp16; /*100為擴大顯示(xinsh)量程 Freq_Value0=tmp16_CH1; if(TIM_GetITStat
44、us(TIM4, TIM_IT_CC2) = SET)TIM_ClearITPendingBit(TIM4, TIM_IT_CC2); if(capture_number_CH2 = 0)capture_number_CH2 = 1;last_time_CH2 = TIM_GetCapture2(TIM4); else if(capture_number_CH2 = 1)capture_number_CH2 = 0;this_time_CH2 = TIM_GetCapture2(TIM4);if(this_time_CH2 last_time_CH2tmp16_CH2 = (this_time
45、_CH2 - last_time_CH2); elsetmp16_CH2 = (0 xFFFF - last_time_CH2) + this_time_CH2);/TIM2counter clock = 1MHzFreqBufcnt = (1000000L * 100) /tmp16; /*100為擴大顯示(xinsh)量程 Freq_Value1=tmp16_CH2;if(TIM_GetITStatus(TIM4, TIM_IT_CC3) = SET)TIM_ClearITPendingBit(TIM4, TIM_IT_CC3); if(capture_number_CH3 = 0)cap
46、ture_number_CH3 = 1;last_time_CH3 = TIM_GetCapture3(TIM4); else if(capture_number_CH3 = 1)capture_number_CH3 = 0;this_time_CH3 = TIM_GetCapture3(TIM4);if(this_time_CH3 last_time_CH3)tmp16_CH3 = (this_time_CH3 - last_time_CH3); elsetmp16_CH3 = (0 xFFFF - last_time_CH3) + this_time_CH3); /TIM2counter
47、clock = 1MHz/ FreqBufcnt = (1000000L * 100) /tmp16; /*100為擴大顯示(xinsh)量程 Freq_Value2=tmp16_CH3;if(TIM_GetITStatus(TIM4, TIM_IT_CC4) = SET) TIM_ClearITPendingBit(TIM4, TIM_IT_CC4); if(capture_number_CH4 = 0)capture_number_CH4 = 1; last_time_CH4 = TIM_GetCapture4(TIM4); else if(capture_number_CH4 = 1)c
48、apture_number_CH4 = 0;this_time_CH4 = TIM_GetCapture4(TIM4);if(this_time_CH4 last_time_CH4)tmp16_CH4 = (this_time_CH4 - last_time_CH4);elsetmp16_CH4 = (0 xFFFF - last_time_CH4) + this_time_CH4);/TIM2counter clock = 1MHzFreqBufcnt = (1000000L * 100) /tmp16; /*100為擴大顯示(xinsh)量程 Freq_Value3=tmp16_CH4;/
49、GPIO_WriteBit(GPIOC, GPIO_Pin_13,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13);復(fù)制(fzh)代碼中斷內(nèi)四部分代碼完全一樣,只分析其中一段輸入捕獲的原理是,定時器正常計數(shù)運行,當(dāng)外部脈沖到來時,將定時器計數(shù)值存起來,當(dāng)下次脈沖到來時,求出這兩次計數(shù)值差值,即為這兩段脈沖的周期。例如,定時器計數(shù)到10,外部脈沖到來,使用last_time_CH1存儲10,下次脈沖到來,此時定時器計數(shù)值運行到110,使用this_time_CH1存儲110,之后做差,tmp16_CH1存儲差值100,由于定時器運行
50、于100KHZ,10us計數(shù)值增加一次,所以脈沖周期為100*10=1000us=1ms,即為1KHZ。當(dāng)然,定時器會溢出重裝,此時需要將差值補償運算,tmp16_CH1 = (0 xFFFF - last_time_CH1) + this_time_CH1);可測量的范圍取決于定時器運行的頻率,如果外部頻率慢到當(dāng)定時器整個計數(shù)一周后也沒有觸發(fā)兩次,會發(fā)生溢出,此時計數(shù)值已不準(zhǔn)確。所以定時器時鐘配置取決于外部脈沖頻率,應(yīng)配置得當(dāng)使得脈沖頻率范圍不致溢出。由于每次外部脈沖都會觸發(fā)中斷,尤其是四通道時,所以使用中斷方式會略微占用CPU資源,使用DMA可以解決這一問題。得到脈沖周期后,即可通過運算獲
51、得外部頻率,進而測速。例程(6)This example shows how to use the TIM peripheral to measure the frequency andduty cycle of an external signal.The TIMxCLK frequency is set to 72 MHz, the Prescaler is 0 so the TIM2 counterclock is 72 MHz. so the minimum frequency value to measure is 1100 Hz.TIM2 is configured in PWM
52、Input Mode: the external signal is connected toTIM2 Channel2 used as input pin.To measure the frequency and the duty cycle we use the TIM2 CC2 interrupt request,so In the TIM2_IRQHandler routine, the frequency and the duty cycle of the externalsignal are computed.The Frequency variable contains the
53、external signal frequency:Frequency = TIM2 counter clock / TIM2_CCR2 in Hz,The Duty_Cycle variable contains the external signal duty cycle:Duty_Cycle = (TIM2_CCR1*100)/(TIM2_CCR2) in %./* Includes -*/#include stm32f10 x_lib.h/* Private typedef -*/* Private define -*/* Private macro -*/* Private vari
54、ables -*/TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_ICInitTypeDefTIM_ICInitStructure;ErrorStatus HSEStartUpStatus;/* Private function prototypes -*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);/*/int main(void)#ifdef DEBUGdebug();#endif/* System Cloc
55、ks Configuration */RCC_Configuration();/* NVIC configuration */NVIC_Configuration();/* Configure the GPIO ports */GPIO_Configuration();/* TIM2 configuration: PWM Input mode -The external signal is connected to TIM2 CH2 pin (PA.01),The Rising edge is used as active edge,The TIM2 CCR2 is used to compu
56、te the frequency valueThe TIM2 CCR1 is used to compute the duty cycle value- */TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_PWMI;/TIM使用輸入(shr)PWM模式TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;/TIM輸入捕獲(bhu)上升沿TIM_ICInitStructure.TIM_ICSelec
57、tion = TIM_ICSelection_DirectTI;/TIM輸入(shr)2選擇對應(yīng)地與IIC2相連TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;/TIM捕獲在捕獲輸入上每探測到一個邊沿執(zhí)行一次TIM_ICInitStructure.TIM_ICFilter = 0 x0;/選擇輸入比較濾波器TIM_ICInit(TIM2, &TIM_ICInitStructure);/根據(jù)TIM_ICInitStruct中指定的參數(shù)初始化外設(shè)TIM2/* Select the TIM2 Input Trigger: TI2FP2 */T
58、IM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);/選擇TIM2輸入觸發(fā)源-TIM經(jīng)濾波定時器輸入2/* Select the slave Mode: Reset Mode */TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);/選擇TIM2從模式-選中觸發(fā)信號(TRGI)的上升沿初始化計數(shù)器并更新觸發(fā)寄存器/* Enable the Master/Slave Mode */TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);/TIM主/從模式(m
59、sh)使能/* TIM enable counter */TIM_Cmd(TIM2, ENABLE);/* Enable the CC2 Interrupt Request */TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);while (1);/* Function Name: RCC_Configuration* Description: Configures the different system clocks.* Input: None* Output: None* Return: None*/void RCC_Configuration(void)/*
60、 RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus = SUCCESS)/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* Flash 2 wait state */
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目研發(fā)專門財務(wù)制度
- 農(nóng)發(fā)資金財務(wù)制度
- 建宗祠財務(wù)制度
- 財務(wù)制度管理與銷售
- 農(nóng)發(fā)行貸款三查制度
- 養(yǎng)老院老人緊急救援人員職業(yè)道德制度
- 養(yǎng)老院老人活動參與制度
- 電廠清單化管理制度模板(3篇)
- 浮筒浮橋施工方案(3篇)
- 周口樁基施工方案(3篇)
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及參考答案詳解1套
- 2025年廣東省生態(tài)環(huán)境廳下屬事業(yè)單位考試真題附答案
- 2026年安徽省公務(wù)員考試招錄7195名備考題庫完整參考答案詳解
- 【地理】期末模擬測試卷-2025-2026學(xué)年七年級地理上學(xué)期(人教版2024)
- LoRa技術(shù)教學(xué)課件
- 統(tǒng)籌發(fā)展與安全課件
- 弱電項目實施管理方案
- 2025年山西省公務(wù)員考試《申論》試題及答案解析(縣鄉(xiāng)卷)
- 2025年法考客觀題真題回憶版(含答案)
- 2026年鐵嶺衛(wèi)生職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案詳解
- 操作系統(tǒng)安裝與配置標(biāo)準(zhǔn)
評論
0/150
提交評論