STM32筆記之十一:捕捉精彩瞬間,脈衝方波長度捕獲
a) 目的:基礎PWM輸入也叫捕獲,以及中斷配合應用。使用前一章的輸出管腳PB1(19腳),直接使用跳線連接輸入的PA3(13腳),配置為TIM2_CH4,進行實驗。
b) 對於簡單的PWM輸入應用,暫時無需考慮TIM1的高級功能之區別,按照目前我的應用目標其實只需要採集高電平寬度,而不必知道週期,所以並不採用PWM輸入模式,而是普通脈寬捕獲模式。
c) 初始化函式定義:
void TIM_Configuration(void); //定義TIM初始化函數
d) 初始化函式呼叫:
TIM_Configuration(); //TIM初始化函式呼叫
e) 初始化函數,不同於前面模組,TIM的CAP初始化分為三部分——計時器基本初始化、通道初始化和時鐘啟動初始化:
void TIM_Configuration(void)//TIM2的CAP初始化函數
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//計時器初始化結構
TIM_ICInitTypeDef
TIM_ICInitStructure; //通道輸入初始化結構
//TIM2輸出初始化
TIM_TimeBaseStructure.TIM_Period =
0xFFFF; //週期0~FFFF
TIM_TimeBaseStructure.TIM_Prescaler
= 5; //時鐘分頻
TIM_TimeBaseStructure.TIM_ClockDivision
= 0; //時鐘分割
TIM_TimeBaseStructure.TIM_CounterMode
= TIM_CounterMode_Up;//模式
TIM_TimeBaseInit(TIM2,
&TIM_TimeBaseStructure);//基本初始化
//TIM2通道的捕捉初始化
TIM_ICInitStructure.TIM_Channel =
TIM_Channel_4;//通道選擇
TIM_ICInitStructure.TIM_ICPolarity
= TIM_ICPolarity_Falling;//下降沿
TIM_ICInitStructure.TIM_ICSelection
= TIM_ICSelection_DirectTI;//管腳與寄存器對應關係
TIM_ICInitStructure.TIM_ICPrescaler
= TIM_ICPSC_DIV1;//分頻器
TIM_ICInitStructure.TIM_ICFilter =
0x4; //濾波設置,經歷幾個週期跳變認定波形穩定0x0~0xF
TIM_ICInit(TIM2,
&TIM_ICInitStructure); //初始化
TIM_SelectInputTrigger(TIM2,
TIM_TS_TI2FP2); //選擇時鐘觸發源
TIM_SelectSlaveMode(TIM2,
TIM_SlaveMode_Reset);//觸發方式
TIM_SelectMasterSlaveMode(TIM2,
TIM_MasterSlaveMode_Enable); //啟動計時器的被動觸發
TIM_ITConfig(TIM2, TIM_IT_CC4,
ENABLE); //打開中斷
TIM_Cmd(TIM2, ENABLE);
//啟動TIM2
}
f) RCC初始化函數中加入TIM時鐘開啟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3,
ENABLE);
g) GPIO裡面將輸入和輸出管腳模式進行設置。IN_FLOATING,50MHz。
h) 使用中斷的話在NVIC裡添加如下代碼:
//打開TIM中斷(與前一章相同)
NVIC_InitStructure.NVIC_IRQChannel
= TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
= 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority
= 2;
NVIC_InitStructure.NVIC_IRQChannelCmd
= ENABLE;
i) 簡單應用:
變數 = TIM_GetCapture4(TIM2);
j) 注意事項:
i. 由於我的需求只跟高電平寬度有關,所以避免了使用PWM輸入模式,這樣可以每個管腳捕捉一路信號。如果使用PWM模式,每一路需要佔用兩個寄存器,所以一個計時器只能同時使用兩路PWM輸入。
ii. 由於捕捉需要觸發啟動計時器,所以PWM輸出與捕捉不容易在同一個TIM通道上實現。如果必須的話只能增加計數溢出的相關代碼。
iii. 有些程式省略了捕捉通道的初始化代碼,這是不對的
iv. 在基本計時器初始化代碼裡面注意選擇適當的計數器長度,最好讓波形長度不要長於一個計數週期,否則需要增加溢出代碼很麻煩。一個計數週期的長度計算跟如下幾個參數有關:
(1)
RCC初始化代碼裡面的RCC_PCLKxConfig,這是TIM的基礎時鐘源與系統時鐘的關係。
(2)
TIM初始化的TIM_Period,這是計數週期的值
(3)
TIM初始化的TIM_Prescaler,這是計數週期的倍頻計數器,相當於調節計數週期,可以使TIM_Period儘量大,提高計數精度。
沒有留言:
張貼留言