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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32的定時(shí)器輸入捕獲與輸出比較

          stm32的定時(shí)器輸入捕獲與輸出比較

          作者: 時(shí)間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          明確一點(diǎn)對(duì)比AD的構(gòu)造,stm32有3個(gè)AD,每個(gè)AD有很多通道,使用哪個(gè)通道就配置成哪個(gè)通道,這里定時(shí)器也如此,有很多定時(shí)器TIMx,每個(gè)定時(shí)器有很多CHx(通道),可以配置為輸入捕捉-------測(cè)量頻率用,也可以配置為輸出比較--------輸出PWM使用

          輸入捕捉:可以用來捕獲外部事件,并為其賦予時(shí)間標(biāo)記以說明此事件的發(fā)生時(shí)刻。

          外部事件發(fā)生的觸發(fā)信號(hào)由單片機(jī)中對(duì)應(yīng)的引腳輸入(具體可以參考單片機(jī)的datasheet),也可以通過模擬比較器單元來實(shí)現(xiàn)。

          時(shí)間標(biāo)記可用來計(jì)算頻率,占空比及信號(hào)的其他特征,以及為事件創(chuàng)建日志,主要是用來測(cè)量外部信號(hào)的頻率。

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

          另外還有個(gè)比較寄存器。一旦計(jì)數(shù)寄存器在從bottom到top計(jì)數(shù)過程中與比較寄存器匹配則會(huì)產(chǎn)生比較中斷(比較中斷使能的情況下)。

          然后根據(jù)不同的工作模式計(jì)數(shù)寄存器將清零或者計(jì)數(shù)到top值。

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

          1、朋友,可以解釋一下輸入捕獲的工作原理不?

          很簡(jiǎn)單,當(dāng)你設(shè)置的捕獲開始的時(shí)候,cpu會(huì)將計(jì)數(shù)寄存器的值復(fù)制到捕獲比較寄存器中并開始計(jì)數(shù),當(dāng)再次捕捉到電平變化時(shí),這是計(jì)數(shù)寄存器中的值減去剛才復(fù)制的值就是這段電平的持續(xù)時(shí)間,你可以設(shè)置上升沿捕獲、下降沿捕獲、或者上升沿下降沿都捕獲。它沒多大用處,最常用來測(cè)頻率。

          計(jì)數(shù)寄存器的初值,是自己寫進(jìn)去的嗎?

          是的,不過默認(rèn)不要寫入

          我如果捕獲上升沿,兩個(gè)值相減,代表的時(shí)兩個(gè)上升沿中間那段電平的時(shí)間。對(duì)不?

          是的

          timer1有五個(gè)通道(對(duì)應(yīng)五個(gè)IO引腳),在同一時(shí)刻,只能捕獲一個(gè)引腳的值,對(duì)不?

          那是肯定的,通道很像ADC通道,是可以進(jìn)行切換的。

          那輸出比較的原理你可以幫我介紹一下不?

          這里有兩個(gè)單元:一個(gè)計(jì)數(shù)器單元和一個(gè)比較單元,比較單元就是個(gè)雙緩沖寄存器,比較單元的值是可以根據(jù)不同的模式設(shè)置的,與此同時(shí),計(jì)數(shù)器在不停的計(jì)數(shù),并不停的與比較寄存器中的值進(jìn)行比較,當(dāng)計(jì)數(shù)器的值與比較寄存器的值相等的時(shí)候一個(gè)比較匹配就發(fā)生了,根據(jù)自己的設(shè)置,匹配了是io電平取反、變低、還是變高,就會(huì)產(chǎn)生不同的波形了。

          比較單元的值是人為設(shè)進(jìn)去的吧?

          是的,但是他要根據(jù)你的控制寄存器的配置,來初始化你的比較匹配寄存器。

          上面這個(gè)總看不懂,好像不不止你說的那幾種情況:“匹配了是io電平取反、變低、還是變高,就會(huì)產(chǎn)生不同的波形了”

          就是比較匹配了你要IO電平怎么辦?是清0還是置1?還是怎么樣?這樣才能產(chǎn)生波形啊要不然你要比較單元有什么用呢?

          設(shè)置輸出就是置1,清除輸出就是置0,切換輸出就是將原來的電平取反,對(duì)不?

          是的你理解的很快

          011:計(jì)數(shù)器向上計(jì)數(shù)達(dá)到最大值時(shí)將引腳置1,達(dá)到0時(shí),引腳電平置0,,對(duì)不?

          定時(shí)器1的輸出比較模式怎么用。利用這個(gè)功能輸出一個(gè)1KHZ,占空比為10%的程序怎么寫啊?求高人指點(diǎn)

          1、陪定時(shí)器1的功能為特殊功能,不是普通IO在PERCFG這里
          2、P1SEL引腳選擇
          3、P1DIR設(shè)為輸出
          4、T3CC0設(shè)置周期
          5、T3CC1設(shè)置占空比
          6、T3CCTL0 設(shè)置通道0
          7、T3CCTL1 設(shè)置通道1
          8、T3CTL設(shè)為模模式
          9、用T3CTL打開即可

          ************以下是用定時(shí)器做頻率源,用定時(shí)器測(cè)量該頻率的應(yīng)用程序?。?!***********

          調(diào)試STM32的定時(shí)器好幾天了,也算是對(duì)STM32的定時(shí)器有了點(diǎn)清楚的認(rèn)識(shí)了。我需要測(cè)量4路信號(hào)的頻率然后通過DMA將信號(hào)的頻率傳輸?shù)酱鎯?chǔ)器區(qū)域,手冊(cè)說的很明白每個(gè)定時(shí)器有4個(gè)獨(dú)立通道。然后我就想能不能將這4路信號(hào)都連接到一個(gè)定時(shí)器的4個(gè)通道上去。理論上應(yīng)該是行的通的。剛開始俺使用的是 TIM2的123通道,TIM4的2通道來進(jìn)行頻率的測(cè)量。由于沒有頻率發(fā)生器,所以我用tim3作為信號(hào)源,用TIM2,TIM4來進(jìn)行測(cè)量就ok了(剛好4個(gè)通道了)。

            請(qǐng)看一開始的程序,以TIM2的1,3通道為例子(2通道設(shè)置方法一樣):

            TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP; //配置為輸入捕獲模式

            TIM_ICInitStructure.TIM_Channel =TIM_Channel_1; //選擇通道1

            TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //輸入上升沿捕獲

            TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //通道方向選擇

            TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //每次檢測(cè)到捕獲輸入就觸發(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; //選擇通道3

            TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //輸入上升沿捕獲

            TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;//

            TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //每次檢測(cè)到捕獲輸入就觸發(fā)一次捕獲

            TIM_ICInitStructure.TIM_ICFilter = 0x0; //濾波

            TIM_ICInit(TIM2, &TIM_ICInitStructure); //TIM2通道3配置完畢

            以上是輸入捕獲配置

            還需要做的工作就是(參考stm32參考手冊(cè)的TIM的結(jié)構(gòu)框圖):

            

            TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //參考TIM結(jié)構(gòu)圖選擇濾波后的TI1輸入作為觸發(fā)源,觸發(fā)下面程序的復(fù)位

            

            TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //復(fù)位模式-選中的觸發(fā)輸入(TRGI)的上升沿初始化計(jì)數(shù)器,并且產(chǎn)生一個(gè)更新線號(hào)

            

            TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

            //主從模式選擇

            這樣我們就可以很輕松的就得到了連接在TIM2的通道1上的信號(hào)的頻率,但是3通道的頻率的值永遠(yuǎn)都是跳動(dòng)的不準(zhǔn),測(cè)試了半天也沒有找到根本原因,請(qǐng)看TIM的結(jié)構(gòu)框圖的一部分

            紅色箭頭所指,這才找到原因,觸發(fā)的信號(hào)源只有這四種,而通道3上的計(jì)數(shù)器的值不可能在接受到信號(hào)的上升沿時(shí)候,有復(fù)位這個(gè)動(dòng)作,找到原因了。這就是3 通道上的數(shù)據(jù)不停跳動(dòng)的原因,要想得到信號(hào)的頻率也是有辦法的,可以取連續(xù)兩次捕捉的值之差,這個(gè)值就是信號(hào)的周期,自己根據(jù)實(shí)際情況去算頻率吧。

            有以上可以得到:

            stm32的TIM2的四個(gè)通道可以同時(shí)配置成輸入捕捉模式,但是計(jì)算CH3,CH4信號(hào)的頻率步驟有點(diǎn)繁瑣(取前后捕捉的差值),但是他的CH1,和CH2可以輕松得到:

            通道1

            

            TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //參考TIM結(jié)構(gòu)圖選擇濾波后的TI1輸入作為觸發(fā)源,觸發(fā)下面程序的復(fù)位

            

            TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //復(fù)位模式-選中的觸發(fā)輸入(TRGI)的上升沿初始化計(jì)數(shù)器,并且產(chǎn)生一個(gè)更新線號(hào)

            TIMx->CRR1的值即為信號(hào)的周期

            通道2:

            TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); //參考TIM結(jié)構(gòu)圖選擇濾波后的TI1輸入作為觸發(fā)源,觸發(fā)下面程序的復(fù)位

            

            TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //復(fù)位模式-選中的觸發(fā)輸入(TRGI)的上升沿初始化計(jì)數(shù)器,并且產(chǎn)生一個(gè)更新線號(hào)

            TIMx->CRR2的值即為信號(hào)的周期



          STM32的定時(shí)器外設(shè)功能強(qiáng)大得超出了想像力,STM32一共有8個(gè)都為16位的定時(shí)器。其中TIM6、TIM7是基本定時(shí)器;TIM2、TIM3、TIM4、TIM5是通用定時(shí)器;TIM1和TIM8是高級(jí)定時(shí)器。這些定時(shí)器使STM32具有定時(shí)、信號(hào)的頻率測(cè)量、信號(hào)的PWM測(cè)量、PWM輸出、三相6步電機(jī)控制及編碼器接口等功能,都是專門為工控領(lǐng)域量身訂做的。
          基本定時(shí)器:具備最基本的定時(shí)功能,下面是它的結(jié)構(gòu):

          我們來看看它的啟動(dòng)代碼:
          void TIM2_Configuration(void)
          { 基本定時(shí)器TIM2的定時(shí)配置的結(jié)構(gòu)體(包含定時(shí)器配置的所有元素例如:TIM_Period= 計(jì)數(shù)值)
          TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
          設(shè)置TIM2_CLK為72MHZ(即TIM2外設(shè)掛在APB1上,把它的時(shí)鐘打開。)
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);
          設(shè)置計(jì)數(shù)值位1000
          TIM_TimeBaseStructure.TIM_Period=1000;
          將TIM2_CLK為72MHZ除以72 = 1MHZ為定時(shí)器的計(jì)數(shù)頻率
          TIM_TimeBaseStructure.TIM_Prescaler= 71;
          這個(gè)TIM_ClockDivision是設(shè)置時(shí)鐘分割,這里不分割還是1MHZ的計(jì)數(shù)頻率
          TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
          設(shè)置為向上計(jì)數(shù)模式;(計(jì)數(shù)模式有向上,向下,中央對(duì)齊1,中央對(duì)齊2,中央對(duì)齊3)
          TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
          將配置好的設(shè)置放進(jìn)stm32f10x-tim.c的庫(kù)文件中
          TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
          清除標(biāo)志位
          TIM_ClearFlag(TIM2,TIM_FLAG_Update);
          使能TIM2中斷
          TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
          使能TIM2外設(shè)
          TIM_Cmd(TIM2,ENABLE);
          }
          通用定時(shí)器:就比基本定時(shí)器復(fù)雜得多了。除了基本的定時(shí),它主要用在測(cè)量輸入脈沖的頻率、脈沖寬與輸出PWM脈沖的場(chǎng)合,還具有編碼器的接口。

          我們來詳細(xì)講解:如何生成PWM脈沖
          通用定時(shí)器可以利用GPIO引腳進(jìn)行脈沖輸出,在配置為比較輸出、PWM輸出功能時(shí),捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡(jiǎn)稱為比較寄存器。
          這里直接舉例說明定時(shí)器的PWM輸出工作過程:若配置脈沖計(jì)數(shù)器TIMx_CNT為向上計(jì)數(shù),而重載寄存器TIMx_ARR(相當(dāng)于庫(kù)函數(shù)寫法的TIM_Period的值N)被配置為N,即TIMx_CNT的當(dāng)前計(jì)數(shù)值數(shù)值X在TIMxCLK時(shí)鐘源的驅(qū)動(dòng)下不斷累加,當(dāng)TIMx_CNT的數(shù)值X大于N時(shí),會(huì)重置TIMx_CNT數(shù)值為0重新計(jì)數(shù)。
          而在TIMxCNT計(jì)數(shù)的同時(shí),TIMxCNT的計(jì)數(shù)值X會(huì)與比較寄存器TIMx_CCR預(yù)先存儲(chǔ)了的數(shù)值A(chǔ)進(jìn)行比較,當(dāng)脈沖計(jì)數(shù)器TIMx_CNT的數(shù)值X小于比較寄存器TIMx_CCR的值A(chǔ)時(shí),輸出高電平(或低電平),相反地,當(dāng)脈沖計(jì)數(shù)器的數(shù)值X大于或等于比較寄存器的值A(chǔ)時(shí),輸出低電平(或高電平)。
          如此循環(huán),得到的輸出脈沖周期就為重載寄存器TIMx_ARR存儲(chǔ)的數(shù)值(N+1)乘以觸發(fā)脈沖的時(shí)鐘周期,其脈沖寬度則為比較寄存器TIMx_CCR的值A(chǔ)乘以觸發(fā)脈沖的時(shí)鐘周期,即輸出PWM的占空比為A/(N+1)。
          如果不想看的可以直接看我標(biāo)注的紅色字體,就大體可以理解。
          下面我們來編寫具體代碼和講解:
          void TIM3_GPIO_Config(void)
          {配置TIM3復(fù)用輸出PWM的IO
          GPIO_InitTypeDefGPIO_InitStructure;
          打開TIM3的時(shí)鐘
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
          打開GPIOA和GPIOB的時(shí)鐘
          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);
          }
          void TIM3_Mode_Config(void)
          {
          TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//初始化TIM3的時(shí)間基數(shù)單位
          TIM_OCInitTypeDefTIM_OCInitStructure;//初始化TIM3的外設(shè)

          u16 CCR1_Val= 500;
          u16 CCR2_Val= 375;
          u16 CCR3_Val= 250;
          u16 CCR4_Val= 125;//PWM信號(hào)電平跳變值(即計(jì)數(shù)到這個(gè)數(shù)值以后都是低電平之前都是高電平)


          TIM3的時(shí)間基數(shù)單位設(shè)置(如計(jì)數(shù)終止值:999,從0開始;計(jì)數(shù)方式:向上計(jì)數(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的外設(shè)的設(shè)置
          TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1; //TIM脈沖寬度調(diào)制模式1
          TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;//這個(gè)暫時(shí)不知道,stm32固件庫(kù)里沒有搜到。應(yīng)該是定時(shí)器輸出聲明使能的意思
          TIM_OCInitStructure.TIM_Pulse =CCR1_Val;//設(shè)置了待裝入捕獲比較寄存器的脈沖值
          TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High; //TIM輸出比較極性高
          TIM_OC1Init(TIM3,&TIM_OCInitStructure);

          TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的預(yù)裝載寄存器
          下面3路PWM輸出和上面的一樣不再解說
          TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
          TIM_OCInitStructure.TIM_Pulse =CCR2_Val;
          TIM_OC2Init(TIM3,&TIM_OCInitStructure);
          TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);


          TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
          TIM_OCInitStructure.TIM_Pulse =CCR3_Val;
          TIM_OC3Init(TIM3,&TIM_OCInitStructure);
          TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);


          TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
          TIM_OCInitStructure.TIM_Pulse =CCR4_Val;
          TIM_OC4Init(TIM3,&TIM_OCInitStructure);
          TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);


          TIM_ARRPreloadConfig(TIM3,ENABLE); //使能TIM3重載寄存器ARR


          TIM_Cmd(TIM3,ENABLE);//使能TIM3
          }
          太累了邊看邊寫都這個(gè)點(diǎn)了2014年7月27日0:24:13在自己床上寫的。下面是看看我們程序達(dá)到的4路PWM的效果:

          可以看到明顯占空比不同的4路pwm波。



          評(píng)論


          技術(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); })();