STM32 学习笔记_8 定时器中断:输入捕获

news2024/11/22 10:18:25

输入捕获

输入引脚发生跳变时,cnt的值会被记录到ccr中,可以用于测量pwm信号等。配置成pwmi模式还可以同时测量频率和占空比。主从触发模式可以实现硬件全自动测量。

高级定时器和通用定时器才有的功能。

这个功能只能测数字信号,对于a信号需要通过比较器等简历ad转换为数字信号。
image-20230514152436899

测周法速度快,一个周期就测出结果来,但是噪声影响误差可能大。

image-20230514153612001

输入信号经过滤波去除一些毛刺,让信号更稳定;分两路传输,比如CH1分IC1 IC2,这样方便切换,而且方便拓展,比如PWMI要同时计算占空比和频率。

TRC和异或电路用于三相电机。

我们配置psc,设定如上升沿保存一下ccr值,就可以记录两个上升沿之间时间周期了。然后cnt清零。

image-20230514155546416

滤波ICF配置:连续n个相同的事件才会被记录。比如一直是稳定的高电平。如果信号一直抖动就不会记录。如果噪声大可以把这个参数设大一些。

滤波后检测边沿,通过TIFP进行选择。

输出可以设置分频,CC1E使能。TIFP会自动从模式触发cnt清零。

主模式:自身定时器输出信号去触发别的外设。

从模式:接收其他(或自身)外设的信号用于控制自身定时器的运行。

image-20230514223643350

比如本次我们要用到的功能就是从模式的reset,reset cnt。

还有一些其他的用途比如两个定时器级联,第一个定时器预分频后的输出给第二个定时器,这样两者预分频可以计数的周期就更大了。

总结原理:

image-20230514223844690

fc:时钟源频率/psc.

N:最新的ccr值。

fc/N可算出信号频率。

  • 注意cnt有上限如65535,因此如果信号频率太低可能溢出,这时我们可以把psc调大一点。
  • 1 2定时器只能设置1 2 的从模式,如果想用3 4定时器去触发reset指令,需要用到中断函数,比较消耗资源。

image-20230514224320580

通过上图方式获取频率和占空比。CCR1是整个周期长度,CCR2是高电平周期长度,做比可以求得占空比。

代码:输入捕获模式测频率

我们没有信号发生器,所以利用上节课的PWM波形输出给另一个引脚,另一个引脚IC获得其频率。

image-20230514225032359

因为我们要尝试不同的输入波形,因此psc的值会改变。因此可以写一个改变psc的函数。

image-20230515121232376

初始化函数类似OC。下面的可以同时初始化多个通道。

image-20230515121553377

赋初值。

image-20230515121605528

选触发源。

image-20230515121728362

这个是选择主模式输出的触发源和选择从模式的模式。

image-20230515121928357

读取ccr值。oc状态下ccr只写,可以用setCompare写入。ic状态只读,用这四个函数读。

#include "stm32f10x.h"

void IC_Init(){
    //1. 打开输入接收的RCC,GPIO
    //2. 时基单元,启动计数器
    //3. 设置输入捕获单元
    //4. 选用触发源
    //5. 设置触发后的reset操作
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM3);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period=65536-1;//满计时,尽量避免溢出
    TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//输入信号频率:1MHz
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
    
    TIM_ICInitTypeDef TIM_ICInitStructure;
    TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//PA6对应定时器3 ch1
    TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICFilter=0xF;//滤波消除毛刺,越大效果越好,看需求
    TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;//不分频,每次都触发
    TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//直连或者交叉通道
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//定时器1的从模式
    
    TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
    
    TIM_Cmd(TIM3,ENABLE);
}

uint32_t IC_GetFreq(void){
    //fc: 1MHz
    return 1000000/(TIM_GetCapture1(TIM3)+1);//CH1的捕获
}

main里设置psc=720,则输入频率为1MHz,1000000,设置ccr值为50。

	PWM_SetPrescaler(720-1);//freq: 72M/100/720
    TIM_SetCompare1(TIM2,50);//duty: 50/100	

OC:PWM设置ccr=50,psc 7200, period 100(因为duty=ccr/(arr+1),所以如果修改输出引脚的分频采用修改arr的方案,那么占空比也会随之改变,不好计算。不如我们固定arr,修改psc。),也就是占空比50/100为一半。因此输出1kHz的波形。

IC:100 0000/1000=1000. 两次相邻的上升沿之间计数1k,用总频率1M/1k得出输入波形。

至于get函数为什么+1,题主也想不太明白,据老师所说可能是到了那里刚好跳变没有记录上上升沿之类的。

代码:检测频率和上升沿

基本不太变,把其中一个IC初始化函数改成同时初始化两个通道的函数。初始化只需要改这一条就行,库函数自动把另一个通道调整为相反的。比如通道1直连上升沿触发,通道2交叉下降沿触发。

TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);

再写一个获取占空比的函数:

uint32_t IC_GetDuty(void){
    return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);
}

改setprescaler改频率,改setcompare改duty。

  • 输入信号频率1MHz,计数器最大65535,因此最低不溢出的频率是1M/65535≈15Hz。
  • 要求误差如千分之一,那么频率为1M/1k=1k.

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

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

相关文章

【k8s概念】一文搞懂k8s核心概念,吐血整理~两万字~!!!

文章目录 1. k8s简介1.1 k8s概念1.2 作用/功能 2. k8s集群搭建方式3. k8s核心组件3.1 Master Node(控制平面组件)3.2 Worker Node 4. k8s核心概念4.1 容器4.2 工作负载——Pod4.3 Pod控制器4.3.1 ReplicationController(RC)4.3.2 ReplicaSet(RS)4.3.3 De…

四大关键举措高效管控企业税务风险

税务风险是指企业在税务管理中,由于涉税行为因未能正确有效地遵守税法规定,而导致企业出现经济损失以及企业形象受损。企业税务风险的来源主要有两方面:第一,企业的纳税行为不符合税收法律法规的规定或对相关的税务政策未能全面理…

隐私计算论文合集「多方安全计算系列」第一期

当前,隐私计算领域正处于快速发展的阶段,涌现出了许多前沿的SOTA算法和备受关注的顶会论文。为了方便社区小伙伴学习最新算法、了解隐私计算行业最新进展和应用,隐语开源社区在GitHub创建了Paper推荐项目awesome-PETs(PETs即Priva…

生态伙伴 | 硬创大赛新起航!携手华强科创广场,助力硬科技创业者

01 大赛介绍 中国硬件创新创客大赛始于2015年,由深圳华秋电子有限公司主办,至今已经成功举办八届,赛事范围覆盖华南、华东、华北三大地区,超10个省市区域。 大赛影响了超过45万工程师群体,吸引了35000多名硬创先锋报…

markdown神器 -Typora使用教程笔记2023最新版

文章目录 前言一、下载安装包和魔法工具二、第一步 选择为所有人安装三、第二步 创建桌面快捷方式四、第四步 安装五、第五步 完成安装六、第六步 取消勾选自动更新七、第七步 将魔法文件放在安装路径的根目录八、第八步 恭喜你,激活完成总结魔法工具获取方式 前言 …

{嵌入式操作系统}我国为什么要自主研发国产嵌入式操作系统

嵌入式操作系统不同于传统的桌面操作系统,用户不能直接执行它们,不同于桌面操作系统的无处不在,嵌入式操作系统隐藏在我们的视野之外,很多人甚至不知道它们的存在。 什么是嵌入式操作系统,它与非嵌入式操作系统有何不…

整合营销和内容营销哪个好,有什么区别

如果想做自媒体运营,不管是品牌还是个体从业者,其实都要学会如何去营销。这个也分为很多种方式,比如整合营销和内容营销。今天,来和大家谈谈整合营销和内容营销哪个好,如何才能将他们应用好? 要想回答这个问题&#x…

Linux实操篇---常用的基本命令4(磁盘查看和分区类)

一、磁盘查看和分区类 du查看文件和目录占用的磁盘空间 du:disk usage 磁盘占用情况 基本语法: du 目录/文件 显示目录下每个字母里的磁盘使用情况选项说明: 选项功能-h以人们较易阅读的GBytes,MBytes,KBytes等…

android waklock锁阻止休眠调试

上层wakelock 锁获取 adb shell dumpsys powerLooper state:Looper (PowerManagerService, tid 30) {aabc9c2}Message 0: { when42s654ms what4 targetcom.android.server.power.PowerManagerService$PowerManagerHandler }Message 1: { when9m39s94ms what1 targetcom.android…

一种通用的业务监控触发方案设计 | 京东云技术团队

一、背景 业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期,实现业务监控主要分成两步:一、在业务系统中选择节点发送消息触发业务监控;二、系统在接收到mq消息或者定时任务调度时,根据消息中或者任务中…

【Python Matplotlib】零基础也能轻松掌握的学习路线与参考资料

Python Matplotlib是一个流行的数据可视化工具,可以帮助数据科学家和分析师更好地理解数据。本文将介绍Python Matplotlib的学习路线,参考资料和优秀实践。 文章目录 一、Python Matplotlib的学习路线二、Python Matplotlib参考资料三、Python Matplotl…

ChatGPT的使用体验及教程

ChatGPT对社会带来了什么影响? ChatGPT的出现对社会产生了广泛的影响,主要体现在以下几个方面: ① 提升了人工智能领域的发展水平:ChatGPT在最初发布时获得了广泛的关注,并受到了人工智能领域专家和研究者的高度评价。…

OpenGL实战-调试

glGetError() OpenGL文档,可以查询函数出现的错误的对应原因。  默认情况下glGetError只会打印错误数字,如果你不去记忆的话会非常难以理解。通常我们会写一个助手函数来简便地打印出错误字符串以及错误检测函数调用的位置。 GLenum glCheckError_(co…

SpringBoot——RESTful风格以及如何快速发送不同方式的请求

RESTful风格: 简单来说,RESTful就是一种将请求方式融合到路径中的一种请求路径书写风格,注意这里是风格,不是规定,我们也可以不使用他或者不是非常严格的按照他规定的样式来写,但是由于行业中大多数的人在…

Boost电路的参数设计

本文以实例方式介绍Boost电路的参数设计方法。项目需求:12V升压至50V,功率35W。 先看示例电路图,如下图所示。 在进行具体的参数计算之前,我们先简要的分析一下Boost电路的工作原理。 1、我们假设,C3和C4的容值相对于负…

发挥数据潜能,为在金融服务行业进行创新做好准备

发挥数据潜能,为在金融服务行业进行创新做好准备 为何选择 NetApp 的金融服务? 作为云专家,我们将确保始终适时适地提供财务数据,以推动转型。我们将消除数据孤岛,提供实时的市场就绪分析,借助经验证的 AI…

易基因:多组学关联分析及组学分子实验验证方法(表观组+转录组+微生物组)|干货系列

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 生物过程具有复杂性和整体性,单组学数据难以系统全面解析复杂生理过程的分子调控机制。而多组学(Multi-omics)联合分析可同时实现从“因”和“果”两个…

Cartographer源码阅读---后端优化思路

Cartographer的后端优化是借用SPA(Sparse Pose Adjustment)优化算法的思想. 其主要步骤如下: 确定两个节点在global坐标系下的相对位姿变换.通过其它方式再次获取这两个节点的相对位姿变化对这两个相对位姿变换的差的最小二乘问题进行求解进行求解后得到…

nifi DBCPconnectpool 连接oracle 死链接

nifi DBCPconnectpool 连接oracle 死链接 问题展示问题解决后言官网中文网Groovy脚本学习 问题展示 原因,nifi 连接oracle因为网络波动出现死链接,我的数据同步停止于前一天晚上一点半左右,因为最近一致出现这个问题,综合判断之下…

SAP HUM 嵌套HU初探 II (TCODE:POP1, POF1,HU03) <转载>

SAP HUM 嵌套HU初探 II 这里以物料号ZFG0003为例,做一个阐述。 1,维护好包装指令主数据(POP1/POP2/POP3) 包装指令ZFG0003A 包装指令ZFG0003B 然后维护好PI 确定记录主数据(POF1/POF2/POF3) 2, COR1/…