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

2020-12-23 電子產品世界
明確一點對比AD的構造,stm32有3個AD,每個AD有很多通道,使用哪個通道就配置成哪個通道,這裡定時器也如此,有很多定時器TIMx,每個定時器有很多CHx(通道),可以配置為輸入捕捉-------測量頻率用,也可以配置為輸出比較--------輸出PWM使用

輸入捕捉:可以用來捕獲外部事件,並為其賦予時間標記以說明此事件的發生時刻。

外部事件發生的觸發信號由單片機中對應的引腳輸入(具體可以參考單片機的datasheet),也可以通過模擬比較器單元來實現。

時間標記可用來計算頻率,佔空比及信號的其他特徵,以及為事件創建日誌,主要是用來測量外部信號的頻率。

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

另外還有個比較寄存器。一旦計數寄存器在從bottom到top計數過程中與比較寄存器匹配則會產生比較中斷(比較中斷使能的情況下)。

然後根據不同的工作模式計數寄存器將清零或者計數到top值。

本文引用地址:http://www.eepw.com.cn/article/201611/319379.htm

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

很簡單,當你設置的捕獲開始的時候,cpu會將計數寄存器的值複製到捕獲比較寄存器中並開始計數,當再次捕捉到電平變化時,這是計數寄存器中的值減去剛才複製的值就是這段電平的持續時間,你可以設置上升沿捕獲、下降沿捕獲、或者上升沿下降沿都捕獲。它沒多大用處,最常用來測頻率。

計數寄存器的初值,是自己寫進去的嗎?

是的,不過默認不要寫入

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

是的

timer1有五個通道(對應五個IO引腳),在同一時刻,只能捕獲一個引腳的值,對不?

那是肯定的,通道很像ADC通道,是可以進行切換的。

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

這裡有兩個單元:一個計數器單元和一個比較單元,比較單元就是個雙緩衝寄存器,比較單元的值是可以根據不同的模式設置的,與此同時,計數器在不停的計數,並不停的與比較寄存器中的值進行比較,當計數器的值與比較寄存器的值相等的時候一個比較匹配就發生了,根據自己的設置,匹配了是io電平取反、變低、還是變高,就會產生不同的波形了。

比較單元的值是人為設進去的吧?

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

上面這個總看不懂,好像不不止你說的那幾種情況:「匹配了是io電平取反、變低、還是變高,就會產生不同的波形了」

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

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

是的你理解的很快

011:計數器向上計數達到最大值時將引腳置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將信號的頻率傳輸到存儲器區域,手冊說的很明白每個定時器有4個獨立通道。然後我就想能不能將這4路信號都連接到一個定時器的4個通道上去。理論上應該是行的通的。剛開始俺使用的是 TIM2的123通道,TIM4的2通道來進行頻率的測量。由於沒有頻率發生器,所以我用tim3作為信號源,用TIM2,TIM4來進行測量就ok了(剛好4個通道了)。

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

  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; //每次檢測到捕獲輸入就觸發一次捕獲

  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; //每次檢測到捕獲輸入就觸發一次捕獲

  TIM_ICInitStructure.TIM_ICFilter = 0x0; //濾波

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

  以上是輸入捕獲配置

  還需要做的工作就是(參考stm32參考手冊的TIM的結構框圖):

  

  TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //參考TIM結構圖選擇濾波後的TI1輸入作為觸發源,觸發下面程序的復位

  

  TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //復位模式-選中的觸發輸入(TRGI)的上升沿初始化計數器,並且產生一個更新線號

  

  TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

  //主從模式選擇

  這樣我們就可以很輕鬆的就得到了連接在TIM2的通道1上的信號的頻率,但是3通道的頻率的值永遠都是跳動的不準,測試了半天也沒有找到根本原因,請看TIM的結構框圖的一部分

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

  有以上可以得到:

  stm32的TIM2的四個通道可以同時配置成輸入捕捉模式,但是計算CH3,CH4信號的頻率步驟有點繁瑣(取前後捕捉的差值),但是他的CH1,和CH2可以輕鬆得到:

  通道1

  

  TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //參考TIM結構圖選擇濾波後的TI1輸入作為觸發源,觸發下面程序的復位

  

  TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //復位模式-選中的觸發輸入(TRGI)的上升沿初始化計數器,並且產生一個更新線號

  TIMx->CRR1的值即為信號的周期

  通道2:

  TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); //參考TIM結構圖選擇濾波後的TI1輸入作為觸發源,觸發下面程序的復位

  

  TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //復位模式-選中的觸發輸入(TRGI)的上升沿初始化計數器,並且產生一個更新線號

  TIMx->CRR2的值即為信號的周期



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

我們來看看它的啟動代碼:
void TIM2_Configuration(void)
{ 基本定時器TIM2的定時配置的結構體(包含定時器配置的所有元素例如:TIM_Period= 計數值)
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
設置TIM2_CLK為72MHZ(即TIM2外設掛在APB1上,把它的時鐘打開。)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);
設置計數值位1000
TIM_TimeBaseStructure.TIM_Period=1000;
將TIM2_CLK為72MHZ除以72 = 1MHZ為定時器的計數頻率
TIM_TimeBaseStructure.TIM_Prescaler= 71;
這個TIM_ClockDivision是設置時鐘分割,這裡不分割還是1MHZ的計數頻率
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
設置為向上計數模式;(計數模式有向上,向下,中央對齊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輸出工作過程:若配置脈衝計數器TIMx_CNT為向上計數,而重載寄存器TIMx_ARR(相當於庫函數寫法的TIM_Period的值N)被配置為N,即TIMx_CNT的當前計數值數值X在TIMxCLK時鐘源的驅動下不斷累加,當TIMx_CNT的數值X大於N時,會重置TIMx_CNT數值為0重新計數。
而在TIMxCNT計數的同時,TIMxCNT的計數值X會與比較寄存器TIMx_CCR預先存儲了的數值A進行比較,當脈衝計數器TIMx_CNT的數值X小於比較寄存器TIMx_CCR的值A時,輸出高電平(或低電平),相反地,當脈衝計數器的數值X大於或等於比較寄存器的值A時,輸出低電平(或高電平)。
如此循環,得到的輸出脈衝周期就為重載寄存器TIMx_ARR存儲的數值(N+1)乘以觸發脈衝的時鐘周期,其脈衝寬度則為比較寄存器TIMx_CCR的值A乘以觸發脈衝的時鐘周期,即輸出PWM的佔空比為A/(N+1)。
如果不想看的可以直接看我標註的紅色字體,就大體可以理解。
下面我們來編寫具體代碼和講解:
void TIM3_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);
}
void TIM3_Mode_Config(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//初始化TIM3的時間基數單位
TIM_OCInitTypeDefTIM_OCInitStructure;//初始化TIM3的外設

u16 CCR1_Val= 500;
u16 CCR2_Val= 375;
u16 CCR3_Val= 250;
u16 CCR4_Val= 125;//PWM信號電平跳變值(即計數到這個數值以後都是低電平之前都是高電平)


TIM3的時間基數單位設置(如計數終止值:999,從0開始;計數方式:向上計數)
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_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
}
太累了邊看邊寫都這個點了2014年7月27日0:24:13在自己床上寫的。下面是看看我們程序達到的4路PWM的效果:

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

相關焦點

  • stm32定時器觸發adc
    stm32的ADC特點   STM32的ADC有單次轉換和連續轉換2種模式,這兩種模式又可以選擇是否結合掃描模式。 如何使stm32定時器觸發adc      STM32 ADC的常規通道可以由以上圖6個信號觸發任何一個,我們以使用TIM2_CH2觸發ADC1,獨立模式
  • STM32單片機通用定時器對lED燈的翻轉控制設計
    一、實驗目的 1)熟悉STM32通用定時器; 2)通過定時器中斷來是lED燈進行翻轉。 二、STM32通用定時器簡介 通用定時器是一個通過可編程預分頻器驅動的16位自動裝載計數器構成。它適用於多種場合,包括測量輸入信號的脈衝長度(輸入捕獲)或者產生輸出波形(輸出比較和PWM)。
  • stm32通用定時器用做外部脈衝計數器的例程
    最近幾天要用到stm32對外部輸入脈衝進行計數,很自然想到定時器,可是手上資料沒有講解stm32定時器如何用作外部計數器的,在網上找例程,也沒找到幾個正確的,自己硬著頭皮仔細研究參考手冊,終於知道如何配置了,並寫了一個例程,希望將來對一些網友有用。
  • STM32通用定時器(時鐘選擇,模式選擇)
    2、輸入捕獲。TI1FP1/2:濾波後定時器1/2的輸入TRGI:觸發輸入TRGO:觸發輸出 CK_PSC:應該叫分頻器時鐘輸入CK_CNT:定時器時鐘。(定時周期的計算就靠它)TIMx_CHx:TIMER的輸入腳TIx:應該叫做定時器輸入信號xICx:輸入比較xICxPS:分頻後的ICxOCx:輸出捕獲xOCxREF:輸出參考信號關於框圖還有以下幾點要注意:1、
  • STM32 PWM輸出
    首先確認PWM功能的輸出管腳,使用定時器9。從下面的框圖中得知,timer9隻有兩個輸出通道,所以timer9隻能輸出兩路PWM。上圖看到,①寄存器名字為:Capture/Compare1register。
  • STM32之時鐘頻率和定時器時鐘講解
    在stm32固件庫3.0中對時鐘頻率的選擇進行了大大的簡化,原先的一大堆操作都在後臺進行。系統給出的函數為SystemInit()。但在調用前還需要進行一些宏定義的設置,具體的設置在system_stm32f10x.c文件中。
  • STM32單片機的定時器和ADC的應用方法介紹
    開啟兩個定時器給FPGA使用 要求是 一、定時器可以在任何時刻關閉,就算計數不滿也要停 二、定時器在再次開啟時可以從0計數 三、定時器可以在啟動過程中停止,然後更改定時周期再開始從0計數
  • 基於STM32定時器的紅外遙控數據接收設計原理
    2、定時器計數和輸入捕獲 定時器就是按照一個特定的頻率對計數值進行加一或減一操作,當數值溢出時則產生一個標誌或中斷。 定時器的輸入捕獲就是可以測量輸入信號的脈衝寬度。 本次就是通過普通計數和輸入捕獲的結合來實現的。
  • stm32F407的TIM定時器輸出PWM波
    今天測試了stm32F407的TIM定時器輸出PWM波,了解了其配置過程。= 1){ GPIO_SetBits(GPIOG, GPIO_Pin_6); //setbits使能IO,當前下指輸出(此時為滅)}else{ GPIO_ResetBits(GPIOG, GPIO_Pin_6); //Resetbits屏蔽IO,當前下指不輸出(此時為亮)} }}/*****************
  • stm32定時器時間計算
    STM32定時器的工作原理   STM32之所以能夠實現定時,是單片機內部在計數脈衝(來自晶振)   T=1/F (F為頻率)   例如:我們以51單片機舉例,假設單片機搭配12MHz的晶振,由於51單片機是12分頻(即1個機器周期有12個時鐘周期),則單片機的最小定時時間為
  • stm32_timer基本定時器配置及實現燈閃爍
    STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。TIM1和TIM8是能夠產生3對PWM互補輸出的高級登時其,常用於三相電機的驅動,時鐘由APB2的輸出產生;TIM2-TIM5是普通定時器;TIM6和TIM7是基本定時器,其時鐘由APB1輸出產生;本文引用地址:http://www.eepw.com.cn/article/201611/317027.htm本實驗要實現的功能是:用普通定時器TIM2每一秒發生一次更新事件
  • STM32與LPC系列ARM資源比較
    這次剛好有STM32的競賽,正好將兩者的資源進行比較一下(LPC系列以LPC213X為例)。LPC213X包括LPC2131、2132、2138等, 是基於一個支持實時仿真和跟蹤的16/32 位ARM7TDMI-STM CPU,並帶有32kB、64kB 和512kB 嵌入的高速Flash 存儲器。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?   3. avr的I/O腳類似pic,它也有用來控制輸入或輸出的方向寄存器,在輸出狀態下,高電平輸出的電流在10mA左右,低電平吸入電流20mA。這點雖不如pic,但比51系列還是要優秀。   AVR單片機優點:   AVR單片機是Atmel公司推出的較為新穎的單片機,其顯著的特點為高性能、高速度、低功耗。
  • 在應用程式中使定時器或計數器改善微控制器的應用功能
    在該圖的底部的表格顯示了三種常見的自主運行模式定時器B時,MAXQ612定時器/計數器模塊:自動重載,捕獲和PP /減計數。在右上角的圖顯示了自動重載模式框圖。的時鐘輸入定時器B可以來自一個時鐘分頻器,可以劃分系統時鐘具有八個不同的設置,或從外部引腳。控制位,TRB,啟用或禁用定時器B操作。
  • CoProcessFunction實戰三部曲之三:定時器和側輸出
    本篇概覽本文是《CoProcessFunction實戰三部曲》的終篇,主要內容是在CoProcessFunction中使用定時器和側輸出,對上一篇的功能進行增強;回顧上一篇的功能:一號流收到aaa後保存在狀態中,直到二號流收到aaa,把兩個aaa的值相加後輸出到下遊;
  • 555定時器的電路結構與功能,由555定時器實現看門狗電路
    555 定時器的電源電壓範圍寬,可在 4.5V~16V 工作,7555 可在 3~18V 工作,輸出驅動電流約為 200mA,因而其輸出可與 TTL、CMOS 或者模擬電路電平兼容。      555定時器的電路結構與功能   555定時器是一種把模擬電路和開關電路結合起來的器件。
  • 555定時器產生方波原理(四款555定時器產生方波的電路詳解)
    1、555定時器原理分析           555定時器的功能主要由兩個比較器決定。兩個比較器的輸出電壓控制RS觸發器和放電管的狀態。在電源與地之間加上電壓,當5腳懸空時,則電壓比較器C1的同相輸入端的電壓為2VCC/3,C2的反相輸入端的電壓為VCC/3。若觸發輸入端 TR 的電壓小於VCC /3,則比較器 C2 的輸出為 0,可使 RS 觸發器置 1,使輸出端 OUT=1。
  • STM32開發筆記3: STM32F407定時器2-5的使用方法
    單片機型號:STM32F407    STM32F4有多種定時器,其中TIM2-TIM5稱為通用定時器,具有相似的軟體設置及使用方法。在這裡還需要注意的是TIM3和TIM4為16位定時器,TIM2和TIM5為32位定時器。
  • 555定時器及其應用
    555定時器:555定時器簡化原理圖如圖所示; 它由3個阻值為5kW的電阻組成的分壓器、兩個電壓比較器C1和C2、基本RS觸發器、放電電晶體T以及緩衝器G組成; RD為復位輸入端, 當RD為低電平時, 不管其它輸入端的狀態如何,輸出uO為低電平;