STM_HAL_TIM_IC_(輸入捕獲,捕獲PWM波)

介紹

TM32微控制器提供了輸入捕獲(Input Capture)功能,這是一種用于精確測量外部信號脈沖寬度和周期的強大技術。輸入捕獲通常與定時器(如TIM)的高級控制定時器(TIM1和TIM8)或通用定時器(TIM2至TIM5)配合使用。

輸入捕獲的工作原理

輸入捕獲模式允許用戶在定時器的計數器與一個外部信號(通常是一個邊沿觸發信號)的邊沿同步時,捕獲定時器的當前計數值。通過捕獲信號的兩個連續邊沿之間的定時器計數值,可以計算出信號的脈沖寬度或周期。

輸入捕獲的關鍵特性

  • 時間戳功能:能夠記錄信號邊沿的確切時刻。
  • 方向檢測:可以檢測信號的上升沿和下降沿,從而判斷信號的頻率和方向。
  • 脈沖計數和頻率測量:通過計算兩個連續捕獲事件之間的時間差,可以測量信號的頻率和周期。
  • 脈寬調制(PWM)信號分析:可以分析PWM信號的占空比和頻率。

如何使用STM32的輸入捕獲

  1. 配置定時器和通道:選擇一個定時器,并配置其通道為輸入捕獲模式。
  2. 選擇輸入信號:將外部信號連接到定時器的相應輸入引腳。
  3. 配置觸發邊沿:設置捕獲信號是上升沿還是下降沿觸發,或者兩者都觸發。
  4. 配置預分頻器和計數器:根據輸入信號的頻率和所需的分辨率來配置定時器的預分頻器和自動重裝載寄存器(ARR)。
  5. 中斷和回調函數:配置輸入捕獲中斷,并在中斷服務例程中讀取捕獲寄存器的值,以計算信號的時間參數。

注意事項

  • 時鐘源選擇:確保定時器時鐘源配置正確,以獲得準確的計時。
  • 采樣率:根據信號頻率選擇合適的采樣率,以避免信號變化太快而無法準確捕獲。
  • 噪聲抑制:可能需要對輸入信號進行去抖動處理,以防止誤觸發。

?哪些定時器有輸入捕獲

  1. 高級控制定時器(TIM1和TIM8):這些定時器提供了最豐富的功能,包括輸入捕獲、輸出比較、PWM生成等。

  2. 通用定時器(TIM2至TIM5):這些定時器也支持輸入捕獲,但功能相對于高級控制定時器來說較少。

  3. 基本定時器(TIM6和TIM7):這些定時器主要用于簡單的時間計數,不支持輸入捕獲功能。

  4. 低功耗定時器(LPTIM):在某些STM32微控制器中,還可能包括低功耗定時器,它們在低功耗模式下非常有用,但可能不支持輸入捕獲。

?STM32Cude設置

1時鐘源設置

2開啟輸入捕獲

3輸入捕獲的設置

配置選項介紹

  1. Polarity Selection:這個選項允許你選擇捕獲信號的邊沿極性。你可以選擇:

    • Rising Edge:只在信號的上升沿捕獲計數器的值。
    • Falling Edge:只在信號的下降沿捕獲計數器的值。
    • Both Edges:在信號的上升沿和下降沿都捕獲計數器的值。
  2. IC Selection:這個選項決定了輸入信號的來源。通常,你可以選擇:

    • Direct:直接連接到定時器的輸入通道,不經過任何其他硬件處理。
    • Indirect:通過一個濾波器或信號處理器連接到定時器的輸入通道。
  3. Prescaler Division Ratio:這個選項允許你設置一個預分頻器,用于降低輸入信號的頻率。你可以選擇不進行預分頻(No division),或者選擇2、4、8等分頻比,以便在捕獲之前降低信號的頻率。

  4. Input Filter (4 bits value):這個選項允許你設置一個數字濾波器,用于減少輸入信號上的噪聲。濾波器的寬度可以從0到15,其中0表示不使用濾波器,而15表示最強的濾波器設置。濾波器的寬度決定了信號必須保持新電平多長時間才能被視為有效跳變。

?

4開啟中斷

之后生成代碼

代碼設置

有哪些函數

  1. HAL_TIM_IC_Init:用于初始化定時器的輸入捕獲通道。

    HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
    
  2. HAL_TIM_IC_ConfigChannel:用于配置定時器的輸入捕獲通道

    HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfigIC, uint32_t Channel);
    
  3. HAL_TIM_IC_Start用于啟動輸入捕獲。

    HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
    
  4. HAL_TIM_IC_Start_IT用于啟動輸入捕獲并使能中斷。

    HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
    
  5. HAL_TIM_IC_Stop:用于停止輸入捕獲。

    HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
    
  6. HAL_TIM_IC_Stop_IT:用于停止輸入捕獲并禁用中斷。

    HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
    
  7. HAL_TIM_IRQHandler:用于定時器中斷處理函數,需要在用戶定義的中斷服務例程中調用

  8. void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);
    
  9. HAL_TIM_IC_CaptureCallback:用于輸入捕獲中斷的回調函數,需要在HAL_TIM_IRQHandler中調用。

    1. 是捕獲一次返回一次中斷

      void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);

2實驗思路將PWM產生的波,用通道1進行捕獲返回捕獲的值

main.h源碼

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){//獲取占空比中的頻率   要獲取一個周期的頻率 =頻率/(預分頻+重裝值);重裝值為 第二次計數減去第一次計數uint32_t tim__CNT=__HAL_TIM_GET_COUNTER(htim);//當前計數值uint32_t tim__PSC=TIM2->PSC;//預分頻值uint32_t PAB1_HZ=72000000;//PAB1頻率uint32_t data=PAB1_HZ/(tim__CNT+tim__PSC);//占空的頻率char  aa[10];sprintf(aa,"頻率%06d",data);HAL_UART_Transmit(&huart1,(uint8_t*)aa,10,20);
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//啟動捕獲HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//啟動PWM/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

總結

輸入捕獲就是在產生輸入波形的信號時產生一個反饋信號

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

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

相關文章

MySQL之Schema與數據類型優化和創建高性能的索引(一)

Schema與數據類型優化 只修改.frm文件 從前面的例子中可以看到修改表的.frm文件是很快的,但MySQL有時候會在沒有必要的時候也重建.如果愿意冒一些風險,可以讓MySQL做一些其他類型的修改而不用重建表。下面這些操作是有可能不需要重建表的: 1.移除(不是…

JavaEE-文件IO2

文章目錄 前言一、字節流1.1 讀文件1.2 寫文件 二、字符流2.1 讀文件2.2 寫文件 三、文件IO三道例題 前言 在這里對Java標準庫中對文件內容的操作進行總結,總體上分為兩部分,字節流和字符流,就是以字節為單位讀取文件和以字符為單位讀取文件…

[AI Google] 介紹 VideoFX,以及 ImageFX 和 MusicFX 的新功能

VideoFX 是來自 labs.google 的最新實驗,您可以查看音樂效果和圖像效果的新更新,現在在 110 多個國家可用。 生成式媒體正在改變人們構思創意并增強我們的創造力能力的方式。我們致力于與創作者和藝術家合作構建人工智能,以更好地理解這些生成…

cmake使用交叉編譯工具鏈并驗證

目錄 一、內容 二、配置 1. 準備cmake文件 2. 使用交叉編譯 三、驗證 1. 構建階段驗證 2. 編譯階段驗證 一、內容 目的:在X86環境下編譯ARM平臺軟件 編寫交叉編譯配置文件:xx.cmake 執行cmake命令時指定:cmake \ -DCMAKE_TOOLCHAIN_F…

Linux Crontab:看完這篇,還有啥不懂的嗎

在Linux系統管理中,自動化是一個至關重要的概念,它可以幫助我們節省時間、減少錯誤并提高效率。crontab> 是實現這一目標的強大工具,它允許我們安排任務在特定的時間自動執行。本文將詳細介紹 crontab 的基礎概念、語法、命令、高級技巧以…

K8S認證|CKA題庫+答案| 12. 查看Pod日志

目錄 12、查看Pod日志 CKA v1.29.0模擬系統免費下載試用: 題目: 開始操作: 1)、切換集群 2)、提取錯誤日志 3)、驗證提取結果 12、查看Pod日志 CKA v1.29.0模擬系統免費下載試用: 百度…

簡單的UDP網絡程序:多人群聊系統

本章重點 能夠實現一個簡單的udp客戶端/服務器; 1.創建套接字 我們把服務器封裝成一個類,當我們定義出一個服務器對象后需要馬上初始化服務器,而初始化服務器需要做的第一件事就是創建套接字。 ?參數說明: domain:創建套接字的域…

Nginx代理配置(專業版)

寫在前面提醒:使用代理,如果可以,請盡量支持雙協議,http、https均要支持哈。 注意:監控系統只是運行代碼,是否支持https,需要運維同學在你們的服務器上配置https證書,配置好證書&…

在 CentOS 上安裝 PostgreSQL 的全面指南

PostgreSQL 是一種功能強大的開源關系型數據庫管理系統,廣泛應用于各種領域。它提供了諸如事務處理、并發控制和數據完整性等高級功能,因此深受開發者和企業的歡迎。本指南將逐步引導您在 CentOS 上安裝 PostgreSQL,以便您充分利用其眾多優勢…

決定了,將ChatGPTer開源!主打一個大模型人人可用。

一個快速上手且極易部署的類ChatGPT開源應用,可接入 OPENAI API 或 通義千問API 開源地址: https://github.com/isnl/EsChat 大聲(偷偷)告訴你:通義千問有免費API額度可白嫖!!! 版本特性 OPENAI 和 通義千…

點云AABB、OBB包圍盒計算顯示

目錄 一、簡介 1)AABB包圍盒 2)OBB包圍盒 二、計算代碼 三、加載計算結果

什么是Promise

Promise 是 JavaScript 中的一個對象,用于處理異步操作。它代表了一個最終可能完成(也可能被拒絕)的異步操作及其結果值。Promise 對象用于更復雜的異步編程模式,包括使用 .then() 和 .catch() 鏈式調用來處理異步操作的結果。 P…

算法提高之區間最大公約數

算法提高之區間最大公約數 核心思想&#xff1a;線段樹 1.在區間上加一個數 差分 2.求一段區間的最gcd 求[l,r]的gcd 可以拆解為求**[1,l].sum(差分數組 求出來時l點的值)和[l1,r]**做gcd #include <iostream>#include <cstring>#include <algorithm>usi…

1738. 找出第 K 大的異或坐標值

1738. 找出第 K 大的異或坐標值 題目鏈接&#xff1a;1738. 找出第 K 大的異或坐標值 代碼如下&#xff1a; //列前綴異或和 //參考鏈接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/solutions/2790359/liang-chong-fang-fa-er-wei-qian-zhui-yi-68…

Docker數據卷(volume)

數據卷 數據卷是一個虛擬目錄&#xff0c;是容器內目錄與宿主機目錄之間映射的橋梁。&#xff08;容器內目錄與宿主機目錄對應的橋梁&#xff0c;修改宿主機對應的目錄&#xff0c;docker會映射到容器內部&#xff0c;相當于修改了容器內的&#xff0c;反之也一樣&#xff09;數…

利用英特爾 Gaudi 2 和至強 CPU 構建經濟高效的企業級 RAG 應用

檢索增強生成 (Retrieval Augmented Generation&#xff0c;RAG) 可將存儲在外部數據庫中的新鮮領域知識納入大語言模型以增強其文本生成能力。其提供了一種將公司數據與訓練期間語言模型學到的知識分開的方式&#xff0c;有助于我們在性能、準確性及安全隱私之間進行有效折衷。…

任推邦:實力強勁的APP推廣拉新平臺,號稱不扣量

任推邦簡介 任推邦是國內數一數二的項目分發平臺&#xff0c;也是一個不扣量的項目APP推廣拉新平臺&#xff0c;隸屬于聚名科技集團股份有限公司。聚名科技成立時間在2012年&#xff0c;是安徽省老牌互聯網企業&#xff0c;歷經11年的飛速發展&#xff0c;聚名科技成功布局打造…

小程序的這些知識你知道嗎?

一:導航傳參 無論是編程式還是聲明式導骯傳參都是在url?keyvalue&key1value1,無論是否是tabbar頁面. 對于回退頁面,沒辦法傳參. 這個參數是,跳轉到頁面的時候,跳轉到另一個頁面,這個頁面就是剛開始執行,等數據執行之后,觸發onload,傳遞的參數放在內存中,跳轉是內部底層觸…

云端力量:利用移動云服務器高效部署Spring Boot Web應用

文章目錄 一、移動云介紹二、移動云產品選擇三、體驗云主機ECS四、使用移動云服務器部署SpringBoot Web應用4.1移動云ECS安裝JDK4.2移動云ECS安裝MySQL4.3移動云ECS數據庫插入數據4.4移動云ECS部署Spring Boot Web應用 總結 一、移動云介紹 移動云是中國移動基于自研的先進技術…

Linux中常見的基本指令(上)

目錄 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 語法 &#xff1a; ls [ 選項 ][ 目錄或文件 ] 。 功能 &#xff1a;對于目錄…