新聞中心

STM32 定時(shí)器淺談_1

作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
看了整整一周的定時(shí)器,整理一下一周來學(xué)習(xí)筆記.

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

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

一,時(shí)鐘選擇單元:

內(nèi)部時(shí)鐘(CK_INT)

外部時(shí)鐘模式1:外部引腳輸入

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

內(nèi)部觸發(fā)輸入(ITRX):定時(shí)器級聯(lián)


二,時(shí)基單元組成

CNT計(jì)數(shù)器 :向上、 向下、中央對齊 三種計(jì)數(shù)方

PSC預(yù)分頻寄存器
ARR自動(dòng)重裝載寄存器


三,輸入捕獲單元

此處應(yīng)注意的是實(shí)際采樣頻率F = 1/2*Fdts{ 香儂采樣定理}

并在濾波電路處進(jìn)行高頻濾波,即一些高頻波在濾波電路被濾掉


捕獲通道


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

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

當(dāng)N(采樣次數(shù))=4時(shí),最大有效頻率為18/4=4.25MHZ

即大于4.25MHZ的波被濾掉

注意:TI1F濾波后的有效波形有N個(gè)延時(shí)

四,輸出比較單元

此處應(yīng)注意的是輸出通道和輸入通道是同一條,應(yīng)進(jìn)行設(shè)置!


PWM(脈沖寬度調(diào)制)

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

PWM共有兩種模式:PWM模式1和PWM模式2 兩種模式計(jì)數(shù)方式相反

重點(diǎn)在占空比:

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

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

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

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

定時(shí)器編程步驟:

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

奮斗板例程:

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)時(shí)鐘配置為72MHZ, 外設(shè)時(shí)鐘配置* 入口參數(shù):無* 出口參數(shù):無* 說    明:* 調(diào)用方法:無 / 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)* 功    能:中斷源配置* 入口參數(shù):無* 出口參數(shù):無* 說    明:* 調(diào)用方法:無 / void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn ;			   //配置定時(shí)器中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);  	}/* 名    稱:int main(void)* 功    能:主函數(shù)* 入口參數(shù):無* 出口參數(shù):無* 說    明:* 調(diào)用方法:無 / int main(void){    RCC_Configuration();   	                 //系統(tǒng)時(shí)鐘設(shè)置及外設(shè)時(shí)鐘使能					     NVIC_Configuration();						 //中斷源配置time_ini();								 //定時(shí)器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初始化* 入口參數(shù):無* 出口參數(shù):無* 說    明:* 調(diào)用方法:無 / void time_ini(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);		    //定時(shí)器3 時(shí)鐘使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;						//PB5復(fù)用為TIM3的通道2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/* TIM3局部復(fù)用功能開啟	 在TIM3的局部復(fù)用開啟時(shí),PB5會(huì)被復(fù)用為TIM3_CH2*/GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);	/* Time Base configuration *//*-------------------------------------------------------------------TIM3CLK=72MHz  預(yù)分頻系數(shù)Prescaler=63 經(jīng)過分頻 定時(shí)器時(shí)鐘為1.125MHz捕獲/比較寄存器2 TIM3_CCR2= CCR2_Val 2通道產(chǎn)生的更新頻率是=1.125MHz/CCR2_Val=25Hz-------------------------------------------------------------------*/TIM3_TimeBaseStructure.TIM_Prescaler = 63;						//預(yù)分頻器TIM3_PSC=63	 TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//計(jì)數(shù)器向上計(jì)數(shù)模式 TIM3_CR1[4]=0TIM3_TimeBaseStructure.TIM_Period =0xffff;				        //自動(dòng)重裝載寄存器TIM3_APR      		     TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;					//時(shí)鐘分頻因子 TIM3_CR1[9:8]=00TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);					//寫TIM3各寄存器參數(shù)TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;				//TIM3_CCMR1[14:12]=011  翻轉(zhuǎn) 當(dāng)TIM3_CCR2=TIM3_CNT時(shí),翻轉(zhuǎn)OC2REF的電平 // TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//輸入/捕獲2輸出允許  OC2信號輸出到對應(yīng)的輸出引腳PB5TIM3_OCInitStructure.TIM_Pulse =CCR2_Val;						    //若CC1通道配置為輸出:CCR2是裝入當(dāng)前捕獲/比較2 TIM3_CCR2寄存器的值(預(yù)裝載值)。//當(dāng)前捕獲/比較寄存器包含了與計(jì)數(shù)器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寄存器的預(yù)裝載功能,可隨時(shí)寫入TIM3_CCR2//且新值馬上起作用	  TIM_Cmd(TIM3,ENABLE);											//啟動(dòng)定時(shí)器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);  	}}

當(dāng)我們把tim.c中的TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;

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



關(guān)鍵詞: stm32定時(shí)

評論


技術(shù)專區(qū)

關(guān)閉