正點原子stm32F407學習筆記10——輸入捕獲實驗

一、輸入捕獲簡介

輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。我們以測量脈寬為例,用一個簡圖來
說明輸入捕獲的原理,如圖所示:
輸入捕獲脈寬測量原理
假定定時器工作在向上計數模式,圖中 t1到t2 時間,就是我們需要測量的高電平時間。測量方法如下:首先設置定時器通道 x 為上升沿捕獲,這樣,t1 時刻,就會捕獲到當前的 CNT 值,然后立即清零 CNT,并設置通道 x為下降沿捕獲,這樣到 t2 時刻,又會發生捕獲事件,得到此時的 CNT 值,記為 CCRx2。這樣,根據定時器的計數頻率,我們就可以算出 t1~t2 的時間,從而得到高電平脈寬。
在 t1~t2 之間,可能產生 N 次定時器溢出,這就要求我們對定時器溢出,做處理,防止高電平太長,導致數據不準確。如上圖所示,t1到t2之間,CNT計數的次數等于:N*ARR+CCRx2,有了這個計數次數,再乘以 CNT 的計數周期,即可得到 t2-t1 的時間長度,即高電平持續時間。

二、操作步驟

本章要實現通過輸入捕獲,來獲取TIM5_CH1(PA0)上面的高電平脈沖寬度,并從串口打印捕獲結果。下面我們介紹庫函數配置上述功能輸入捕獲的步驟:
① 初始化定時器和通道對應IO的時鐘;
② 初始化IO口,模式為復用:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
③設置引腳復用映射:
GPIO_PinAFConfig();
④初始化定時器ARR,PSC
TIM_TimeBaseInit();
⑤初始化輸入捕獲通道
TIM_ICInit();
⑥如果要開啟捕獲中斷,
TIM_ITConfig();
NVIC_Init();
⑦使能定時器:TIM_Cmd();
⑧編寫中斷服務函數:TIMx_IRQHandler();

三、軟件設計

我們將捕獲 TIM5_CH1(PA0)上的高電平脈寬,通過 KEY_UP 按鍵輸入高電平,并從串口打印高電平脈寬。基于上一篇代碼
pwm.c文件:

#include "pwm.h"
#include "led.h"
#include "usart.h"//TIM14 PWM部分初始化 
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM14_PWM_Init(u32 arr,u32 psc)
{		 					 //此部分需手動修改IO口設置GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);  	//TIM14時鐘使能    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 	//使能PORTF時鐘	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9復用為定時器14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //復用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽復用輸出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定時器分頻TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式TIM_TimeBaseStructure.TIM_Period=arr;   //自動重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定時器14//初始化TIM14 Channel1 PWM模式	 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM1 4OC1TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的預裝載寄存器TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 TIM_Cmd(TIM14, ENABLE);  //使能TIM14										  
}  //              輸入捕獲實驗函數
//
//
TIM_ICInitTypeDef  TIM5_ICInitStructure;//定時器5通道1輸入捕獲配置
//arr:自動重裝值(TIM2,TIM5是32位的!!)
//psc:時鐘預分頻數
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  	//TIM5時鐘使能    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA時鐘	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0復用位定時器5TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定時器分頻TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式TIM_TimeBaseStructure.TIM_Period=arr;   //自動重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化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);TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷	TIM_Cmd(TIM5,ENABLE ); 	//使能定時器5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器、}
//捕獲狀態
//[7]:0,沒有成功的捕獲;1,成功捕獲到一次.
//[6]:0,還沒捕獲到低電平;1,已經捕獲到低電平了.
//[5:0]:捕獲低電平后溢出的次數(對于32位定時器來說,1us計數器加1,溢出時間:4294秒)
u8  TIM5CH1_CAPTURE_STA=0;	//輸入捕獲狀態		    				
u32	TIM5CH1_CAPTURE_VAL;	//輸入捕獲值(TIM2/TIM5是32位)
//定時器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=0XFFFFFFFF;}else TIM5CH1_CAPTURE_STA++;}	 }if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發生捕獲事件{	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;TIM5CH1_CAPTURE_STA|=0X40;		//標記捕獲到了上升沿TIM_Cmd(TIM5,DISABLE ); 	//關閉定時器5TIM_SetCounter(TIM5,0);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);		//CC1P=1 設置為下降沿捕獲TIM_Cmd(TIM5,ENABLE ); 	//使能定時器5}		    }			     	    					   }TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中斷標志位
}

pwm.h文件:

#ifndef _TIMER_H
#define _TIMER_H
#include "sys.h"void TIM14_PWM_Init(u32 arr,u32 psc);//新增TIM5_CH1_Cap_Init函數,用于輸入捕獲
void TIM5_CH1_Cap_Init(u32 arr,u16 psc);#endif```
main.c文件:```c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"//本實驗代碼放在pwm.c中extern u8  TIM5CH1_CAPTURE_STA;		//輸入捕獲狀態		    				
extern u32	TIM5CH1_CAPTURE_VAL;	//輸入捕獲值  int main(void)
{ long long temp=0;  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2delay_init(168);  //初始化延時函數uart_init(115200);//初始化串口波特率為115200TIM14_PWM_Init(500-1,84-1);       	//84M/84=1Mhz的計數頻率計數到500,PWM頻率為1M/500=2Khz     TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); //以1Mhz的頻率計數 while(1){delay_ms(10);TIM_SetCompare1(TIM14,TIM_GetCapture1(TIM14)+1); if(TIM_GetCapture1(TIM14)==300)TIM_SetCompare1(TIM14,0);			 if(TIM5CH1_CAPTURE_STA&0X80)        //成功捕獲到了一次高電平{temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=0XFFFFFFFF;		 		         //溢出時間總和temp+=TIM5CH1_CAPTURE_VAL;		   //得到總的高電平時間printf("HIGH:%lld us\r\n",temp); //打印總的高點平時間TIM5CH1_CAPTURE_STA=0;			     //開啟下一次捕獲}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91959.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解設計模式:狀態模式(State Pattern)

在軟件開發中,我們經常會遇到對象的行為隨著其內部狀態的變化而變化的情況。例如,一個訂單可能處于"待支付"、"已支付"、"已發貨"或"已完成"等不同狀態,每個狀態下訂單的操作邏輯可能完全不同。如果…

企業級網絡綜合集成實踐:VLAN、Trunk、STP、路由協議(OSPF/RIP)、PPP、服務管理(TELNET/FTP)與安全(ACL)

NE綜合實驗4 一、實驗拓撲二、實驗需求 按照圖示配置IP地址。Sw7和sw8之間的直連鏈路配置鏈路聚合。公司內部業務網段為vlan10和vlan20,vlan10是市場部,vlan20是技術部,要求對vlan進行命名以便區分識別;pc10屬于vlan10&#xff0c…

小架構step系列20:請求和響應的擴展點

1 概述通過上一篇了解請求和響應的流程,Spring在設計上留了不少擴展點。里面通過查找接口的方式獲取的地方,都可以成為一種擴展點,因為只要實現這類接口就可以成為Spring加載的一部分。本文了解一下這些擴展點,方便后面進行擴展。…

模型材質一鍵替換~輕松還原多種三維場景

1. 概述模型的材質決定了三維場景的整體視效,山海鯨可視化不僅支持模型材質的替換與編輯,而且提供了大量現成的模型材質供大家使用,能夠幫助大家實現更高效的三維場景搭建。模型材質主要分為PBR材質和水面材質兩個部分。其中大部分靜態模型都…

【JS逆向基礎】數據庫之mysql

前言:mysql數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬于 Oracle 旗下公司。MySQL 最流行的關MySQL是一個開源免費的關系型數據庫管系型數據庫管理系統,在 WEB 應用方面ySQL是最好的 RDBMS (Relational Database Management S…

金融工程、金融與經濟學知識點

本文整理了20個金融工程、金融和經濟學知識點及邏輯,這些是理解金融市場運作和進行量化分析的基石。 1. 金融工程 - 遠期與期權(Forward & Option)的定價與風險管理 遠期定價: 利用無套利原則,遠期合約的價格應等…

Vue 3 中導出 Excel 文件

在 Vue 3 中導出 Excel 文件,通常可以使用一些流行的 JavaScript 庫,如 SheetJS (xlsx) 或者 exceljs。這里我將分別介紹如何使用這兩個庫來在 Vue 3 應用中導出 Excel 文件。方法 1:使用 SheetJS (xlsx)安裝 SheetJS首先,你需要安…

奇麟大數據:前端大文件上傳解決方案

在奇麟大數據業務系統的開發及使用過程中,例如OBS對象存儲文件管理、流計算DSC依賴管理,經常會遇到上傳文件這樣的基礎需求,一般情況下,前端上傳文件就是new FormData,然后把文件 append 進去,然后post發送…

立創EDA中雙層PCB疊層分析

立創EDA中雙層PCB疊層分析 結論:立創EDA中的雙層 PCB 疊層視圖相比傳統視圖,多出一個焊盤層(博主命名); 1. 傳統雙層 PCB 疊層示意圖 絲印層 印刷元件標識、極性標記及廠商信息 輔助組裝與后期維護 阻焊層 覆蓋銅層表…

深入理解進程:從底層原理到硬件系統實戰

深入理解進程:從底層原理到嵌入式實戰(3-4 萬字詳解) 前言:為什么硬件開發者必須吃透進程? 作為嵌入式開發者,你可能會說:“我平時用的 RTOS 里只有任務(Task)&#xff0…

Elasticsearch 簡化指南:GCP Google Compute Engine

作者:來自 Elastic Eduard Martin 系列內容的一部分:開始使用 Elasticsearch:GCP 想獲得 Elastic 認證?看看下一期 Elasticsearch Engineer 培訓什么時候開始! Elasticsearch 擁有豐富的新功能,幫助你根據…

STM32的定時器輸入捕獲-超聲波測距案例

STM32的定時器輸入捕獲-超聲波測距案例 gitee代碼輸入捕獲硬件電路案例說明主函數代碼 gitee代碼 https://gitee.com/xiaolixi/l-stm32/tree/master/STM32F103C8T6/2-1tem-ld-timer-input-pluse 輸入捕獲硬件電路 超聲波測距案例說明 使用超聲波測距傳感器使用tim1的輸入捕獲…

[特殊字符] Spring Boot 常用注解全解析:20 個高頻注解 + 使用場景實例

一文掌握 Spring Boot 中最常用的 20 個注解,涵蓋開發、配置、Web、數據庫、測試等場景,配合示例講解,一站式掌握!📌 一、核心配置類注解 1. SpringBootApplication 作用:標記為 Spring Boot 應用的入口類&…

【工具變量】地級市城市包容性綠色增長數據(2011-2023年)

城市包容性綠色增長是指在推動城市經濟增長的過程中,兼顧環境可持續性、社會公平和包容性發展的理念與實踐。它強調在實現綠色轉型和低碳發展的同時,保障社會各群體,特別是弱勢群體的利益與參與權利,確保增長成果能夠公平共享 本…

深入理解React Hooks:從使用到原理

4. 源碼解析類:《深入理解React Hooks:從使用到原理》 # 深入理解React Hooks:從使用到原理?? **背景**: - Hooks解決了Class組件的哪些問題? - 為什么不能在循環/條件中調用Hooks??? **核心原理**:### 1. Hooks鏈表 React內部維護一個單向鏈表:fiber.memoizedSta…

【云原生】Docker 部署 Elasticsearch 9 操作詳解

目錄 一、前言 二、Elasticsearch 9 新特性介紹 2.1 基于 Lucene 10 重大升級 2.2 Better Binary Quantization(BBQ) 2.3 Elastic Distributions of OpenTelemetry(EDOT) 2.4 LLM 可觀測性 2.5 攻擊發現與自動導入 2.6 ES|QL 增強 2.7 語義檢索 三、基于Docker部署…

uview-ui使用u-search搜索框

1、效果圖 2、帶地址搜索框&#xff0c;在微信小程序線上需要開啟地圖定位接口&#xff0c;若沒有權限則顯示不了城市名&#xff0c;注意事項參考uniapp相關地圖 API調用-CSDN博客 <template><view><u-sticky offset-top"-1"><u-search v-mode…

Elasticsearch+Logstash+Kibana部署

目錄 一、實驗準備 1.下載安裝 2.下載java 2.同步主機系統時間 二、部署 1.部署elasticsearch 修改 /etc/elasticsearch/elasticsearch.yml 配置文件 修改 /etc/hosts/ 文件 啟動elasticsearch 查看是否啟動進程netstat -antptu | grep java 2.部署logstash 進入/et…

TEngine學習

關于靜態類中的靜態變量賦值&#xff1a; public static class ActorEventDefine{public static readonly int ScoreChange RuntimeId.ToRuntimeId("ActorEventDefine.ScoreChange");public static readonly int GameOver RuntimeId.ToRuntimeId("ActorEventD…

獵板:在 5G 與 AI 時代,印制線路板如何滿足高性能需求

5G 與 AI 技術的深度融合&#xff0c;推動電子設備向高速傳輸、高算力、高集成方向發展&#xff0c;印制線路板&#xff08;PCB&#xff09;作為核心載體&#xff0c;其性能直接決定終端設備的運行效率與可靠性。獵板 PCB 聚焦 5G 通信的高頻需求與 AI 算力的密集需求&#xff…