新聞中心

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

        STM32 定時器淺談_1

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

        本文引用地址:http://www.104case.com/article/201611/318029.htm

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

        一,時鐘選擇單元:

        內部時鐘(CK_INT)

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

        外部時鐘模式2:外部觸發輸入ETR

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


        二,時基單元組成

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

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


        三,輸入捕獲單元

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

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


        捕獲通道


        這里實現了高頻濾波,當系統的時鐘為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 兩種模式計數方式相反

        重點在占空比:

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

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

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

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

        定時器編程步驟:

        1. 配置優先級; 2. 使能時鐘 3. 配置GPIO;4. 配置TIME;5.使能計數器;6.開中斷;7.清除標志位;
        具體配置如下:
        (1) NVIC_Configuration(void);配置優先級
        (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)* 功    能:系統時鐘配置為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();   	                 //系統時鐘設置及外設時鐘使能					     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定時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 封丘县| 东光县| 睢宁县| 永德县| 西平县| 孙吴县| 乌海市| 睢宁县| 莫力| 阳高县| 庆云县| 灵川县| 沾益县| 乐都县| 桑日县| 千阳县| 阿克陶县| 历史| 普兰店市| 勃利县| 江源县| 平凉市| 昌平区| 红原县| 宁津县| 哈尔滨市| 岢岚县| 巴南区| 砀山县| 达拉特旗| 石屏县| 沈阳市| 乐亭县| 太康县| 曲周县| 苏州市| 邓州市| 阳朔县| 修文县| 开江县| 额济纳旗|