当前位置: 首页 > news >正文

STM32定时器四大功能之定时器编码接口

1什么是编码器接口?

编码器接口接受编码器的正交信号,根据编码器产生的正交信号脉冲控制CNT的自增和自减,从而指示编码器的旋转方向和旋转速度。

每个高级定时器和通用定时器都有一个编码器接口,同时正交编码器产生的正交信号分为正转和反转,通过两个GPIO口产生的正交信号来决定是正转还是反转。

2.编码器接口基本结构

CNT的自增还是自减受编码器控制,输入捕获的前两个通道通过GPIO口连接编码器的A相和B相,再通过滤波器和边沿极性选择,产生TI1FP1和TI2FP2信号通向编码器接口,同时编码器接口根据编码器的旋转方向控制CNT的计数方向,编码器正转,CNT自增,编码器翻转,CNT自减。编码器接口相当于使用了一个带有方向选择的外部时钟。

 3.通用定时器基本框图

如下图所示,我们可以看到TIMx_CH1和TIMx_CH2输入捕获的前两个通道,产生TI1FP1和TI2FP2信号通向编码器接口。

 4.编码器模块Encoder代码编写

(1).开启RCC时钟,包括GPIO和定时器3的时钟。

    //1.开启时钟TIM3的时钟线是APB1RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//2.开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

(2).配置GPIO,把PA6和PA7引脚配置成输入模式(PA6为TIM3_CH1通道,PA7为TIM3_CH2通道)

    GPIO_InitTypeDef GPIO_Inistructure;GPIO_Inistructure.GPIO_Mode= GPIO_Mode_IPU;//PWM输入设置为上拉输入GPIO_Inistructure.GPIO_Pin= GPIO_Pin_6 | GPIO_Pin_7;GPIO_Inistructure.GPIO_Speed=  GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_Inistructure);//读取结构体的参数

(3).时基单元初始化。配置预分频器,预分频器选择不分频,ARR自动重装值给最大,只配置CNT即可。

   	//3.时基单元初始化TIM_TimeBaseInitTypeDef  TIM_timBaseInitStructure;TIM_timBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//一分频TIM_timBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数TIM_timBaseInitStructure.TIM_Period=65536-1;//ARRTIM_timBaseInitStructure.TIM_Prescaler=1-1;//PSC 选择不分频TIM_timBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器是高级定时器才有的TIM_TimeBaseInit(TIM3,&TIM_timBaseInitStructure);

(4).配置输入捕获单元(包含滤波器和边沿极性选择)

 //4.配置输入捕获单元通道一和通道2TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);//结构体初始化TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//定时器3的通道1TIM_ICInitStructure.TIM_ICFilter=0xF;//滤波器TIM_ICInitStructure.TIM_ICPolarity= TIM_ICPolarity_Rising;//边沿检测极性选择上升沿触发,代表输入波形极性不翻转TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ICStructInit(&TIM_ICInitStructure);//结构体初始化TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;//定时器3的通道2TIM_ICInitStructure.TIM_ICFilter=0xF;//滤波器TIM_ICInitStructure.TIM_ICPolarity= TIM_ICPolarity_Rising;//边沿检测极性选择上升沿触发,代表输入波形极性不翻转TIM_ICInit(TIM3,&TIM_ICInitStructure);

 5.配置编码器接口,A/B相均计数,A/B波形输入选择Rising,极性不反转

//5配置编码器接口,A/B相均计数,A/B波形输入选择Rising,极性不反转TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);

 6. 启动定时器

	//6.启动定时器TIM_Cmd(TIM3,ENABLE);

7.得到CNT的值


//得到CNT的值
int16_t  Encoder_Get(void)
{int16_t temp;temp=TIM_GetCounter(TIM3);//得到CNT的值TIM_SetCounter(TIM3,0);//将CNT清0return temp;
}

5.用TIM2中断函数计数

目的:调用TIM2中断函数,每产生一个更新事件,记一次数,即测速。在TIM2产生的中断函数中,实现对TIM3编码器产生的正交信号进行计数。
在main.c函数中实现TIM2中断函数的调用,在中断函数中实现计数的功能

注:中断函数的更新事件的标志位,在程序进行完之后要对中断标志位进行清除。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"int16_t Speed;			//定义速度变量int main(void)
{OLED_Init();		Timer_Init();		//定时器2初始化Encoder_Init();		//编码器初始化/*显示静态字符串*/OLED_ShowString(1, 1, "Speed:");	while (1){OLED_ShowSignedNum(1, 7, Speed, 5);	//不断刷新显示编码器测得的最新速度}
}//  函    数:TIM2中断函数
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断{Speed = Encoder_Get();								//每隔固定时间段读取一次编码器计数增量值,即为速度值TIM_ClearITPendingBit(TIM2, TIM_IT_Update);			//清除TIM2更新事件的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死}
}

相关文章:

STM32定时器四大功能之定时器编码接口

1什么是编码器接口? 编码器接口接受编码器的正交信号,根据编码器产生的正交信号脉冲控制CNT的自增和自减,从而指示编码器的旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口,同时正交编码器产生的正交信号分…...

全国各城市间驾车耗时和距离矩阵数据集(更新至2022年)

数据简介:城市之间距离越远,耗时越长。经济发达地区的交通状况较好。各城市之间的驾车耗时和距离存在差异。有些城市之间的交通非常便捷,而有些城市之间的交通则较为不便。这表明中国的交通网络发展尚不平衡,需进一步优化。特别是…...

推荐二轮电动车仪表盘蓝牙主芯片方案-HS6621CGC

随着国内二轮电动车的火热开启,电动车的智能化程度越来越高;电动车的智能操控需求也越来越高,现在介绍蓝牙控制面板的一些功能;例如:定位(GNSS),设防,实时上报数据&#…...

『香橙派』基于Orange Pi AIpro打造高效个人云存储解决方案

读完这篇文章里你能收获到 了解Orange Pi AIpro硬件优势,为构建高效云存储基础设施的理想平台。学会使用Orange Pi AIpro硬件平台,搭载Ubuntu Server系统,打造云存储环境。掌握利用Kodbox软件,享受文件管理、多格式预览及编辑的全…...

Sylvester矩阵、子结式、辗转相除法的三者关系(第二部分)

【三者的关系】 首先,辗转相除法可以通过Sylvester矩阵进行,过程如下(以 m 8 、 l 7 m 8、l 7 m8、l7为例子)。 首先调整矩阵中 a a a系数到最后面几行,如下所示: S ( a 8 a 7 a 6 a 5 a 4 a 3 a 2 …...

PyTorch的数据处理

💥今天看一下 PyTorch数据通常的处理方法~ 一般我们会将dataset用来封装自己的数据集,dataloader用于读取数据 Dataset格式说明 💬dataset定义了这个数据集的总长度,以及会返回哪些参数,模板: from tor…...

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车,如何编写串口通信指令 第14章-手机遥控功能 我们要实现蓝牙遥控功能,蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块 所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调 14.1-电脑控制小车 完成功能…...

【补充1】字节对齐

文章目录 1.字节对齐的基本概念2.字节对齐规则3.实践出真知(加大难度)4 位域 1.字节对齐的基本概念 (1)现代计算机中内存空间都是按照byte划分的, 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始&#xff0…...

Java数据库连接(JDBC)

一、引言 在Java应用程序中,经常需要与数据库进行交互以存储、检索和处理数据。Java数据库连接(JDBC)是Java平台中用于执行这一任务的标准API。JDBC允许Java程序连接到关系数据库,并使用SQL语句来执行查询和更新操作。本教程将详…...

记录一次cas单点登录的集成

主要思路:浏览器访问CAS服务器登录,拿到凭证给后端,后端用此凭证到CAS服务器验证登录并拿到用户信息,之后基于该凭证维持用户的登录状态。 主要流程: 1.浏览器访问后端需认证登录地址(不带ticket&#xf…...

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好,我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题,希望对大家有帮助; 什么是乐观锁和悲观锁? 1、乐观锁: 就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争…...

机器学习之词袋模型

目录 1 词袋模型基本概念 2 词袋模型的表示方法 2.1 三大方法 1 独热表示法(One-Hot) 2 词频表示法(Term Frequency, TF) 3 词频-逆文档频率表示法(TF-IDF) 2.2 例子 1 词袋模型基本概念 词袋模型&a…...

【C++/STL】vector(常见接口、模拟实现、迭代器失效)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏: https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 简单使用 常见接口 find insert vector模板 模拟实现 尾插 构造 迭代器失效 使用memcpy拷贝问…...

Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析

推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI 1.0 MyBatis 概述 MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 可以帮助我们将数据库操作抽象出来,使得我们的代码更加简洁…...

【UE5.1 多线程 异步】“Async Blueprints Extension”插件使用记录

目录 一、异步生成Actor示例 二、异步计算示例 参考视频 首先需要在商城中下载“Async Blueprints Extension”插件 一、异步生成Actor示例 2. 创建一个线程类,这里要指定父类为“LongAsyncTask”、“InfiniteAsyncTask”、“ShortAsyncTask”中的一个 在线程类…...

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…...

Flutter 中的 Scrollbar 小部件:全面指南

Flutter 中的 Scrollbar 小部件:全面指南 在Flutter中,滚动条(Scrollbar)是一种常见的UI组件,用于提供对滚动内容的快速访问和控制。Scrollbar 小部件可以附加到任何可滚动的widget上,如ListView、GridVie…...

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT,并解决不能敲Tab问题 eNSP导入CRT打开eNSP,新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options(选项)-- Global Options (全局选项&#…...

实验二 电子传输系统安全-进展2

上周任务完成情况(代码链接,所写文档等) 重新调通电子公文传输系统部署gmssl学习生成SM2证书学习gmssl中的CTLS实现将数据库从SqlServer迁移到Mysql调试Mysql驱动学习Bouncy Castle 代码链接 Mysql表设计 /* Navicat MySQL Data Transfer…...

JavaScript 获取 HTML 中特定父元素下的子元素

JavaScript 获取 HTML 中特定父元素下的子元素 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>查找子元素示例</title> </head> <body><div id"parent"><p&…...

Kubernetes StatefulSet 完全指南,SOFA 架构--01--简介。

StatefulSet 的核心概念 StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器&#xff0c;确保 Pod 具有稳定的网络标识和持久化存储。每个 Pod 拥有唯一的名称和持久化卷声明&#xff08;PVC&#xff09;&#xff0c;即使重启或重新调度也不会改变。 稳定网络标识的作用 …...

百台AGV如何协同?揭秘基于树莓派CM5机器人控制器的调度黑科技

在智能仓储的繁忙战场上&#xff0c;AGV&#xff08;自动导引运输车&#xff09;如同不知疲倦的“搬运工”&#xff0c;穿梭于货架之间。但当“搬运工”从几个变成几十个、上百个时&#xff0c;问题就来了&#xff1a;如何让它们井然有序&#xff0c;不堵车、不撞车、不“摸鱼”…...

从原理图到比特流:手把手解读Vivado里那个神秘的SPI x4配置电路图(附Mode引脚设置对照表)

深入解析Vivado SPI x4配置电路&#xff1a;从原理图到硬件实现的完整指南 在FPGA开发中&#xff0c;SPI Flash配置电路的正确设计直接关系到系统能否正常启动和工作。许多工程师在第一次接触Xilinx Vivado提供的官方SPI x4配置电路图时&#xff0c;往往会对其中各种网络标签和…...

Android屏幕唤醒技术全解析:从熄屏到亮屏的实现方案

1. Android屏幕唤醒技术概览 你有没有遇到过这样的场景&#xff1a;当手机放在桌上突然来消息时&#xff0c;屏幕会自动亮起显示通知内容&#xff1f;这背后就是Android的屏幕唤醒技术在发挥作用。作为开发者&#xff0c;掌握屏幕唤醒技术不仅能提升用户体验&#xff0c;还能在…...

Vue3集成AntV G6实战:从零构建拓扑图可视化应用

1. 为什么选择Vue3AntV G6做拓扑图&#xff1f; 拓扑图可视化在系统架构设计、网络拓扑分析、依赖关系展示等场景中非常常见。我之前做过一个微服务治理平台的项目&#xff0c;需要直观展示几十个服务之间的调用关系&#xff0c;试过D3.js、ECharts等方案&#xff0c;最后发现A…...

LinkFinder收集接口

LinkFinder可以自动化收集站点的api接口先用linkfinder爬去该js文件中所有的接口&#xff0c;再用正则表达式进行数据清洗&#xff0c;得到我们想要的api接口python3 linkfinder.py -i "https://example.com/static/js/example.js" -o cli > api.txt接着我们需要去…...

知识库别往System Prompt塞了!我用Skill Loading把3000 tokens压缩到100,省下66%成本

上篇我们诊断了System Prompt膨胀病&#xff0c;这篇给解药。 用Skill Loading机制把3000 tokens的垃圾场变成100 tokens的图书馆&#xff0c;60行代码实现知识按需加载&#xff0c;API成本直接砍半。 Skill Loading核心机制 类比&#xff1a;图书馆借书流程 图书馆不会把所有书…...

从魔方到算法:用Python一步步实现Kociemba二阶段算法(附完整代码)

从魔方到算法&#xff1a;用Python实现Kociemba二阶段求解器 魔方作为经典的智力玩具&#xff0c;其求解算法一直是计算机科学和数学交叉领域的研究热点。本文将带你从零开始&#xff0c;用Python实现经典的Kociemba二阶段算法&#xff0c;不仅理解其数学原理&#xff0c;更能获…...

GraphRAG硬核实战:打造企业“数字老师傅”

技术隐喻警示&#xff1a;如果你还在用传统的向量数据库试图解决企业级知识传承问题&#xff0c;这就像试图用“关键词搜索”去训练一个博士生——不仅力不从心&#xff0c;更是对算力的极度浪费。 在企业数字化转型的深水区&#xff0c;我们面临着一个极其残酷的**“默会知识”…...

2026年大数据专业数据分析学习指南

一、核心技术与工具2026年主流大数据技术栈&#xff08;如Spark、Flink、Hadoop生态&#xff09; 实时数据处理与批处理技术对比 云原生数据分析平台&#xff08;AWS/GCP/Azure解决方案&#xff09; 机器学习与深度学习在数据分析中的融合应用二、数学与统计基础概率论与数理统…...