STM32單片機(jī)測量方波頻率方法總結(jié)_第1頁
STM32單片機(jī)測量方波頻率方法總結(jié)_第2頁
STM32單片機(jī)測量方波頻率方法總結(jié)_第3頁
STM32單片機(jī)測量方波頻率方法總結(jié)_第4頁
STM32單片機(jī)測量方波頻率方法總結(jié)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

STM32單?機(jī)測量?波頻率?法總結(jié)?、測周法:通過?個?波的兩個上升沿或下降沿觸發(fā)中斷,然后定時器計數(shù),計數(shù)的總個數(shù)乘以計數(shù)單位時間即該?波的周期,具體可通過單?機(jī)輸?捕獲功能實(shí)現(xiàn),以下為參考代碼//輸?捕獲初始化函數(shù)voidinput_frequent_init(void)//采?TIM4的Channel_1通道作為輸?捕獲通道{//聲明結(jié)構(gòu)體變量,?來初始化定時器TIM_TimeBaseInitTypeDefTIM4_TimeBaseInitStructure;TIM_ICInitTypeDefTIM4_ICInitStructure;NVIC_InitTypeDefTIM4_NVIC_InitStructure;/*開啟定時器4時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC1);//清除捕獲和中斷標(biāo)志位TIM4_TimeBaseInitStructure.TIM_Period=0xffff;//設(shè)定計數(shù)器?動重裝值(設(shè)置為最?)TIM4_TimeBaseInitStructure.TIM_Prescaler=1;//設(shè)置分頻系數(shù)TIM4_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設(shè)置時鐘分割:TDTS=Tck_timTIM4_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計數(shù)模式TIM_TimeBaseInit(TIM4,&TIM4_TimeBaseInitStructure);//根據(jù)結(jié)構(gòu)體參量初始化定時器TIM4_ICInitStructure.TIM_Channel=TIM_Channel_1;//選擇輸?捕獲的輸?端,IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//設(shè)置為上升沿捕獲TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置輸?分頻,不分頻TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置輸?濾波器,此處不濾波TIM_ICInit(TIM4,&TIM4_ICInitStructure);//初始化TIM4通道1//中斷分組初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);TIM4_NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//打開TIM4的全局中斷TIM4_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//搶占優(yōu)先級配置為1TIM4_NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//響應(yīng)優(yōu)先級配置為1TIM4_NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能NVIC_Init(&TIM4_NVIC_InitStructure);//初始化中斷

TIM_Cmd(TIM4,ENABLE);//使能中斷TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC1,ENABLE);//使能捕獲和更新中斷}需要注意的是,如果所測信號中存在尖峰?擾信號,則TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置輸?濾波器,此處不濾波這??應(yīng)根據(jù)?擾信號的?電平時間來賦予合適的濾波器的值,具體計算?法參考芯??冊或??百度。voidTIM4_IRQHandler()//輸?捕獲中斷函數(shù){staticu8state;//存儲捕獲狀態(tài),state=0表?未捕獲到第?個上升沿,state=1表?已經(jīng)捕獲到第?個上升沿staticu32TIM4CH1_CAPTURE;//存儲TIM4計數(shù)寄存器溢出次數(shù)u32timecount;//存儲總的計數(shù)次數(shù)if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)//發(fā)?計數(shù)器溢出更新中斷{TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);//清除中斷標(biāo)志位if(state==1)//在捕獲到第?個上升沿后TIM4CH1_CAPTURE++;//溢出次數(shù)加?}if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET)//產(chǎn)?輸?捕獲中斷{TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);//清除中斷標(biāo)志位if(state==0)//未捕獲到第?個上升沿{state=1;//置1TIM_SetCounter(TIM4,0);//將計數(shù)器清零}elseif(state==1)//已經(jīng)捕獲到第?個上升沿{state=0;//置0timecount=TIM_GetCapture1(TIM4)+TIM4CH1_CAPTURE*65536;//計算兩個上升沿之間的總計數(shù)

TIM4CH1_CAPTURE=0;//清零溢出次數(shù)TIM_SetCounter(TIM4,0);//清零計數(shù)器frequent_input=36000000.0/timecount;//計算頻率}}}注意:根據(jù)所測頻率?致范圍來配置定時器(可提?測量精度)該?法可精確測量較低頻率,本?測試1k以下精確度?達(dá)0.1%,但隨著頻率的增加,誤差也越來越?,故測低頻時推薦此?法接下來的程序還可測量占空?,思路是先設(shè)置為上升沿捕獲,然后設(shè)置為下降沿捕獲,在設(shè)置為上升沿捕獲,根據(jù)兩次捕獲中計數(shù)次數(shù)算出占空?duty=捕獲?電平時間/(捕獲?電平時間+捕獲低電平時間)定時器輸?捕獲配置同上(改?TIM5,TIM分頻系數(shù)改為143,TIM_Prescaler=143),不在重復(fù),直接看中斷函數(shù)voidTIM5_IRQHandler(){if((TIM5CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲{if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET){if(TIM5CH1_CAPTURE_STA&0X20)//已經(jīng)捕獲到?電平{if((TIM5CH1_CAPTURE_STA&0x1f)==0x1f)//?電平時間太長了{(lán)TIM5CH1_CAPTURE_STA|=0x80;//標(biāo)記成功捕獲?次}else{TIM5CH1_CAPTURE_STA++;//溢出次數(shù)加1}}}}if(TIM_GetITStatus(TIM5,TIM_IT_CC4)!=RESET)//發(fā)?捕獲事件

{if((TIM5CH1_CAPTURE_STA&0X20)&&(!(TIM5CH1_CAPTURE_STA&0X40)))//已經(jīng)捕獲到上升沿{TIM5CH1_CAPTURE_STA|=0X40;//標(biāo)記成功捕獲?次下降沿TIM5CH1_CAPTURE_VAL1=TIM_GetCapture4(TIM5)+(TIM5CH1_CAPTURE_STA&0X1f)*65536;//獲得TIM5捕獲通道?的捕獲值(對應(yīng)?電平時間)TIM_SetCounter(TIM5,0);//清零計數(shù)器TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising);//設(shè)置為上升沿捕獲TIM5CH1_CAPTURE_STA&=0Xe0;//溢出次數(shù)清零}elseif((TIM5CH1_CAPTURE_STA&0X20)==0)//未捕獲到上升沿{TIM5CH1_CAPTURE_STA=0;//清零標(biāo)志位及溢出次數(shù)TIM5CH1_CAPTURE_VAL1=0;//清零?電平計數(shù)TIM5CH1_CAPTURE_VAL2=0;//清零低電平計數(shù)TIM_SetCounter(TIM5,0);//清零TIM5計數(shù)寄存器TIM5CH1_CAPTURE_STA|=0X20;//置標(biāo)志位TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Falling);//設(shè)置為下降沿捕獲}elseif((TIM5CH1_CAPTURE_STA&0X40)&&(!(TIM5CH1_CAPTURE_STA&0X80)))//已經(jīng)捕獲到下降沿{TIM5CH1_CAPTURE_VAL2=TIM_GetCapture4(TIM5)+(TIM5CH1_CAPTURE_STA&0X1f)*65536;//低電平計數(shù)(對應(yīng)低電平時間)TIM5CH1_CAPTURE_STA|=0X80;//置標(biāo)志位}}TIM_ClearITPendingBit(TIM5,TIM_IT_CC4|TIM_IT_Update);//清中斷標(biāo)志位}主函數(shù)u8TIM5CH1_CAPTURE_STA;//u16TIM5CH1_CAPTURE_VAL1;//u16TIM5CH1_CAPTURE_VAL2;//floatfrequent;floatduty;intmain(){

input_duty_init();while(1){if((TIM5CH1_CAPTURE_STA&0x80))//{duty=(float)TIM5CH1_CAPTURE_VAL1/(TIM5CH1_CAPTURE_VAL1+TIM5CH1_CAPTURE_VAL2);//計算占空?frequent+=500000.0/(TIM5CH1_CAPTURE_VAL1+TIM5CH1_CAPTURE_VAL2);//計算頻率TIM5CH1_CAPTURE_STA=0;//清零標(biāo)志位}}}這個程序中變量TIM5CH1_CAPTURE_STA的?三位作為輸?捕獲狀態(tài)的標(biāo)志位,具體每?位的作?不在詳細(xì)解釋,憑借?學(xué)能?完全可以解決。該?法測量誤差同樣在頻率?較低時精確度很?,但隨著頻率的增?誤差也越來越?。?、測頻法通過在?定時間內(nèi)檢測跳邊沿的個數(shù)可計算出頻率頻率=上升沿或下降沿個數(shù)/統(tǒng)計時間具體實(shí)現(xiàn)有兩種?法。1.利?外部中斷統(tǒng)計跳邊沿個數(shù),配置?個定時器每隔?定時間對頻率進(jìn)?計算,部分代碼如下voidexti_init()//外部中斷初始化函數(shù){GPIO_InitTypeDefGPIO_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;/*開啟GPIO和管腳復(fù)?時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*GPIO配置*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);//選擇GPIO引腳?作外中段段線路//此處?定要記住給端?管腳加上中斷外部線路/*設(shè)置外部中斷模式*/EXTI_InitStructure.EXTI_Line=EXTI_Line2;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿進(jìn)中斷EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);/*設(shè)置NVIC參數(shù)*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;//打開EXTI2的全局中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//設(shè)置優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能NVIC_Init(&NVIC_InitStructure);}外部中斷中斷函數(shù)voidEXTI2_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line2)==SET){EXTI_ClearITPendingBit(EXTI_Line0);//清中斷if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==Bit_RESET)//確定沿{cnt++;}}}

定時器中斷函數(shù)voidTIM3_IRQHandler(){frequent=cnt;//定時器設(shè)置時間為1s時cnt=0;//清零計數(shù)cntTIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清標(biāo)志位}該?法在實(shí)測300K以下頻率誤差很?,?概在0-20Hz左右,根據(jù)規(guī)律可以進(jìn)?線性分段補(bǔ)償,補(bǔ)償后誤差可控制在0-2Hz,但是隨著頻率升?,誤差將越來越?不可彌補(bǔ)。2.采?定時器外部計數(shù)的?法,另外?個定時器負(fù)責(zé)每隔?段時間計算頻率,部分代碼如下voidtime_init(){GPIO_InitTypeDefGPIO_InitStructure;TIM_TimeBaseInitTypeDefTIM2_TimeBaseInitStructure;TIM_TimeBaseInitTypeDefTIM3_TimeBaseInitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除TIM2中斷標(biāo)志位TIM2_TimeBaseInitStructure.TIM_Period=0xFFFF;//設(shè)置?動重裝載值TIM2_TimeBaseInitStructure.TIM_Prescaler=0;//設(shè)置分頻TIM2_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM2_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數(shù)TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseInitStructure);TIM_ETRClockMode1Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);//設(shè)

置為采?外部時鐘計數(shù),可設(shè)定濾波參數(shù)消除信號?擾TIM_Cmd(TIM2,ENABLE);TIM_ClearITPendingBit(TIM3,TIM_IT_Update);TIM3_TimeBaseInitStructure.TIM_Period=999;TIM3_TimeBaseInitStructure.TIM_Prescaler=3599;TIM3_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM3_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStructure

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論