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.mzph.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;对于目录…