stm32使用定時器功能之高精度定時(微秒級)、輸入捕獲以及超聲波測距

一、定時器功能之高精度定時(微秒級)
我們常用的延時函數中無論是HAL_Delay還是vTaskDelay()函數都是毫秒級的定時,我們可以借助定時器實現一個微秒級更高精度的延時函數。這個定時器不會影響FreeRtos的任務切換
在這里插入圖片描述
這里就是用定時器的計數功能來實現定時
前面我們設置了Tim2的分頻值為72/(71+1) = 1MHz,也就是1000000Hz,那么頻率就是1/1000000 = 1us,也就是1us(1微秒)計數一次,前面我們設置的ARR自動重載的值為999,也就是999+1 = 1000us會重新加載CNT的值為0
1、原理:
t_old原計數值 與 t_now當下計數值之間不可以超過一個溢出周期的前提下。
因為原計數與當下計數值之間在不存在延時操作的情況下,不可能出現超過一個溢出周期的。
在這里插入圖片描述
上面就是兩種延時周期的運算方式
配置TIM2時鐘,用它的基本計數功能就可以,不需要去管通道,因為通道是做PWM或者輸入捕獲的,我們這里只需要它最基本的定時計數,前面的章節我們用TIM2還做了PWM,占用了通道,但是這不影響基本計數定時功能
在這里插入圖片描述

//實現更高精度的延時函數(微秒級)
void tim2_u_delay(uint32_t us)
{HAL_TIM_Base_Start(&htim2);//啟用定時器基本計數功能。//1.獲取ARR自動裝載寄存器中的值:uint32_t load_ARR = __HAL_TIM_GET_AUTORELOAD(&htim2);//2.獲取一個起始檢測點的計數值:uint32_t t_start_CNT = __HAL_TIM_GET_COUNTER(&htim2);//3.檢測周期:uint32_t t_current_CNT = 0;uint32_t ticks = 0;while (true){/* 檢測 */t_current_CNT = __HAL_TIM_GET_COUNTER(&htim2);if(t_current_CNT >= t_start_CNT){ticks += (t_current_CNT - t_start_CNT);}else{ticks += (load_ARR) - t_start_CNT + 1 + t_current_CNT;}//更新起始點start:t_start_CNT = t_current_CNT;if(ticks >= us){break;}}}

二、輸入捕獲

1、輸入捕獲原理
在這里插入圖片描述

當定時器啟動輸入捕獲模式,當外部信號出現變化時,此時會記錄計數器CNT的值,并保存到CCR1,此時會發生中斷,可以在中斷回調函數中讀取出CCR1此時的值,也就是讀取出CNT計數器的值,這個時間和ARR的值相比看一下占用周期的比例,就可以完整的得出外部信號的波形
舉例使用:監測脈沖寬度,也就是記錄脈沖的時間
在這里插入圖片描述
這里將一個信號分兩次接入chn1和chn2,chn1捕獲上升沿,chn2捕獲下降沿,這樣分別捕獲的時間會再CCR1和CCR2中,上面的計算公式中的分辨率就是計數器CNT的頻率,這里假設PSC出來的是1MHZ,也就是1秒1000000次,設置ARR為1000,CNT只是記錄前面的PSC頻率的計數,此時1MHZ,1/1000000 = 1us,也就是1us記錄一次,這里的分辨率就是1us
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述通道1和通道2是一對,通道3和通道4是一對,這樣一對中,一個通道監測上升沿,一個通道監測下降沿,就可以判斷一個高電平的時長

2、典型應用

1、 脈寬測量:通過捕獲信號的上升沿和下降沿,可以測量信號的高電平或低電平持續時間。
3、周期測量:通過兩次上升沿或下降沿之間的時間差,可以測量信號的周期。
4、頻率測量:通過周期測量,可以計算出信號的頻率。

3、輸入捕獲HAL庫接口函數API:

1.啟動輸入捕獲:HAL_TIM_IC_Start

HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
1功能:啟動定時器通道的輸入捕獲功能:
2功能:啟動定時器通道的輸入捕獲功能并且開啟捕獲中斷。
參數:
htim:即要啟動的定時器的句柄。
Channel:啟動輸入捕獲的通道是哪個。返回值:HAL_OK: 操作成功。HAL_ERROR: 操作失敗。HAL_BUSY: 定時器資源忙

2.停止輸入捕獲:HAL_TIM_IC_Stop

HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
1.功能:停止定時器通道的輸入捕獲功能:
2功能:停止定時器通道的輸入捕獲功能并且關閉捕獲中斷。
參數:
htim:即要停止的定時器的句柄。
Channel:停止輸入捕獲的通道是哪個。
返回值:HAL_OK: 操作成功。HAL_ERROR: 操作失敗。HAL_BUSY: 定時器資源忙

3.輸入捕獲配置通道:HAL_TIM_IC_ConfigChannel,相應的輸入參數也可直接在CubMX直接配置。

HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel);
功能:配置輸入捕獲通道
參數:
htim: 指向 TIM_HandleTypeDef 結構體的指針,該結構體包含了定時器的配置信息。
sConfig: 指向 TIM_IC_InitTypeDef 結構體的指針,該結構體用于配置輸入捕獲通道的參數。
Channel: 要配置的定時器通道。可以是 TIM_CHANNEL_1, TIM_CHANNEL_2, TIM_CHANNEL_3, 或 TIM_CHANNEL_4。TIM_IC_InitTypeDef 結構體用于設置輸入捕獲通道的參數,主要包括:
ICPolarity: 輸入捕獲極性。可以是 TIM_ICPOLARITY_RISING(上升沿)或 TIM_ICPOLARITY_FALLING(下降沿),或者 TIM_ICPOLARITY_BOTHEDGE(兩邊緣)。
ICSelection: 輸入捕獲選擇。可以是 TIM_ICSELECTION_DIRECTTI(直接輸入)或 TIM_ICSELECTION_INDIRECTTI(間接輸入)。
ICPrescaler: 輸入捕獲預分頻器。可以是 TIM_ICPSC_DIV1(無分頻),TIM_ICPSC_DIV2(除2),TIM_ICPSC_DIV4(除4),或 TIM_ICPSC_DIV8(除8)。
ICFilter: 輸入捕獲濾波器值,用于過濾輸入信號中的噪聲。
返回值HAL_OK: 配置成功。HAL_ERROR: 配置失敗。

4.當捕獲成功之后的中斷回調函數,直接重寫這個函數就可以:

__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
//此函數是捕獲之后的中斷回調函數,是一個弱函數。
//當捕獲發生后,可以重新定義相應的邏輯。
//注意:此中斷回調函數,需要要執行HAL_TIM_IC_Start_IT時才會被調用。

5、超聲波測距驅動(輸入捕獲實例)

在這里插入圖片描述
原理:啟動超聲波就是給Trig引腳通10us的高電平,然后超聲波左側就會發出,這個超聲波的頻率是40KHZ,發出8個周期,也就是0.2ms,超聲波發出之后,Echo引腳就會自動拉高電平,當超聲波回來以后,也就是右側的接收超聲波的8個周期完成,echo就會把電平拉低
實際就是超聲波發出后,echo拉高電平,超聲波接收完成,echo拉低電平,此時只需要監測echo處于高電平的時間就可以計算出距離
距離=聲速(340m/s)*傳播時間 / 2

echo可以維持最大38ms,也就是超出了量程,飛了
在這里插入圖片描述通道1選擇上升沿直接監測,通道2選擇下降沿間接監測,就可以獲取出Echo處于高電平的周期
1、選擇通道捕獲模式
在這里插入圖片描述
在這里插入圖片描述
通道1選擇輸入直接捕獲模式,通道2選擇輸入間接捕獲模式
2、選擇邊沿監測模式
在這里插入圖片描述
在這里插入圖片描述
通道1選擇上升沿監測,通道2選擇下降沿監測
3、選擇分頻系數
在這里插入圖片描述
4、整體
在這里插入圖片描述
Input Filter (4 bits value)是輸入濾波,設置的最大值15
配置PD15為輸出模式,接Trig
PD14是TIM4的chnl3,接Echo

前面說了這個超聲波測距模塊的Echo維持高電平的時間最大為38ms,所以這里就要設置一個周期要大于38ms,這里設置了分頻為72/(71+1) = 1MHz,也就是1/1000000 = 1us,也就是1us的時候CNT計數一次,38ms = 38000us,所以只要ARR大于38000就可以了,這里我設置了65535,完全可以包含38ms

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

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

相關文章

Git常用命令摘要

寫這篇博文的目的只是簡單的給自己及團隊的日常工作中需要用到的git命令作個匯總,這樣平時只需要查閱這篇文章就夠了,不用到處查找。如果能給有需要的朋友一點點的幫助,那也算是意外之喜吧。 一、基礎配置 # 設置用戶名和郵箱(首…

ubuntu 22.04 安裝部署kibana 7.10.0詳細教程

安裝部署kibana 7.10.0詳細教程 下載并安裝二、修改kibana.yml文件三、性能配置四、啟動服務驗證五、安裝啟動常見問題 【背景】 整個elk安裝是基于ubuntu 22.04和jdk 11環境。kibana均采用 *.deb方式安裝,需要服務器能聯網。ubuntu 22.04 安裝部署elk(elasticsearc…

nfs 服務器的搭建

nfs 服務器的搭建 1.配置yum源 mkdir /etc/yum.repos.d/bak mv /etc/yum.repo.d/*.repo /etc/yum.repos.d/bak/ curl -o /etc/yum.repos.d/centos.repo http://10.26.210.101/centos/centos.repo # 外網 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.c…

Yii2 基礎版實現 Token 認證 API 服務的完整框架方案

以下是一個基于 Yii2 基礎版實現 Token 認證 API 服務的完整框架方案,包含 JWT 實現和完整代碼: 1. 環境準備 composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-api cd yii2-api2. 安裝必要擴展 composer require firebase/php-jw…

主流版本控制工具Git vs Perforce P4:架構模式、性能、大文件管理及分支管理對比詳解

Git和Perforce P4是兩個強大的源代碼管理工具,各有其獨特的功能優勢與適用場景。 本文中,Perforce中國授權合作伙伴-龍智將從架構設計、性能表現、文件管理及分支策略等維度,為您詳細解析兩者的關鍵差異,幫助您根據團隊需求&…

文件系統2(Linux下)

1 掛載分區 文件系統1中已經知道了能夠根據inode號在指定分區找文件了,也已經能根據目錄文件內容,找指定的inode了,在指定的分區內,就可以對文件進行操作了。但是還有幾個問題,那就是inode是不能跨分區的,…

Leetcode-?2537. 統計好子數組的數目?

Problem: 2537. 統計好子數組的數目 思路 滑動窗口 解題過程 思路: 使用滑動窗口來維護子數組,并通過組合計數動態調整滿足條件的數對數目。具體來說,我們維護一個窗口[l,r],使得窗口內相同元素的對數至少為 k,并計算…

js手寫代碼篇--手寫Object.assign

19、Object.assign 作用: Object.assign的作用是將源對象的所有可枚舉屬性復制到目標對象中。它返回目標對象。 const obj1 { a: 1, b: 2 };const obj2 { b: 3, c: 4 };const obj3 { d: 5 };const target {};Object.assign(target, obj1, obj2, obj3);console…

使用 C/C++ 和 OpenCV 構建智能停車場視覺管理系統

使用 C 和 OpenCV 構建智能停車場視覺管理系統 本文將詳細介紹如何利用 C 和 OpenCV 庫,從零開始創建一個智能停車場管理系統。該系統通過攝像頭捕捉的畫面,能自動完成兩項核心任務: 車位識別:通過檢測地面上的黃色停車線&#…

服務器靜態ip,網關不能占用*.*.*.1

網關不能占用*.*.*.1.1 通常用于運行關鍵服務(如DHCP、NAT、DNS代理),.1 是網絡世界的"VIP包廂",普通用戶強闖只會被"請出"。

自然語言處理【NLP】—— CBOW模型

文章目錄 引言一、CBOW模型概述1.1 什么是CBOW模型1.2 CBOW vs Skip-gram 二、CBOW模型原理詳解2.1 模型架構2.2 數學原理2.3 訓練過程 三、CBOW的PyTorch實現四、CBOW模型的應用與優化4.1 典型應用場景4.2 性能優化技巧 五、CBOW的局限性六、結語 引言 在自然語言處理(NLP)領…

為MTK 9300開發板移植Linux系統(以Debian為例)的詳細技術指南

以下是為MTK 9300開發板移植Linux系統(以Debian為例)的詳細技術指南,涵蓋環境搭建、內核移植、驅動適配(攝像頭/顯示器/WiFi)、系統集成與優化。 MTK 9300開發板Linux系統移植全流程指南 1 項目概述 1.1 硬件平臺 SoC:MediaTek MTK9300 (ARMv8-A架構,4Cortex-A78 + 4C…

Java Lambda 表達式與 Stream API 全解析:從基礎到進階

以下是對您博客內容的優化版本,在保留原有核心內容的基礎上,補充了Lambda表達式及Stream API的完整方法體系,并通過結構化排版和擴展說明提升可讀性。 Java Lambda表達式與Stream API全解析:從基礎到進階 一、Lambda表達式與Str…

Let’s Encrypt(樂此加密) 免費SSL證書申請

一、前言 騰訊云、阿里云等平臺都支持免費的SSL證書申請,但只支持單域名SSL證書申請,不支持泛域名證書申請,而且每年只有20張免費證書額度,自2024年4月25日之起免費申請的證書只有3個月有效期。域名比較多的情況下,更新…

SQLite3 性能優化

在嵌入式開發和輕量級應用場景中,SQLite3 作為輕量級數據庫引擎,憑借其無需獨立服務器、部署便捷等特點被廣泛應用。然而,當面對大量數據的高速讀寫需求時,默認配置下的 SQLite3 性能往往難以滿足要求。本文將從數據庫配置調整、W…

零基礎設計模式——行為型模式 - 狀態模式

第四部分:行為型模式 - 狀態模式 (State Pattern) 我們繼續學習行為型模式,接下來是狀態模式。這個模式允許一個對象在其內部狀態改變時改變它的行為,對象看起來就像是改變了它的類。 核心思想:允許一個對象在其內部狀態改變時改…

面向對象面試題集合

前言 記錄面向對象面試題相關內容,方便復習及查漏補缺 題1.簡述面向對象?主要特征是什么? 面向對象編程(Object-Oriented Programming,簡稱OOP)是一種以“對象”為核心的編程范式,通過將現實…

二十一、【用戶管理與權限 - 篇三】角色管理:前端角色列表與 CRUD 實現

【用戶管理與權限 - 篇三】角色管理:前端角色列表與 CRUD 實現 前言準備工作第一部分:更新 API 服務以包含角色管理第二部分:添加角色管理頁面的路由和側邊欄入口第三部分:實現角色列表頁面第四部分:實現角色表單對話框組件第五部分:全面測試總結前言 一個完善的權限系統…

Objective-c protocol 練習

題目描述: 請使用 Objective-C 中的 protocol 協議機制,實現一個簡易的門禁控制系統。 系統包含兩個類: AccessControlSystem —— 門禁系統,用于執行開門操作;Admin —— 實現權限判斷邏輯的管理員。 要求如下&am…

科技創新賦能產業創新,雙輪驅動助力新疆高質量發展!

在新疆維吾爾自治區成立70周年之際,中國產學研合作促進會于6月14日在烏魯木齊舉辦“天山對話:推動新疆科技創新與產業創新”盛會。多位院士、專家、學者及企業代表齊聚一堂,探尋推動新疆科技創新和產業創新的新路徑、新動能。活動現場&#x…