STM32高级控制定时器之输入捕获模式

目录

概述

1 输入捕获模式

1.1 原理介绍

1.2 实现步骤

1.3 发生输入捕获流程

2 使用STM32Cube配置工程

2.1  软件环境

 2.2 配置参数

2.3 生成项目文件

3 功能实现

3.1 PWM调制占空比函数

3.2 应用函数库

4 测试

4.1 功能框图

4.2 运行结果


源代码下载地址:

stm32-f103-rct6-输入捕获测试代码资源-CSDN文库

概述

本文主要介绍STM32高级定时器的用法至输入捕获功能,该功能可用于捕捉外部输入信号的频率。笔者通过详细的案例介绍这个功能,包括理论知识,实现原理,以及如何使用STM32Cube配置基本的参数,编写实用代码,实现捕捉频率当的功能。

1 输入捕获模式

1.1 原理介绍

在输入捕获模式下,捕获/比较寄存器(TIMx_CCRx)用于锁存在由相应的ICx信号检测到的转变之后的计数器的值。当发生捕获,相应的CCXIF标志(TIMx_SR寄存器)被设置,并且中断或
如果它们被启用,则可以发送DMA请求。如果在CCxIF标志为则过捕获标志CCxOF(TIMx_SR寄存器)被设置。CCxIF可以是软件通过将其写入“0”或读取存储在中的捕获数据来清除TIMx_CCRx寄存器。CCxOF在写入“0”时被清除。

1.2 实现步骤

以下示例显示如何在TI1时捕获TIMx_CCR1中的计数器值投入增加。要执行此操作,请使用以下步骤:

1) 选择激活输入:TIMx_CCR1必须连接到TI1输入,因此写入CC1S位到TIMx_ CCMR1寄存器中的01。一旦CC1S变得与00不同,通道被配置在输入端并且TIMx_ CCR1寄存器变为只读。

2)  针对连接到的信号编程所需的输入滤波器持续时间定时器(如果输入是TIx输入,则通过在TIMx_CCMRx寄存器中编程ICxF位)。让我们想象一下,当切换时,输入信号在at must five期间不稳定内部时钟周期。我们必须编程一个比这五个时钟更长的滤波器持续时间循环。当8个连续样本具有新的已经检测到电平(以fDTS频率采样)。然后将IC1F位写入中的0011
CCMR1寄存器。

3) 通过将CC1P位写入0,选择TI1通道上活动转换的边缘CCER寄存器(在这种情况下为上升沿)。

4)  对输入预分频器进行编程。在我们的示例中,我们希望捕获在每个有效转换,因此预分频器被禁用(将IC1PS位写入TIMx_CCMR1寄存器)

5 ) 通过在中设置CC1E位,启用从计数器到捕获寄存器的捕获TIMx_CCER寄存器。

6 ) 如果需要,通过在中设置CC1IE位来启用相关的中断请求TIMx_DIER寄存器和/或DMA请求,通过在TIMx_DIER寄存器。

1.3 发生输入捕获流程

为了处理过度捕获,建议在过度捕获标志。这是为了避免错过阅读后可能发生的过度捕获
标志和读取数据之前。

1) TIMx_CCR1寄存器在激活转换时获取计数器的值。

2)CC1IF标志被设置(中断标志)。如果至少有两次连续捕获,也会设置CC1OF发生,而标志未被清除。

3)根据CC1IE位生成中断

4)根据CC1DE位生成DMA请求

注意问题:

IC中断和/或DMA请求可以由软件通过设置EGR寄存器中相应的CCxG位。

2 使用STM32Cube配置工程

2.1  软件环境

软件名称版本信息
STM32CubeSTM32CubeMX 6.11
STM32 HALSTM32Cube_FW_F1_V1.8.5

2.2 配置参数

1)配置系统时钟:72M Hz,Timer的工作时钟为72M Hz

2)  使用定时器1配置输入捕获功能

 其对应的IO口配置

 计数器时钟参数和捕获通道参数

 3)配置PWM相关参数

选择定时器8作为控制PWM的输出

PWM波对应的IO接口

 Timer-8定时器相关参数

和PWM相关的参数配置

 

2.3 生成项目文件

 使用STM32FCube完成项目配置后,就可以生成工程文件。生成代码如下:

3 功能实现

3.1 PWM调制占空比函数

tim.c中实现一个函数,其用于实现调制PWM的占空比。函数原型如下:

void HAL_TIM_SetPWM_Pulse( uint32_t Pulse, uint32_t Channel)
{
  TIM_OC_InitTypeDef sConfigOC = {0};
  
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = Pulse;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, Channel) != HAL_OK)
  {
    Error_Handler();
  }
}

3.2 应用函数库

创建App/product目录,实现应用函数。

1)pwm_ctrl.c 实现pwm的功能控制

2)input_capture.c 实现捕捉功能

1) 在 pwm_ctrl.c文件中配置PWM的占空比

void pwm_ctrl_Init( void )
{
    HAL_TIM_Base_Start( &htim8 );
    HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);  // PC6 
    HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);  // PC7
     
    HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_1);
    HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_2);
}

2)input_capture.c 实现捕捉功能

初始化捕捉功能参数:

static void set_captureMode(  uint32_t Channel, uint32_t ICPolarity )
{
  TIM_IC_InitTypeDef sConfigIC = {0};
  
  if(HAL_TIM_IC_Stop_IT(&htim1, Channel) != HAL_OK)
  {
    /* Starting Error */
    Error_Handler();
  }
  
  sConfigIC.ICPolarity = ICPolarity;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, Channel) != HAL_OK)
  {
    Error_Handler();
  }
  
  if(HAL_TIM_IC_Start_IT(&htim1, Channel) != HAL_OK) 
  {
    /* Starting Error */
    Error_Handler();
  }
}

3)捕捉功能回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  uint32_t uwIC2Value0;
  static uint32_t uwIC2Value2_list[2];
  static uint8_t count = 0;
    
  if(htim->Instance == TIM1) 
  {
      if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
      {
          /* Get the 1st Input Capture value */
          uwIC2Value0 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
          uwIC2Value2_list[count] = uwIC2Value0;
            count++;
            if( count == 2 ){
               count = 0;
               if( uwIC2Value2_list[1] > uwIC2Value2_list[0])
                    printf(" cycle = %d us\r\n",  uwIC2Value2_list[1]- uwIC2Value2_list[0]);
            }
       }
  }
}

4 测试

4.1 功能框图

4.2 运行结果

1)使用逻辑分析仪测试,PWM的周期为10ms

2)使用捕捉功能测试的数据为: 10000us = 10ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/664392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ELK的日志管理【开发实践】

文章目录 一、ELK简介1.1 ELK的作用与应用1.2 ELK的组成1.3 Elasticsearch1.4 Logstash1.5 Kibana1.6 ELK架构简述1.7 基础知识1.7.1 数据格式1.7.2 正排索引和倒排索引1.7.3 全文搜索 二、ES入门---基于HTTP的使用方式(了解)2.1 索引操作2.1.1 创建索引…

探索无限可能:API平台引领数据驱动的新时代

在数字化浪潮的推动下,数据已成为推动商业创新和增长的核心动力。然而,数据的获取、整合和应用并非易事,需要跨越技术、安全和效率等多重挑战。幸运的是,API(应用程序接口)平台的出现,为我们打开…

docker 安装mysql,redis,rabbitmq

文章目录 docker 安装ngnix,mysql,redis,rabbitmq安装docker1.安装下载docker-ce源命令2.安装docker3.查看版本4.查看docker状态5.启动docker6.测试安装ngnix 安装mysql8.0.361.拉取mysql镜像2.安装mysql8 安装redis1.拉取redis7.0.11镜像2.安装redis3.进入容器内部…

159.二叉树:二叉树的层平均值(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

mybatisPlus3.5.1有个奇葩bug的解决方法

mybatisPlus3.5.1有个奇葩bug的解决方法 文章目录 1.啥bug?1.1mybatisPlus官网及GitHub项目地址1.2 bug问题 2.解决方法2.1根据报错修改表中字段2.2 升级JSqlParser依赖的版本2.3升级mybatisPlus的版本 3.mysql关键字大全4.总结 1.啥bug? 1.1mybatisPlu…

上传RKP 证书签名请求息上传到 Google 的后端服务器

上传证书签名请求 1.准备环境:OK pip3 install google-auth2.13.0 requests2.28下载 device_info_uploader.py 。 没找到先跳过 选项 1:通过 GCP 帐户使用 device_info_uploader.py 运行脚本。 ./device_info_uploader.py --credentials /secure/s…

软件测试可发现所有bug吗?有什么样的原则和目的?

在今天的高度数字化时代,软件测试的重要性不可忽视。这是一种系统性的过程,通过对软件系统进行评估和验证,以确定其是否满足预期要求。在软件开发的各个阶段,软件测试都扮演着至关重要的角色。它涉及到软件功能、性能、安全性等多…

基于Spring Boot框架的分页查询和文件上传

分页查询 分析 要想从数据库中进行分页查询,我们要使用LIMIT关键字,格式为:limit 开始索引 每页显示的条数 假设一页想展示10条数据 查询第1页数据的SQL语句是: select * from emp limit 0,10; 查询第2页数据的SQL语句是&…

【推荐】用scss循环zoom缩放比例,解决可视化大屏在不同分辨率屏幕下的适配问题

方法1: 指定几种常规屏幕宽度(用这种方式就必须要强制用户全屏查看页面,在固定的宽度下才能达到比较不错的显示效果) // 适配不同分辨率的页面---------------------------------------- html {overflow: hidden;width: 1920px;…

光电耦合器:航天航空领域的先进连接技术

光电耦合器作为一种关键的电子连接器,在航天航空领域扮演着重要角色。本文将深入探讨光电耦合器在航天航空领域的应用及其技术特点。 光电耦合器在航天航空领域的应用 光电耦合器作为一种高可靠性、高速传输、抗干扰能力强的连接器,在航天航空领域有着广…

Mybatis 查询TypeHandler使用,转译查询数据(逗号分隔转List)

创建自定义的Hanndler /*** Package: com.datalyg.common.core.handler* ClassName: CommaSeparatedStringTypeHandler* Author: dujiayu* Description: 用于mybatis 解析逗号拼接字符串* Date: 2024/5/29 10:03* Version: 1.0*/ public class CommaSeparatedStringTypeHandle…

U盘格式化怎么操作?快来学这4种法

U盘格式化怎么操作?在计算机领域中,格式化通常指对存储设备(如硬盘、U盘)进行格式化操作,清空其中的数据并重新建立文件系统,以便进行数据存储和管理。 U盘格式化一共有哪些方法?在格式化U盘之…

暑期来临,AI智能视频分析方案筑牢防溺水安全屏障

随着夏季暑期的来临,未成年人溺水事故频发。传统的防溺水方式往往依赖于人工巡逻和警示标识的设置,但这种方式存在人力不足、反应速度慢等局限性。近年来,随着视频监控智能分析技术的不断发展,其在夏季防溺水中的应用也日益凸显出…

Kubernetes 系统监控Metrics Server、HorizontalPodAutoscaler、Prometheus

Metrics Server Linux 系统命令 top 能够实时显示当前系统的 CPU 和内存利用率,它是性能分析和调优的基本工具。 Kubernetes 也提供了类似的命令,就是 kubectl top,不过默认情况下这个命令不会生效,必须要安装一个插件 Metrics …

[图的搜索]5.图解狄克斯特拉算法及其代码演示

狄克斯特拉算法 与前面提到的贝尔曼-福特算法类似,狄克斯特拉(Dijkstra)算法也是求解最短路径问题的算法,使用它可以求得从起点到终点的路径中权重总和最小的那条路径路径。 图解 01 这里我们设A为起点、G为终点,来讲…

论文笔记:Image Anaimation经典论文-运动关键点模型(Monkey-Net)

Monkey-Net(MOviNg KEYpoints) paper: https://arxiv.org/pdf/1812.08861, CVPR 2019 code: https://github.com/AliaksandrSiarohin/monkey-net/tree/master 相关工作 视频生成演变过程: spatio-temporal network: 如基于GAN网络的生成模…

探索重庆耶非凡科技:揭秘其背后的技术实力与市场布局

重庆耶非凡科技有限公司,作为重庆当地一家知名的综合性服务型企业,近年来在多个领域取得了显著的成绩。其业务范围广泛,不仅涵盖了传统的行业服务,还积极探索并实践了一系列创新项目,其中最为引人注目的便是选品师项目…

Linux服务器搭建http服务,添加DNS域名解析

效果如下:搭建自己的网站,添加域名解析服务后,外网可访问 1.搭建http服务器,可通过局域网下的ip访问 2.DNS域名解析服务,链接ip到公网,外网可以通过对应的域名访问 1.安装httpd yum install httpd #根据提示…

记录Win11安装打印机驱动过程

1. 首先下载打印机对应型号的驱动 可以从这里下载:打印机驱动,打印机驱动下载 - 打印机驱动网 2. 下载 3. 打开控制面板-->设备和打印机 找到目标打印机添加设备即可 新增打印纸张尺寸

2024年在抖音赚钱,可以不用直播,拍短视频了!

短视频经济发展的越来越快,不少人靠着这次风口,在抖音做直播,拍视频赚到了不少钱。 很多人普通人靠着抖音的流量,一夜之间暴富的案例数不胜数。 像“郭有才”“王妈”就是个明晃晃的例子。 但是很多人都说现在这样的案例越来越…