STM32快速入门(定时器之输入捕获)

STM32快速入门(定时器之输入捕获)

前言

本节主要讲解STM32利用通用定时器,在输入引脚出现指定电平跳变时,将CNT的值锁存到CCR寄存器当中,从而计算PWM波形的频率、占空比、脉冲间隔、电平持续时间等。其功能的应用有:波形采样。

导航

图98 通用定时器框图:

总览图

图片引自STM32 F1XX系列的中文参考手册。在通用定时器章节的定时器架构图中,本章讲解的定时器输入捕获功能位于左下角的红色矩形中。

定时器输入捕获的实现细节

参考中文手册,实现细节图123如下:

捕获设计的细节

它内部实现是:根据用户设定的极性,采集输入方波信号上升沿/下降沿,将每次上升沿/下降沿的CNT寄存器的值抓取到CCR寄存器中,从而可以获取到输入信号的特性。

参考图123,从左向右介绍控制细节

对于一个通用定时器,有四个通道可作为输入(或输出),信号输入进来首先会经过滤波器进行滤波,消除不稳定的干扰信号,用户可以通过配置 TIMx_CCMR1.IC1F[7:4] 选择采样模式,可以以不同频率不同次数进行采样滤波。如下图。

滤波器的配置

采样可选频率来源有F_CK_INT和F_DTS。其中,F_CK_INT就是定时器的内部时钟(F103默认72M HZ),而F_DTS其实间接取自F_CK_INT的分频。通过配置 TIMx_CR1.CKD[9:8] 可设置F_DTS的分频系数。如下:

DTS频率配置

经过滤波器滤波后的信号在图123中被标记为TI1F,TI1F会传入中间部分的边沿检测器,边沿检测器会根据输入的TI1F分拣出波形的每个上升沿和下降沿,根据输入信号的每一个上升沿/下降沿,向上升沿输出引脚/下降沿引脚输出一个小方波,从而给后面的选择器进行选择,图中间部分有上下两个矩形,在中文手册中,所有类似这样的矩形都是选择器, TIMx_CCER.CC1P[1] 正是通过控制选择器来实现极性的选择。经过极性选择后的波形在图123被标记为TI1FP1。图中还有一个被标记为TI1F_ED的输出,TI1FP1和TI1F_ED的区别是前者是经过选择的上升沿是下降沿的边沿指示信号,而后者是上升沿下降沿的边沿指示信号,频率上来讲TI1F_ED会更高。注意这里边沿指示信号和源信号的区别,我最开始看这张图的中间部分就非常迷糊。

接着看右边最大的那个选择器,该选择器就是配置三路的哪一路作为IC1的输入。三路输入分别是:TI1FP1(对应TIMX_CH1)、TI2FP1(对应TIMX_CH2)、TRC(主从模式下,来自主定时器的信号),通过配置 TIMx_CCMR1.CC1S[1:0] 可以控制选择器选择哪一路。同时后面的预分频器可以通过 TIMx_CCMR1.IC1PSC[3:2] 来调节。如下图60:

CC1S_IC1PSC

最后配置使能寄存器 TIMx_CCER.CC1E[0] 就能使能定时器的输入啦!

精妙设计一

细心的读者在看到图98 红色矩形部分时,应该会注意通道TIMX_CH1和通道TIMX_CH2中间部分是存在交叉的,这里放一张特写图。

Cross

这TI1FP1和TI1FP2的信号源都是来自TIMX_CH1,图123的描述其实有些瑕疵。TI1FP1和TI1FP2的信号源相同,并且可以分别独立的控制去选择极性。也就是说完整的图123应该是有两路TI1FP的,并且可以单独的控制其极性。 如果只使用一路的捕获,我们一次只能测量信号源的频率;而有了这种交叉的设计,我们就可以实现对一个信号源,同时测量其频率和占空比。图60表述了将ICX映射到哪一路,通过配置 TIMx_CCMR1.CC1S[1:0] 可以选择。

精妙设计二

STM32 F1XX里面定时器的设计特别精妙,利用好定时器的主从模式可以实现硬件全自动化复位操作。比如:我们可以利用TI1FP1的信号实现定时器的自动复位,步骤如下:

  1. 配置 TIMx_SMCR.TS[6:4] 为101,这样滤波后的定时器输入1(TI1FP1)作为定时器触发源。 这里的主次好像是两个定时器,但实际上都是一个定时器扮演。

  2. 配置 TIMx_SMCR.SMS[2:0] 为100,这样在收到TI1FP1的触发信号就会将定时器复位。从而达到清零的目的。

涉及的寄存器如下:

AutoReset

此外,还可以实现定时器级联的效果,比如使用一个定时器作为另一个定时器的预分频。根据中文参考手册配置步骤如下:

MSPSC

除了上面提到的用法,定时器其实还要很多奇妙的用法。具体可以查询中文参考手册。中文参考手册很多东西写的其实非常详细了,就是初学者来说,可能很难耐心去阅读。这点真的要好好锤炼,中文都看不下去,更何况以后还要接触英文的。

定时器实现输入捕获的步骤

综上,可以总结出配置定时器输入部分的套路:

  1. 通过 TIMx_CCMR1.IC1F[7:4] 配置滤波器,选择其频率和采样次数。

  2. 通过 TIMx_CCER.CC1P[1] 配置要捕获的极性(上升沿还是下降沿)。

  3. 通过 TIMx_CCMR1.CC1S[1:0] 可以配置图123中,右边那个最大的选择器,选择三路的哪一路作为IC1的来源。

  4. 通过 TIMx_CCMR1.IC1PSC[3:2] 可以配置图123中,右边那个分频器的分频系数。

  5. 通过 TIMx_CCER.CC1E[0] 可以使能捕获输入。

定时器实现输入捕获的库函数实现

本节输入捕获实验会复用定时器输出PWM(输出在PB5口)的呼吸灯实验的代码,经过查表,会将原PB5端口输出的PWM信号使用杜邦线,引到PA0端口并且作为TIM2定时器输入。 IO口需要的配置如下:

GPIOCfg.

AFIO

核心代码如下:

void LunarInitTIM3() {GPIO_InitTypeDef GPIOB5_Cfg;TIM_TimeBaseInitTypeDef TIM3_Cfg;TIM_OCInitTypeDef TIM3_OCCfg;// 配置GPIO 	BEGIN// 开启复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 部分重映射GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);// 初始化GPIOB5为推挽复用输出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIOB5_Cfg.GPIO_Mode = GPIO_Mode_AF_PP;GPIOB5_Cfg.GPIO_Pin = GPIO_Pin_5;GPIOB5_Cfg.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIOB5_Cfg);// 配置GPIO 	END// 定时器时基配置   BEGIN// 打开TIM3所需要的时钟 APB1RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_TimeBaseStructInit(&TIM3_Cfg);// 配置使用内部时钟 72M HzTIM_InternalClockConfig(TIM3);// 这里配置定时器更新频率是1000HZTIM3_Cfg.TIM_CounterMode = TIM_CounterMode_Up;TIM3_Cfg.TIM_Period = 100 - 1;TIM3_Cfg.TIM_Prescaler = 720 - 1;TIM_TimeBaseInit(TIM3, &TIM3_Cfg);// 因为TIM_TimeBaseInit会置TIMx_EGR.UG[0]为1,产生一个更新事件,// 去同步影子寄存器的值,而该更新事件又会产生一个多余的中断,所以,// 我们需要在开启中断之前,手动清楚更新事件标志位TIM_ClearFlag(TIM3, TIM_FLAG_Update);// 定时器时基配置   END// 配置TIM3的PWM输出	BEGINTIM_OCStructInit(&TIM3_OCCfg);TIM3_OCCfg.TIM_OCMode = TIM_OCMode_PWM1;TIM3_OCCfg.TIM_OCPolarity = TIM_OCPolarity_High;TIM3_OCCfg.TIM_OutputState = TIM_OutputState_Enable;TIM3_OCCfg.TIM_Pulse = 80;TIM_OC2Init(TIM3, &TIM3_OCCfg);// 配置TIM3的PWM输出	END// 使能arr和ccr寄存器的影子功能TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE);// 使能更新中断// TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);// 开启定时器TIM_Cmd(TIM3, ENABLE);
}void LunarInitTIM2() {GPIO_InitTypeDef GPIOA0_Cfg;TIM_TimeBaseInitTypeDef TIM2_Cfg;TIM_ICInitTypeDef TIM2_IC1Cfg, TIM2_IC2Cfg;// 配置GPIO 	BEGINRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIOA0_Cfg.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIOA0_Cfg.GPIO_Pin = GPIO_Pin_0;GPIOA0_Cfg.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIOA0_Cfg);// 配置GPIO 	END// 定时器时基配置   BEGIN// 打开TIM2所需要的时钟 APB1RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseStructInit(&TIM2_Cfg);// 配置使用内部时钟 72M HzTIM_InternalClockConfig(TIM2);// 这里配置定时器更新频率是1000HZTIM2_Cfg.TIM_CounterMode = TIM_CounterMode_Up;// TIM2_Cfg.TIM_Period = 100 - 1;TIM2_Cfg.TIM_Period = 0xffff;TIM2_Cfg.TIM_Prescaler = 720 - 1;TIM_TimeBaseInit(TIM2, &TIM2_Cfg);TIM_ClearFlag(TIM2, TIM_FLAG_Update);// 定时器时基配置   END// 配置TIM2进行输入捕获		BEGINTIM_ICStructInit(&TIM2_IC1Cfg);TIM_ICStructInit(&TIM2_IC2Cfg);TIM2_IC1Cfg.TIM_Channel = TIM_Channel_1;TIM2_IC1Cfg.TIM_ICFilter = 0x4;TIM2_IC1Cfg.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM2_IC1Cfg.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM2_IC1Cfg.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInit(TIM2, &TIM2_IC1Cfg);// 实现同时捕获上升下降沿。TIM2_IC2Cfg.TIM_Channel = TIM_Channel_2;TIM2_IC2Cfg.TIM_ICFilter = 0x4;TIM2_IC2Cfg.TIM_ICPolarity = TIM_ICPolarity_Falling;TIM2_IC2Cfg.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM2_IC2Cfg.TIM_ICSelection = TIM_ICSelection_IndirectTI;TIM_ICInit(TIM2, &TIM2_IC2Cfg);// 配置TIM2进行输入捕获		END// 利用从模式配置自动重置。TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);// 使能arr寄存器的影子功能	// ccr寄存器只读TIM_ARRPreloadConfig(TIM2, ENABLE);// 使能更新中断// TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 开启定时器TIM_Cmd(TIM2, ENABLE);
}int main() {// 初始化串口LunarInitUSART1();// 初始化定时器LunarInitTIM3();LunarInitTIM2();SYSTick_Init();int dir = 0, cr = 0;while(1) {Delay_Ms(100);printf("PWM f = %d ", 100000 / (TIM_GetCapture1(TIM2) + 1));printf("PWM f = %f \n", (float)(TIM_GetCapture2(TIM2) + 1) / (TIM_GetCapture1(TIM2) + 1));}return 0;
}

实验结果就是从串口中,我们可以看到PB5输出的PWM波形的频率和占空比值。


本章完结

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【转载】SAP MM培训事务代码

有需要的赶快收藏起来!!!

4diacIDE同时编译不同版本踩坑记录

4diac不同版本依赖插件版本及jdk版本是不同的,当你需要搭建不同版本4diacIDE开发环境时,就会出现各种问题。最近一个月github上项目提交记录比较多,出现了不少坑。以下记录下此背景下的解决方法: 1、首先由于.target依赖的eclipse…

实战Java虚拟机-基础篇

JVM的组成 一、自动垃圾回收 1.Java的内存管理 Java中为了简化对象的释放,引入了自动的垃圾回收(Garbage Collection简称GC)机制。通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。其…

Win11任务栏通知很不明显的解决方案

Win11流行起来后,不少用户抱怨Win11的任务栏通知闪烁的颜色很不明显,经常微信来消息了看不到。虽然有右下角的微信图标会闪烁,但是提醒舒适度还是觉得不如Win10舒服显眼。 默认的颜色是这样子的,可以看得出Win11的任务栏提醒颜…

推荐5个AI工具平替GPT

随着AI技术的快速发展,AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头,国内很多小伙伴往往望而却步,究其原因,就是它的使用门槛高,还有成本的考量。 不过,随着GPT技术的火热,国内也涌…

Jetpack Compose(一

Intellij IDEA构建Android开发环境 IntelliJ IDEA 2023.2.1 Android开发变化 IDEA配置使用Gradle 新建Compose工程,取名ComposeStudy 可以看到的是IDEA为项目初始化了部分代码 使用Compose开发不再需要使用xml文件来设计布局了 Compose中的Text也不同于Android V…

JAVA语言程序设计1(第七章)

一、编程思想 1. 面向过程: (1) 面向过程:将问题分为第一步、第二步、第三步... 直到问题解决 (2) 问题:解决小业务相对比较简单,但是面对复杂业务时,相对不好处理 2. 面向对象: (1) 面向对象&#…

Windows10环境搭建http服务器

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

TikTok营销策略解析:7大关键要素打造品牌影响力

TikTok作为近年来迅速崛起的短视频社交平台,已经成为全球范围内品牌营销的重要阵地。对于品牌而言,如何在TikTok上有效地开展营销活动,吸引目标受众的注意力,提升品牌知名度和影响力,是摆在他们面前的重要课题。本文No…

联发科技发布天玑9300+旗舰5G生成式AI芯片 | 最新快讯

5 月 7 日消息,联发科技今天举办了天玑开发者大会 2024。大会上,联发科技开启了“天玑 AI 先锋计划”,联合业界生态企业发布了《生成式 AI 手机产业白皮书》,分享了生成式 AI 端侧部署的解决方案“天玑 AI 开发套件”。同时&#…

图片在线压缩,base64在线转换

图片在线压缩,超级好用 图片压缩 - 在线免费图片压缩软件-迅捷压缩在线迅捷免费在线图片压缩软件提供JPG压缩、PNG压缩、BMP压缩功能,为用户解决如何压缩图片的问题,实现一键压缩图片大小,是一款专业的高质量图片压缩工具.https://yasuo.xunjiepdf.com/img/ base64…

五道数组习题,只过思路

建议先过一遍:保研机试前的最后七道数组题-CSDN博客 第一题: 88. 合并两个有序数组 - 力扣(LeetCode) ​ 跟合并两个有序链表类似, 快慢指针的用法,新建立一个数组,再将数组赋给nums1。 第…

快速搭建webase-front并且部署合约

PS: 因为我开发时候要用到fisco和webase-front,避免官方文档粘贴, 因此直接整理下面的笔记。开发的时候,好粘贴。1.搭建4节点联盟链 前提 curl 一种命令行工具 apt install -y openssl curl创建操作目录, 下载安装脚本 cd ~ && mkdir -p fisco && cd fisco…

Spring管理第三方依赖

在开发中,我们常需要根据业务需求导入我们需要的第三方依赖包,本文主要以导入druid数据库来连接池为案例讲解有关spring管理第三方依赖 目录 纯注解文件注入 1.在pom.xml中导入依赖 2.在com.lcyy包下建立一个config包用于配置类的实现 3.在config包下…

前端库推荐:markdown语法解析库-marked

这里写自定义目录标题 marked 介绍项目库应用展示微信md格式化工具 核心工作流setOptions 和 use()Options 选项renderer块级渲染方法 block-level行内渲染方法 inline-level hookspreprocess 处理之前postprocess 处理之后 官网扩展插件高亮自定义扩展 marked 介绍 Marked 是…

第二证券今日投资参考:北方稀土上调挂牌价 磷化工产业链迎催化

昨日,沪指早盘窄幅震动,午后小幅拉升,科创50指数弱势下探。截至收盘,沪指涨0.22%报3147.74点,深证成指微跌0.08%报9770.94点,创业板指跌0.14%报1892.54点,上证50指数涨0.16%,科创50指…

iframe通信postMessage

iframe嵌入页面是实现微前端的方式之一。由于浏览器的跨域限制,iframe与父页面之间的通信变得不是那么容易。postMessage解决了这个问题。从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow window.parent)&…

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java标准版,适用于各行各业,主要是Java…

UE灯光:点光和聚光灯的强度单位(cd、lm)

在虚幻引擎(UE)中,点光和聚光灯的光强使用两种不同的单位进行度量: 坎德拉(cd):坎德拉是光强度的国际单位(SI单位)。它代表光源在特定方向上每单位立体角发出的光通量。…

2024年数维杯数学建模A题思路

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…