新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 定時器淺談_1

STM32 定時器淺談_1

作者: 時間:2016-11-09 來源:網絡 收藏
看了整整一周的定時器,整理一下一周來學習筆記.

本文引用地址:http://butianyuan.cn/article/201611/318029.htm

定時器的組成包括四部分:時鐘選擇單元,時基單元 ,輸入捕獲 ,輸出比較!

一,時鐘選擇單元:

內部時鐘(CK_INT)

外部時鐘模式1:外部引腳輸入

外部時鐘模式2:外部觸發(fā)輸入ETR

內部觸發(fā)輸入(ITRX):定時器級聯


二,時基單元組成

CNT計數器 :向上、 向下、中央對齊 三種計數方

PSC預分頻寄存器
ARR自動重裝載寄存器


三,輸入捕獲單元

此處應注意的是實際采樣頻率F = 1/2*Fdts{ 香儂采樣定理}

并在濾波電路處進行高頻濾波,即一些高頻波在濾波電路被濾掉


捕獲通道


這里實現了高頻濾波,當系統(tǒng)的時鐘為72MHZ時,假設選用TDTS=2*TINT

則實際采樣頻率為F=1/2(1/2*72MHZ)=18MHZ

當N(采樣次數)=4時,最大有效頻率為18/4=4.25MHZ

即大于4.25MHZ的波被濾掉

注意:TI1F濾波后的有效波形有N個延時

四,輸出比較單元

此處應注意的是輸出通道和輸入通道是同一條,應進行設置!


PWM(脈沖寬度調制)

是用數字信號對模擬信號的一種表達,上下兩個波形的面積相等,上圖為模擬信號,下圖是轉換的PWM 波形~ b的高度相同,只需改變寬度就可表示上圖分隔的面積~

PWM共有兩種模式:PWM模式1和PWM模式2 兩種模式計數方式相反

重點在占空比:

占空比:在一串理想的脈沖周期序列中(如方波),正脈沖的持續(xù)時間與脈沖總周期的比值。(百度)簡單來說就是高電平在整個時鐘周期所占的比值

影響占空比的兩個因素: 1,PWM周期 2 ,CCR寄存器里的預先放入的比較數 (可以看做高電平)

影響PWM 周期兩個因素:1 ,ARR寄存器里重裝載數值(可以看做時鐘的周期) 2 ,計數模

所以占空比=(TIMx_CRR/TIMx_ARR)%100%;

定時器編程步驟:

1. 配置優(yōu)先級; 2. 使能時鐘 3. 配置GPIO;4. 配置TIME;5.使能計數器;6.開中斷;7.清除標志位;
具體配置如下:
(1) NVIC_Configuration(void);配置優(yōu)先級
(2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能時鐘
(3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);配置GPIO
(4) TIM_Configuration (void);
(5) TIM_Cmd(TIM7, ENABLE);使能定時器
(6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中斷
(7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除標志位

奮斗板例程:

main.c

#include  "stm32f10x.h"#include  "stm32f10x_tim.h"#include  "misc.h"unsigned int CCR2_Val=13100; extern void time_ini(void);/* 名    稱:void RCC_Configuration(void)* 功    能:系統(tǒng)時鐘配置為72MHZ, 外設時鐘配置* 入口參數:無* 出口參數:無* 說    明:* 調用方法:無 / void RCC_Configuration(void){SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);}/* 名    稱:void NVIC_Configuration(void)* 功    能:中斷源配置* 入口參數:無* 出口參數:無* 說    明:* 調用方法:無 / void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn ;			   //配置定時器中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);  	}/* 名    稱:int main(void)* 功    能:主函數* 入口參數:無* 出口參數:無* 說    明:* 調用方法:無 / int main(void){    RCC_Configuration();   	                 //系統(tǒng)時鐘設置及外設時鐘使能					     NVIC_Configuration();						 //中斷源配置time_ini();								 //定時器3的初始化while(1);}

tim.c

#include "stm32f10x_tim.h"#include "stm32f10x_gpio.h"#include  	void time_ini(void);extern unsigned int CCR2_Val;TIM_TimeBaseInitTypeDef  TIM3_TimeBaseStructure;TIM_OCInitTypeDef  TIM3_OCInitStructure;TIM_BDTRInitTypeDef TIM3_BDTRInitStructure;/* 名    稱:void time_ini(void)* 功    能:TIM3初始化* 入口參數:無* 出口參數:無* 說    明:* 調用方法:無 / void time_ini(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);		    //定時器3 時鐘使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;						//PB5復用為TIM3的通道2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/* TIM3局部復用功能開啟	 在TIM3的局部復用開啟時,PB5會被復用為TIM3_CH2*/GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);	/* Time Base configuration *//*-------------------------------------------------------------------TIM3CLK=72MHz  預分頻系數Prescaler=63 經過分頻 定時器時鐘為1.125MHz捕獲/比較寄存器2 TIM3_CCR2= CCR2_Val 2通道產生的更新頻率是=1.125MHz/CCR2_Val=25Hz-------------------------------------------------------------------*/TIM3_TimeBaseStructure.TIM_Prescaler = 63;						//預分頻器TIM3_PSC=63	 TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//計數器向上計數模式 TIM3_CR1[4]=0TIM3_TimeBaseStructure.TIM_Period =0xffff;				        //自動重裝載寄存器TIM3_APR      		     TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;					//時鐘分頻因子 TIM3_CR1[9:8]=00TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);					//寫TIM3各寄存器參數TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;				//TIM3_CCMR1[14:12]=011  翻轉 當TIM3_CCR2=TIM3_CNT時,翻轉OC2REF的電平 // TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//輸入/捕獲2輸出允許  OC2信號輸出到對應的輸出引腳PB5TIM3_OCInitStructure.TIM_Pulse =CCR2_Val;						    //若CC1通道配置為輸出:CCR2是裝入當前捕獲/比較2 TIM3_CCR2寄存器的值(預裝載值)。//當前捕獲/比較寄存器包含了與計數器TIM3_CNT比較的值,并且在OC端口上輸出信號TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;			//輸出極性  低電平有效 TIM3_CCER[5]=1;TIM_OC2Init(TIM3, &TIM3_OCInitStructure);TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);			    //TIM3_CCMR1[1]=0  禁止TIM3_CCR2寄存器的預裝載功能,可隨時寫入TIM3_CCR2//且新值馬上起作用	  TIM_Cmd(TIM3,ENABLE);											//啟動定時器3 TIM3_CR1[0]=1;  TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE); 							//TIM3_DIER[2]=1  允許捕獲/比較2中斷}

it.c

void TIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET){TIM_ClearITPendingBit (TIM3,TIM_IT_CC2);capture1=TIM_GetCapture2(TIM3);TIM_SetCompare2(TIM3,capture1+CCR2_Val);  	}}

當我們把tim.c中的TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;

換成:TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;時可以看到占空一個近似于1:2的占空比波形圖



關鍵詞: stm32定時

評論


技術專區(qū)

關閉