一、什么是輸入捕獲?
輸入捕獲模式可以用來測量脈沖寬度或者測量頻率,STM32的定時器,除了TIM6和TIM7,
其他定時器都有輸入捕獲功能,STM32 的輸入捕獲,簡單的說就是通過檢測 TIMx_CHx 上的
邊沿信號,在邊沿信號發生跳變(比如上升沿/下降沿)的時候,將當前定時器的值(TIMx_CNT)
存放到對應的通道的捕獲/比較暫存器(TIMx_CCRx)里面,完成一次捕獲,同時還可以配置
捕獲時是否觸發中斷/DMA 等,
二、使用TIM5的輸入高電平捕獲
1.捕獲TIM5的CH1
TIM5的通道1在PA0引腳上,我們將捕獲 TIM5_CH1(PA0)上的高電平脈
寬,通過PA0上的按鍵輸入高電平,并從串口列印高電平脈寬,同時我們保留上節的 PWM 輸
出,大家也可以通過用杜邦線連接 PB5 和 PA0,來測量 PWM 輸出的高電平脈寬,
2.代碼解讀
從這個工程,我們的難度有點大了,因為我們要接觸到核心部分了,我們在使用輸入捕獲時,我們先確定我們是使用上升沿捕獲還是下降沿捕獲,我們在這兒使用的是上升沿捕獲,就是通過按鍵產生一個上升沿,然后定時器開始計時,我們用這個捕獲看高電平時間,通過串口顯示高電平時間,
三、代碼示例
timer.c檔案
#include "timer.h"
#include "led.h"
//定時器5通道1輸入捕獲配置
TIM_ICInitTypeDef TIM5_ICInitStructure;
void TIM5_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 清除之前設定
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
//初始化定時器5 TIM5
TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重裝值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //預分頻器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設定時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的引數初始化TIMx的時間基數單位
//初始化TIM5輸入捕獲引數
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 選擇輸入端 IC1映射到TI1上
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻
TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置輸入濾波器 不濾波
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
//中斷分組初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占優先級2級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優先級0級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的引數初始化外設NVIC暫存器
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷
TIM_Cmd(TIM5,ENABLE ); //使能定時器5
}
u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態
u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值
//定時器5中斷服務程式
void TIM5_IRQHandler(void)
{
//還未成功捕獲
if((TIM5CH1_CAPTURE_STA&0X80)==0)
{
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
{
if(TIM5CH1_CAPTURE_STA&0X40)//已經捕獲到高電平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
{
TIM5CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
//捕獲1發生捕獲事件
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次上升沿
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設定為上升沿捕獲
}else //還未開始,第一次捕獲上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 設定為下降沿捕獲
}
}
}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中斷標志位
}
main.c檔案
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "timer.h"
extern u8 TIM5CH1_CAPTURE_STA; //輸入捕獲狀態
extern u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值
int main(void)
{
u32 temp=0;
delay_init(); //延時函式初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定NVIC中斷分組2:2位搶占優先級,2位回應優先級
uart_init(115200); //串口初始化為115200
TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的頻率計數
while(1)
{
delay_ms(10);
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿
{
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp*=65536;//溢位時間總和
temp+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間
printf("HIGH:%d us\r\n",temp);//列印總的高點平時間
TIM5CH1_CAPTURE_STA=0;//開啟下一次捕獲
}
}
}
實驗現象:

這里值得注意的是,WAKE_UP按鍵(引腳PA0)是接到高電平上的,所以一開始PA0是低電平,才會有上升沿,
相關的資料代碼都在這里,作者使用的是正點原子開發板,所以資料是正點原子的,
總結
輸入捕獲在測量頻率的時候用到的,所以我們可以用輸入捕獲做一個簡易示波器,這里作者沒有做簡易的示波器,因為比較麻煩,作者最近作業太忙,沒有來得及做,所以著這里只是提一下,我們可以采用輸入捕獲,來作為觸摸按鍵的開關確定觸摸開關是否按下,那個東西下個文章講,
代碼資料如下:
鏈接:https://pan.baidu.com/s/1-Arnzh4sAodYidIa-Xj56g
提取碼:4pi2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339256.html
標籤:其他
