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划分的, 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始࿰…...
Java数据库连接(JDBC)
一、引言 在Java应用程序中,经常需要与数据库进行交互以存储、检索和处理数据。Java数据库连接(JDBC)是Java平台中用于执行这一任务的标准API。JDBC允许Java程序连接到关系数据库,并使用SQL语句来执行查询和更新操作。本教程将详…...
记录一次cas单点登录的集成
主要思路:浏览器访问CAS服务器登录,拿到凭证给后端,后端用此凭证到CAS服务器验证登录并拿到用户信息,之后基于该凭证维持用户的登录状态。 主要流程: 1.浏览器访问后端需认证登录地址(不带ticket…...
【吊打面试官系列】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 运行环境不同…...
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 中用于管理有状态应用的控制器,确保 Pod 具有稳定的网络标识和持久化存储。每个 Pod 拥有唯一的名称和持久化卷声明(PVC),即使重启或重新调度也不会改变。 稳定网络标识的作用 …...
百台AGV如何协同?揭秘基于树莓派CM5机器人控制器的调度黑科技
在智能仓储的繁忙战场上,AGV(自动导引运输车)如同不知疲倦的“搬运工”,穿梭于货架之间。但当“搬运工”从几个变成几十个、上百个时,问题就来了:如何让它们井然有序,不堵车、不撞车、不“摸鱼”…...
从原理图到比特流:手把手解读Vivado里那个神秘的SPI x4配置电路图(附Mode引脚设置对照表)
深入解析Vivado SPI x4配置电路:从原理图到硬件实现的完整指南 在FPGA开发中,SPI Flash配置电路的正确设计直接关系到系统能否正常启动和工作。许多工程师在第一次接触Xilinx Vivado提供的官方SPI x4配置电路图时,往往会对其中各种网络标签和…...
Android屏幕唤醒技术全解析:从熄屏到亮屏的实现方案
1. Android屏幕唤醒技术概览 你有没有遇到过这样的场景:当手机放在桌上突然来消息时,屏幕会自动亮起显示通知内容?这背后就是Android的屏幕唤醒技术在发挥作用。作为开发者,掌握屏幕唤醒技术不仅能提升用户体验,还能在…...
Vue3集成AntV G6实战:从零构建拓扑图可视化应用
1. 为什么选择Vue3AntV G6做拓扑图? 拓扑图可视化在系统架构设计、网络拓扑分析、依赖关系展示等场景中非常常见。我之前做过一个微服务治理平台的项目,需要直观展示几十个服务之间的调用关系,试过D3.js、ECharts等方案,最后发现A…...
LinkFinder收集接口
LinkFinder可以自动化收集站点的api接口先用linkfinder爬去该js文件中所有的接口,再用正则表达式进行数据清洗,得到我们想要的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膨胀病,这篇给解药。 用Skill Loading机制把3000 tokens的垃圾场变成100 tokens的图书馆,60行代码实现知识按需加载,API成本直接砍半。 Skill Loading核心机制 类比:图书馆借书流程 图书馆不会把所有书…...
从魔方到算法:用Python一步步实现Kociemba二阶段算法(附完整代码)
从魔方到算法:用Python实现Kociemba二阶段求解器 魔方作为经典的智力玩具,其求解算法一直是计算机科学和数学交叉领域的研究热点。本文将带你从零开始,用Python实现经典的Kociemba二阶段算法,不仅理解其数学原理,更能获…...
GraphRAG硬核实战:打造企业“数字老师傅”
技术隐喻警示:如果你还在用传统的向量数据库试图解决企业级知识传承问题,这就像试图用“关键词搜索”去训练一个博士生——不仅力不从心,更是对算力的极度浪费。 在企业数字化转型的深水区,我们面临着一个极其残酷的**“默会知识”…...
2026年大数据专业数据分析学习指南
一、核心技术与工具2026年主流大数据技术栈(如Spark、Flink、Hadoop生态) 实时数据处理与批处理技术对比 云原生数据分析平台(AWS/GCP/Azure解决方案) 机器学习与深度学习在数据分析中的融合应用二、数学与统计基础概率论与数理统…...
