STM32 定時器淺談_1
定時器的組成包括四部分:時鐘選擇單元,時基單元 ,輸入捕獲 ,輸出比較!
一,時鐘選擇單元:
內(nèi)部時鐘(CK_INT)
外部時鐘模式1:外部引腳輸入
外部時鐘模式2:外部觸發(fā)輸入ETR
內(nèi)部觸發(fā)輸入(ITRX):定時器級聯(lián)
二,時基單元組成
CNT計數(shù)器 :向上、 向下、中央對齊 三種計數(shù)方
PSC預(yù)分頻寄存器
ARR自動重裝載寄存器
三,輸入捕獲單元
此處應(yīng)注意的是實際采樣頻率F = 1/2*Fdts{ 香儂采樣定理}
并在濾波電路處進(jìn)行高頻濾波,即一些高頻波在濾波電路被濾掉
捕獲通道
這里實現(xiàn)了高頻濾波,當(dāng)系統(tǒng)的時鐘為72MHZ時,假設(shè)選用TDTS=2*TINT
則實際采樣頻率為F=1/2(1/2*72MHZ)=18MHZ
當(dāng)N(采樣次數(shù))=4時,最大有效頻率為18/4=4.25MHZ
即大于4.25MHZ的波被濾掉
注意:TI1F濾波后的有效波形有N個延時
四,輸出比較單元
此處應(yīng)注意的是輸出通道和輸入通道是同一條,應(yīng)進(jìn)行設(shè)置!
PWM(脈沖寬度調(diào)制)
是用數(shù)字信號對模擬信號的一種表達(dá),上下兩個波形的面積相等,上圖為模擬信號,下圖是轉(zhuǎn)換的PWM 波形~ b的高度相同,只需改變寬度就可表示上圖分隔的面積~
PWM共有兩種模式:PWM模式1和PWM模式2 兩種模式計數(shù)方式相反
重點在占空比:
占空比:在一串理想的脈沖周期序列中(如方波),正脈沖的持續(xù)時間與脈沖總周期的比值。(百度)簡單來說就是高電平在整個時鐘周期所占的比值
影響占空比的兩個因素: 1,PWM周期 2 ,CCR寄存器里的預(yù)先放入的比較數(shù) (可以看做高電平)
影響PWM 周期兩個因素:1 ,ARR寄存器里重裝載數(shù)值(可以看做時鐘的周期) 2 ,計數(shù)模式
所以占空比=(TIMx_CRR/TIMx_ARR)%100%;
定時器編程步驟:
1. 配置優(yōu)先級; 2. 使能時鐘 3. 配置GPIO;4. 配置TIME;5.使能計數(shù)器;6.開中斷;7.清除標(biāo)志位;
具體配置如下:
(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);清除標(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)時鐘配置為72MHZ, 外設(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 ; //配置定時器中斷 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è)時鐘使能 NVIC_Configuration(); //中斷源配置time_ini(); //定時器3的初始化while(1);}
tim.c
#include "stm32f10x_tim.h"#include "stm32f10x_gpio.h"#includevoid 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); //定時器3 時鐘使能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ù)用開啟時,PB5會被復(fù)用為TIM3_CH2*/GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE); /* Time Base configuration *//*-------------------------------------------------------------------TIM3CLK=72MHz 預(yù)分頻系數(shù)Prescaler=63 經(jīng)過分頻 定時器時鐘為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; //計數(shù)器向上計數(shù)模式 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各寄存器參數(shù)TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ; //TIM3_CCMR1[14:12]=011 翻轉(zhuǎn) 當(dāng)TIM3_CCR2=TIM3_CNT時,翻轉(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)前捕獲/比較寄存器包含了與計數(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ù)裝載功能,可隨時寫入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); }}
當(dāng)我們把tim.c中的TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;
換成:TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;時可以看到占空一個近似于1:2的占空比波形圖
評論