娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

stm32---輸入捕獲

發布者:電子設計探索者最新更新時間:2020-03-29 來源: eefocus關鍵字:stm32  輸入捕獲  基本定時器 手機看文章 掃描二維碼
隨時隨地手機看文章

輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。STM32 的定時器,除了 TIM6 和 TIM7,其他定時器都有輸入捕獲功能。STM32 的輸入捕獲,簡單地說就是通過檢測 TIMx_CHx 上的邊沿信號,在邊沿信號發生跳變(比如上升沿/下降沿)的時候,將當前定時器的值(TIMx_CNT)存放到對應的通道的捕獲/比較寄存器(TIMx_CCRx)中。

1. 相關寄存器介紹

1) 捕獲/比較模式寄存器 (TIMx_CCMRx) 


當在輸入捕獲模式下使用的時候,對應上圖的第二行描述,從圖中可以看出,TIMx_CCMR1 明顯是針對 2 個通道的配置,低八位[7:0]用于捕獲/比較通道 1 的控制,而高八位[15:8]則用于捕獲/比較通道 2 的控制。同理,CCMR2 這個寄存器用來控制通道 3 和通道 4。今天的實驗,我們用到的是 TIM5 的捕獲/比較通道 1。


 (1)CC1S[1:0],這兩個位用于 CCR1 的通道配置,這里我們設置 CC1S[1:0]=01,也就是配置 IC1 映射在 TI1 上。如果不理解沒有關系,看圖就知道了。


從圖中可以知道,IC1有三個輸入源,分別是TI1,TI2,TRC。

TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 這是通過庫函數配置,映射到TI1。

頭文件(stm32f10x_tim.h)定義如下:

#define TIM_ICSelection_DirectTI           ((uint16_t)0x0001) 
#define TIM_ICSelection_IndirectTI         ((uint16_t)0x0002) 
#define TIM_ICSelection_TRC                 ((uint16_t)0x0003)

(2)IC1F[3:0]


表格中的f_ck_int 是定時器的輸入頻率(TIMxCLK),f_dts 則是根據 TIMx_CR1 的 CKD[1:0]來確定。



上圖就是TIMx_CR1寄存器。

#define TIM_CKD_DIV1                       ((uint16_t)0x0000)
#define TIM_CKD_DIV2                       ((uint16_t)0x0100)
#define TIM_CKD_DIV4                       ((uint16_t)0x0200)

假定選IC1F[3:0]=0101,即采樣頻率為fDTS/2, N=8;

選CKD[1:0]=01,即 tDTS = 2 × tCK_INT;并假定 fCK_INT=72MHz。  

這時可以算出,采樣頻率為72MHz/2/2=18MHz.

1/(18MHz)*8 = 0.4444us = 444.4ns.

因為N=8,所以濾波器可以濾除掉輸入端小于444.4ns的脈沖。 

數字濾波器由一個事件計數器組成,它記錄到N個事件后會產生一個輸出的跳變”,這句話可以這樣理解:

當濾波器連續采樣到N個有效電平時,就輸出這個有效電平。 
當濾波器沒有連續采樣到N個有效電平時,再從0開始計數,輸出一直保持上一次輸出的有效電平。

例如:濾波器上一次輸出是高電平,本次連續采樣到(N-1)個高電平,但第N個是個低電平,那么濾波器仍然保持上次輸出的高電平,并重新開始計數,記錄1次低電平,如果其后采樣的(N-1)個也是低電平,此時濾波才輸出低電平,于是一個下降沿才出現在IC1上。

(3)IC1PSC[1:0]


這里的“事件”指的是上升沿或者下降沿,具體是哪個由TIMx_CCER寄存器的CCxP位決定。

2)捕獲/比較使能寄存器:TIMx_CCER


所以,要使能輸入捕獲,必須設置 CC1E=1,而 CC1P 則根據自己的需要來配置(捕獲發生在上升沿還是下降沿)。 

3) DMA/中斷使能寄存器(TIMx_DIER) 


在實驗中,我們需要允許位0和位1的中斷。

#define TIM_IT_Update                      ((uint16_t)0x0001)
#define TIM_IT_CC1                         ((uint16_t)0x0002)
#define TIM_IT_CC2                         ((uint16_t)0x0004)
#define TIM_IT_CC3                         ((uint16_t)0x0008)
#define TIM_IT_CC4                         ((uint16_t)0x0010)

對應的庫函數是:TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);

4) 捕獲/比較寄存器 (TIMx_CCRx) 


該寄存器用來存儲捕獲發生時,TIMx_CNT的值,我們從 TIMx_CCR1 就可以讀出通道 1 捕獲發生時刻的 TIMx_CNT 值,通過兩次捕獲(一次上升沿捕獲,一次下降沿捕獲)的差值,就可以計算出高電平脈沖的寬度。

2. 實驗設計

通過TIM3產生一路PWM(從PB5輸出),把PB5連接到PA0上,PA0和 TIM5_CH1是同一個管腳。利用TIM5_CH1的輸入捕獲功能,測量出PWM的寬度。


3. 參考代碼

[cpp] view plain copy

  1. //TIM5_CH1輸入捕獲配置  

  2. void TIM5_Cap_Init(u16 arr,u16 psc)  

  3. {      

  4.     TIM_ICInitTypeDef  TIM5_ICInitStructure;  

  5.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

  6.     NVIC_InitTypeDef NVIC_InitStructure;  

  7.   

  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);    //使能TIM5時鐘  

  9.       

  10.     //TIM5的配置  

  11.     TIM_TimeBaseStructure.TIM_Period = arr;     //重裝載值  

  12.     TIM_TimeBaseStructure.TIM_Prescaler =psc;   //分頻系數   

  13.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //tDTS = tCK_INT  

  14.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上計數  

  15.     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);   

  16.     

  17.     //TIM5輸入捕獲配置  

  18.     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //我們用通道1  

  19.     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;    //上升沿捕獲  

  20.     TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1  

  21.     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;   //無預分頻器   

  22.     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 ,無濾波器  

  23.     TIM_ICInit(TIM5, &TIM5_ICInitStructure);  

  24.       

  25.     //中斷優先級配置  

  26.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;    

  27.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;    

  28.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    

  29.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   

  30.     NVIC_Init(&NVIC_InitStructure);    

  31.       

  32.     TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//打開更新中斷和捕獲中斷  

  33.       

  34.     TIM_Cmd(TIM5,ENABLE );  //使能定時器5  

  35.      

  36. }  


[cpp] view plain copy

  1. #define START          0X01  

  2. #define WAIT_RISING    0X02  

  3. #define WAIT_FALLING   0X03  

  4.   

  5.                           

  6. u16 TIM5CH1_CAPTURE_VAL;    //輸入捕獲值  

  7. u32 a[500] = {0};           //存放電平寬度  

  8. u32 i = 0; //數組下標  

  9. u8 overflow = 0;    //記錄定時器更新中斷的次數  

  10. u8 state = START;  

  11.   

  12. //定時器5中斷服務程序  

  13. void TIM5_IRQHandler(void)  

  14. {   

  15.   

  16.     if(i<500)  

  17.     {       

  18.         if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)  

  19.         {         

  20.             ++overflow;  

  21.         }  

  22.           

  23.         if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲事件  

  24.         {     

  25.             if(state == START)      //初始狀態                

  26.             {     

  27.                 overflow = 0;  

  28.                 TIM_SetCounter(TIM5,0);  

  29.                 state = WAIT_FALLING;  

  30.                 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);     //設置為下降沿捕獲  

  31.             }     

  32.             else if(state == WAIT_RISING)    //等待上升沿  

  33.             {  

  34.                 TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);  

  35.                 a[i++] = TIM5CH1_CAPTURE_VAL + overflow*65536;  

  36.                   

  37.                 overflow = 0;  

  38.                 TIM_SetCounter(TIM5,0);  

  39.                 state = WAIT_FALLING;  

  40.                 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //設置為下降沿捕獲  

  41.                   

  42.             }  

  43.             else // wait falling  

[1] [2]
關鍵字:stm32  輸入捕獲  基本定時器 引用地址:stm32---輸入捕獲

上一篇:深入分析MCU堆棧的作用,以及該如何設置堆棧大小
下一篇:Stm32用寄存器還是庫函數

推薦閱讀最新更新時間:2025-04-24 06:53

STM32 Cubemax(九) ——利用輸入捕獲中斷實現超聲波測距
前言 因為要實現一下卡爾曼濾波,所以這次先寫一下超聲波,順便重溫一下輸入捕獲中斷。 一、超聲波模塊原理 但凡在網上搜過超聲波這個模塊的,對這個圖都不陌生,簡單的說就是想得到超聲波的數據,包含以下幾個步驟。 1.發送大于10us的觸發信號。 2.檢測超聲波發出信號時產生的高電平。 3.檢測超聲波接收到信號時產生的低電平 而我們就是通過后兩步,即去檢測處因為超聲波產生的高電平的時間,從而來得到距離信息的。而輸入捕獲的作用就是用來去捕獲高電平或者低電平的持續時間的 我們的編程就是根據上圖來實現的。 二、Cubmax配置 1.配置定時器輸入捕獲 本實驗板子為F407,分頻系數選擇84-1,則計數精度達到1us。10
[單片機]
<font color='red'>STM32</font> Cubemax(九) ——利用<font color='red'>輸入</font><font color='red'>捕獲</font>中斷實現超聲波測距
STM32輸入捕獲--“PWM輸入模式”(可拓展多路同時捕獲
前言 博文基于STM32F103ZET6和標準固件庫V3.5.0在MDK5環境下開發; 本博文只討論輸入捕獲的PWM輸入模式,這個模式是STM32輸入捕獲檢測脈寬和頻率的一種硬件處理機制,說白了就是STM32芯片專門用來進行對PWM進行捕獲的一個功能;此方法相比較于傳統的PWM的捕獲方法,大大減小了代碼量,提高了檢測效率,而實際上對于PWM信號的檢測還有其他方法(下面我會介紹,就是原子教程提供的方法),并且關于繁瑣的寄存器的介紹這里就不多說了,有興趣的話可以直接去我的另外一個博客里去看: https://blog.csdn.net/wuyuzun/article/details/73135662 ;(備注:此鏈接里的博客里有一個配
[單片機]
<font color='red'>STM32</font><font color='red'>輸入</font><font color='red'>捕獲</font>--“PWM<font color='red'>輸入</font>模式”(可拓展多路同時<font color='red'>捕獲</font>)
STM32】TIM---基本定時器
一、TIM 簡介 定時器最基本功能:定時 定時發送 USART 數據 定時采集 AD 數據等 定時器與 GPIO 結合 測量輸入信號脈沖寬度 產生輸出波形 等 ▲ 各個定時器的特性 二、基本定時器 基本定時器 :TIM6 和 TIM7 ,基本功能完全一樣,但所占資源彼此完全獨立。 ▲ 基本定時器的功能框圖 基本定時器時鐘只能來自內部時鐘 基本定時器的內部時鐘(CK_INT)頻率為 84MHz 基 本定時器還專門用于 DAC 轉換觸發 只要設置 CK_PSC 和 TIMx_ARR 這兩個寄存器的值就可以控制事件生成的時間 三、定時器周期計算 T o u t ToutTout:溢出時間,即定時多長時間
[單片機]
【<font color='red'>STM32</font>】TIM---<font color='red'>基本</font><font color='red'>定時器</font>
定時器基本原理及常見問題
對于MCU來說,定時器是必備的一個模塊,原因在于定時器是使用頻率最高。 1寫在前面 我之前寫過許多關于定時器的文章,不過后臺還是有很多朋友問與定時期相關的問題,所以,這里也給大家推薦下面的這個關于定時器的資料。 相信有部分朋友都收到STM32公眾號的消息了,就是提供了一個我認為比較好的資料:STM32 定時器基本原理及常見問題之培訓資料。 這個資料我是第一時間就下載來看了,覺得整理的很好。特別是對于很多初學以及學習了一段時間STM32的朋友來說,對全方面掌握定時器有很大幫助作用。 考慮到很多朋友都只是知道有這么一個資料,沒有下載來學習、掌握。所以,今天在這里挑一些要點,帶領大家學習。 下載地址在ST中
[單片機]
<font color='red'>定時器</font><font color='red'>基本</font>原理及常見問題
STM32 的 printf() 函數串口重定向(HAL庫標準庫都適用)
1.建立工程,配置好串口 2.核心:添加新文件usar_fputc.c (名字隨便自己命名),把文件添加到項目中去    #include stdio.h   #include stm32f1xx_hal.h   extern UART_HandleTypeDef huart1;   uint8_t ch;   uint8_t ch_r;   //重寫這個函數,重定向printf函數到串口   /*fputc*/   int fputc(int c, FILE * f)   {     ch=c;     HAL_UART_Transmit(&huart1,&ch,1,1000); //發送串口,不同的單片機函數和串口命名不同,
[單片機]
<font color='red'>STM32</font> 的 printf() 函數串口重定向(HAL庫標準庫都適用)
mac os系統 vscode + platformio+cmsis環境開發stm32
1、platformio創建cmsis空白工程 1)選擇 new project 2)填寫工程名字 選擇單片機型號 選擇 framework為 cmsis(標準庫) Location,把勾去掉選擇自己要創建的項目放在哪個文件(強烈建議勾掉) 3)點擊Finish完成 2、cmsis標準庫移植到空白工程中 1)先去下載設備對應的外設標準庫文件包 地址:https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html 本人設備是F103系列,選擇F1 2)下載完成之后,解壓,文件目錄如下
[單片機]
安富萊 STM32 按鍵檢測
最近看了安富萊的按鍵檢測程序,支持短按,長按,連續觸發和組合按鍵。內部采用 FIFO 來保存觸發的按鍵,保證按鍵觸發不丟失,安富萊的程序穩定,可擴展性強,可以在實際工程中使用。以下記錄一些使用上要注意的方面。 在 bsp_key.h 里: #define KEY_COUNT 2 /* 按鍵個數, 2個獨立建*/ KEY_COUNT 代表 實際按鍵數 + 組合按鍵數 。 /* 按鍵濾波時間50ms, 單位10ms。 只有連續檢測到50ms狀態不變才認為有效,包括彈起和按下兩種事件 即使按鍵電路不做硬件濾波,該濾波機制也可以保證可靠地檢測到按鍵事件 */ #define KEY_FILTER_TI
[單片機]
《嵌入式-STM32開發指南》第二部分 基礎篇 - 第6章串口通信(HAL庫)
6.1串口簡介 通用同步異步收發器(USART)提供了一種靈活的方法與使用工業標準NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。USART利用分數波特率發生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互連網),智能卡協議和IrDA(紅外數據組織)SIR ENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。使用多緩沖器配置的DMA方式,可以實現高速數據通信。圖一也就我們熟悉的串口通通信標準。 圖1 232通信標準 如圖2所示,串口通過三個引腳與其他設備連接在一起。任何USART雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。 圖2 US
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 石狮市| 桑植县| 察雅县| 余庆县| 同德县| 涞源县| 鹤山市| 安泽县| 民乐县| 巴东县| 翼城县| 临桂县| 深州市| 大洼县| 余干县| 乌鲁木齐县| 醴陵市| 彩票| 滨州市| 吉隆县| 双城市| 治县。| 惠来县| 晋宁县| 寿阳县| 光泽县| 高州市| 微山县| 中山市| 会东县| 贺兰县| 井冈山市| 封丘县| 会同县| 黄石市| 通渭县| 石泉县| 靖远县| 铜川市| 那曲县| 吉木乃县|