STM32高级控制定时器(STM32F103):输入捕获模式

2024-05-28 07:28

本文主要是介绍STM32高级控制定时器(STM32F103):输入捕获模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

概述

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);  // PC7HAL_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

这篇关于STM32高级控制定时器(STM32F103):输入捕获模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置