STM32-TIM输入捕获

一、概述

IC(Input Capture)输入捕获

  • 输入捕获模式下,当通道输入引脚出现指定电平跳变(上升沿或下降沿)时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
  • 每个高级定时器和通用定时器都拥有4个输入捕获通道
  • 可配置为PWMI(PWM输入)模式,同时测量频率和占空比
  • 可配合主从触发模式,实现硬件全自动测量

以下为输入捕获的框图,左边一共有4路输入通道,对于同一个定时器输入捕获与输出比较只能使用其中一个。这个异或门的输入接在了通道1,2,3端口,异或门执行逻辑是:当三个输入引脚的任何一个有电平翻转时,输出引脚就产生电平翻转,之后输出通过数据选择器,到达输入捕获通道1。当数据寄存器不选择异或门时,就没有用,设计这个异或门,其实还是为三相无刷电机服务的。

然后来到输入滤波器和边沿检测器,滤波器是滤除噪声的不会改变频率,边沿检测器是检测是上升沿还是下降沿。

接着,有两套电路,第一套是TI1FP1。第二套是TI1FP2,输入给通道2。这样交叉的目的之一是可以把一个引脚的输入,同时映射到两个捕获单元,这也是PWMI模式的经典结构,让第一个通道测量频率,第二个通道测量占空比。

接着,预分频器对输入频率进行分频。分频之后的触发信号就可以触发捕获电路进行工作,每来一个触发信号,CNT的值就会向CCR(捕获寄存器)进行转运一次。转运的同时会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断。

 二、频率测量

测频法、测周法,大于中界频率用测频法,小于则用测周法,所以这个测频法适合测频率高的,测周法适合测频率低的。

三、输入捕获结构

如下图:经过滤波器滤波后,一路TI1FP1可以通向触发从模式控制器,这个从模式里面,就有电路,可以自动完成CNT的清零。滤波器中ICF[3:0]值越大滤波越好。另一路走通道1作为输入捕获。

当TI1FP1信号出现上升沿时,会将CNT的值向CCR中转运。同时,TI1FP1也作为触发源选择的触发信号,当出现上升沿时使CNT的值变为初始值(这里时硬件自动控制)。肯定是将CNT的值向CCR中转运在前,CNT的值变为初始值在后。

1、主从触发模式

 主模式:可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设。

 从模式:是被动的,就是接收其他外设或者自身外设的一些信号用于控制自身定时器的运行。

 触发源选择:就是用来触发从模式的。

2、输入捕获基本结构



3、PWMI基本结构 

 

四、测PWM占空比和频率代码

接线图:

  • 用TIM2_CH1通道先生成PWM波形代码

PWM.c:

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;//1.配置时钟,用那个外设RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;   //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOA, &GPIO_InitStructure);//2.内部时钟配置TIM_InternalClockConfig(TIM2);//3.配置时基单元TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;     //滤波频率TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //计数方式,向上TIM_TimeBaseInitStruct.TIM_Period=100-1;                   //自动重装载寄存器ARRTIM_TimeBaseInitStruct.TIM_Prescaler=0;                     //预分频器TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//4.输出比较初始化TIM_OCStructInit(&TIM_OCInitStructure);            //要给结构体赋一个初始值,否则有可能出现错误TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //输出模式TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High ;     //CC1P输出极性,这里的High指的是REF有效电平为高电平输出TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;   //输出使能TIM_OCInitStructure.TIM_Pulse=0;                               //用来设置CCRTIM_OC1Init(TIM2,&TIM_OCInitStructure);//5.启动定时器TIM_Cmd(TIM2,ENABLE);}//设置CCR
void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);}//设置预分频器
void PWM_SetPrescaler(uint16_t Prescaler)
{TIM_PrescalerConfig(TIM2,Prescaler,TIM_PSCReloadMode_Immediate);}

PWM.h:

#ifndef _PWM_H
#define _PWM_Hvoid PWM_SetCompare1(uint16_t Compare);void PWM_Init(void);
void PWM_SetPrescaler(uint16_t Prescaler);#endif
  • 测量PWM的频率和占空比的代码

利用测周法测PWM占空比和频率,利用TIM3_CH1输入捕获通道进行捕获A6引脚输入的信号。 

IC.c:

#include "stm32f10x.h"                  // Device header//测周法测PWM占空比和频率void IC_Init(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_ICInitTypeDef  TIM_ICInitStruct;GPIO_InitTypeDef GPIO_InitStructure;//1.配置时钟,用那个外设RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA, &GPIO_InitStructure);//2.内部时钟配置TIM_InternalClockConfig(TIM3);//3.配置时基单元TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;       //滤波频率TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;   //计数方式,向上TIM_TimeBaseInitStruct.TIM_Period=65535-1;                   //自动重装载寄存器ARRTIM_TimeBaseInitStruct.TIM_Prescaler=72-1;                   //预分频器TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//4.初始化捕获单元TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;                   //选择输入通道TIM_ICInitStruct.TIM_ICFilter=0xF;                            //滤波TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising ;       //选择极性,上升沿TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1 ;             //预分频器TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;    //确定输出直连通道TIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);//5.触发源选择TI1FP1TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//6.配置TRGI中从模式TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//7.启动定时器TIM_Cmd(TIM3,ENABLE);}//测频率
uint32_t IC_GetFreq(void)
{return 1000000/(TIM_GetCapture1(TIM3)+1);}//测占空比
uint32_t IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3)+1)*100 /(TIM_GetCapture1(TIM3)+1);}

IC.h:

#ifndef _LC_H
#define _LC_Hvoid IC_Init(void);uint32_t IC_GetFreq(void);uint32_t IC_GetDuty(void);#endif

 main.c:

#include  "stm32f10x.h"                  // Device header
#include  "OLED.h"
#include  "delay.h"
#include  "PWM.h"
#include  "lC.h"uint16_t  i;int main(void)
{OLED_Init();PWM_Init();IC_Init();OLED_ShowString(1,1,"Freq:00000Hz");OLED_ShowString(2,1,"Duty:00%");PWM_SetPrescaler(3600-1);   //频率Freq=72M/(PSC+1)/100PWM_SetCompare1(80);       //CCR/100  占空比while(1) {OLED_ShowNum(1,6,IC_GetFreq(),5);OLED_ShowNum(2,6,IC_GetDuty(),2);}}

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

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

相关文章

提示工程、微调和 RAG

自众多大型语言模型(LLM)和高级对话模型发布以来,人们已经运用了各种技术来从这些 AI 系统中提取所需的输出。其中一些方法会改变模型的行为来更好地贴近我们的期望,而另一些方法则侧重于增强我们查询 LLM 的方式,以提…

【C语言】猜数字小游戏

😂个人主页: 起名字真南 🤣个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 随机数的生成1.1 rand1.2 srand1.3 time1.4 设置随机数范围 2 猜数字游戏实现 前言:我们学习完前面的循环以后可以写一个猜数字小游戏 1 随机数的生成 想要完成…

八大排序--07归并排序

假设数组 arr[] {5,7,4,2,0,1,6},请通过插入排序的方式,实现从小到大排列: 方法:先拆分,再合并,并在合并过程中结束临时空间进行排序; 拆分:从待排序列中间位置拆开,数据分成左右两…

使用欧拉安装ceph分布式存储,ceph的集群安装、添加主机集群和删除主机、添加osd硬盘和手动添加硬盘为osd和移除osd。

1.ceph安装 1.1 首先准备3台机子,配置ip,给每台机子添加3块硬盘,设置主机名为ceph01、ceph02、ceph03。 192.168.10.20ceph01192.168.10.21ceph02192.168.10.22ceph03 1.2 三台机子关闭防火墙,setenforce 0,添加hosts解析、配置…

RWKV-7 预览版、大量新论文...RWKV 社区 9 月动态速览

欢迎大家收看《RWKV 社区最新动态》第五期,本期内容收录了 RWKV 社区 2024 年 9 月的最新动态。 9 月动态省流版(TL;DR) RWKV 官方新闻动态 RWKV-7 发布预览版RWKV-7 论文撰写已面向社区开放RWKV 官网上线 Bad Case 收集页面RWKV 中文文档已…

高带宽示波器在信号测试分析中的优势和主要应用场景

最近,普源精电推出了一款13GHz带宽的示波器DS81304,。有些小伙伴会好奇,为什么普源示波器的带宽会从5GHz跳到13GHz,为什么不是到10GHz或者15GHz呢?13GHz的示波器又能干些什么呢?下面讲为大家介绍,为什么DS8…

基于Arduino的遥控自平衡小车

基于Arduino的遥控自平衡小车 一、项目简介二、所需材料三、理论支持四、外壳设计五、线路连接六、检查MPU6050连接七、烧录库八、PID控制设置九、设置传感器参数十、无线移动控制十一、超声波模块 一、项目简介 一个使用Arduino Nano、MPU-6050以及便宜的6伏直流齿轮电机的自…

HT8513 内置自适应同步升压和防破音功能的6.5W D类及AB类音频功率放大器

1、特征 防削顶失真功能(防破音,Anti-Clipping Function, ACF) 免滤波器数字调制&#xff0c;直接驱动扬声器 输出功率 3W (VBAT3.3V, RL-4Ω, THDN<1%, 20-20kHz full band) 2.0W (VBAT3.3V, RL8Ω,THDN<1%, 20-20kHz full band) 6.5W (VBAT4.2V, RL2Ω, THDN10%,f1kHz…

(Linux驱动学习 - 9).设备树下platform的LED驱动

一.platform相关结构体与函数 1.匹配列表 - struct of_device_id struct of_device_id {char name[32];char type[32];/* compatible 很重要&#xff0c;需要与设备树节点的 compatible 属性一致&#xff0c;才能匹配 */char compatible[128]; const void *data; }; …

IOT-Tree连接西门子PLC S7 200 Smart竟然如此简单

最近一个项目需要把用户现场控制柜接入到云端&#xff0c;控制柜使用西门子PLC Smart 200 SR40型号&#xff0c;已经运行多年&#xff0c;PLC通过以太网接口对接一个触摸屏。 按照我以往的经验&#xff0c;觉得触摸屏以太网接口已经被占用&#xff0c;那么只能通过剩余的RS485…

视频剪辑软件推荐电脑版:这5款剪辑软件不容错过!

在视频剪辑领域&#xff0c;选择合适的软件至关重要。不同的软件各有千秋&#xff0c;有的简单易用&#xff0c;适合新手快速上手&#xff1b;有的功能强大&#xff0c;适合专业团队进行深度编辑。以下是一些电脑版视频剪辑软件的推荐&#xff0c;涵盖了从新手到专业级别的不同…

智能电子价签:助力零售效率升级的关键

在竞争日益激烈的零售市场&#xff0c;如何优化运营、提升效率&#xff0c;是每个零售商都在关注的问题。电子价签作为一项创新技术&#xff0c;提供了蒿效的解决方案。今天&#xff0c;我们就来聊聊电子价签如何帮助零售商轻松管理信息、减少人工误差&#xff0c;并展示它在门…

Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...

无所畏惧地面对未知&#xff0c;并将其视为成长的机会 大纲官网快速入门1.安装node.js -- 这里推荐用nvm管理2.脚手架创建3.electron 包安装到应用的开发依赖4.创建主进程(main.js)并启动项目1.创建页面2.配置main.js3.启动项目 -- 效果 进阶 -- 基于项目场景功能使用场景一&am…

自动猫砂盆有必要买吗?2024年热门风大的自动猫砂盆测评分享!

自动猫砂盆不知道大家尝试过没&#xff0c;就是可以自动给猫咪铲屎的神器东西&#xff0c;而且它能把那些猫屎都集中收集起来&#xff0c;我们这种上班忙碌的人一回家就能收获一个干干净净的猫砂盆&#xff0c;别提有多快乐了。就算出差都不怕&#xff0c;三四天不回来都只用扔…

红黑树源代码(进阶与细节解释)

目录 对于结点的修改 红黑树模板参数的控制 红黑树结点当中存储的数据 对于insert函数的细节修改 迭代器的代码 迭代器类的添加 迭代器的 迭代器的-- 正向迭代器的代码 红黑树代码全部展示&#xff1a; 看完前两篇的文章&#xff0c;相信对于红黑树有了一定的了解&…

飘香水果购物网站:基于SpringBoot的架构设计

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

【C++】模拟实现hash_table(哈希表)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现HashNode类模板 &#x1f38f;构造HashNode类成员变量 &#x1f38f;实现HashNode类构造函数…

家里养有宠物应该用哪款宠物空气净化器比较好?哪款最能吸毛?

这不是国庆节刚过吗&#xff0c;我的小猫终于是平安的度过了在农村生活的时光&#xff0c;之前还担心会不会被爸妈嫌弃&#xff0c;这下好了&#xff0c;嫌弃也过了国庆节。 但是一把猫咪带回出租房&#xff0c;由于几天不在房子里待&#xff0c;猫咪对熟悉的环境又特别激动&a…

视频怎么做成扫码展示?视频二维码在线做的方法

视频想要快速的分享给其他人&#xff0c;选择生成二维码是一种很方便的形式&#xff0c;其他人只需要扫描二维码就可以在线查看视频&#xff0c;与其他分享方式相比更加的简单、方便。现在日常生活中有很多场景都会有视频二维码的应用&#xff0c;简化了获取视频的流程&#xf…

JavaEE: 深入解析HTTP协议的奥秘(3)

文章目录 HTTP认识 "报头"(Header)认识 "状态码"(status code) HTTP JavaEE: 深入解析HTTP协议的奥秘(2) 书接上文~ 认识 “报头”(Header) Header 的整体的格式是"键值对"结构. 每个键值对占一行,键和值之间使用分号分隔. Host 表示服务器主…