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更新事件的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死}
}

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

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

相关文章

Redis 的持久化(真的好细)

前言 Redis 是一个内存数据库,把数据存储在内存中,而内存中的数据是不持久的,要想数据持久就得将数据存储到硬盘中,而 Redis 相比于 Mysql 这样的关系型数据库最大的优势就在于将数据存储在内存中从而效率更高,速度更快…

docker 安装RabbitMQ-web版本

直接拉去web版本 docker pull rabbitmq:management启动命令 设置用户名 admin 密码123456 docker run -dit --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASS123456 rabbitmq:management访问地址 http://127.0.0.1:…

GeoScene产品学习视频收集

1、易智瑞运营的极思课堂https://www.geosceneonline.cn/learn/library 2、历年易智瑞技术公开课视频资料 链接:技术公开课-易智瑞信息技术有限公司,GIS/地理信息系统,空间分析-制图-位置智能-地图 3、一些关于GeoScene系列产品和技术操作的视…

二进制部署k8s集群 部署高可用master节点

目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 (1)k8s的数据存储中中心的搭建 etcd &…

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

漏洞复现环境搭建请参考 http://t.csdnimg.cn/MxmId 漏洞版本 Apache Log4j 2.8.2之前的2.x版本 漏洞验证 (1)开放端口4712 漏洞利用 (1)ysoserial工具获取 wget https://github.com/frohoff/ysoserial/releases/download/v0…

Flink DataStream API 基础算子(一)

一、介绍 官网 DataStream API 得名于特殊的 DataStream 类,该类用于表示 Flink 程序中的数据集合。你可以认为 它们是可以包含重复项的不可变数据集合。这些数据可以是有界(有限)的,也可以是无界(无限)的…

spring启动后自动退出了

在项目中启动spring框架的application,但是还未等到接口访问它就自己退出了,运行截图如下所示: 解决办法: 将build.gradle文件里的依赖修改一下。我原先的依赖是: org.springframework:spring-web:5.3.10 现修改为 …

2024 电工杯高校数学建模竞赛(B题)| 平衡膳食食谱 |建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用负载均衡,多目标规划等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

肯尼亚大坝决堤反思:强化大坝安全监测的必要性

一、背景介绍 近日,肯尼亚发生了一起严重的大坝决堤事件。当地时间4月29日,肯尼亚内罗毕以北的一座大坝决堤,冲毁房屋和车辆。当地官员称,事故遇难人数已升至71人。这起事件再次提醒我们,大坝安全无小事,监…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.1,2 讲 I2C驱动

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

了解区块链基础设施,共同构建安全且强大的Sui网络

区块链基础设施的范畴很广,但其核心是那些直接与网络互动的计算机。这些实体通常被称为节点,分为不同的类型,例如维护完整区块链副本的全节点,以及作为共识决定者的验证节点。除了这两种类型之外,还有其他类型的节点&a…

【oracle的安装记录】

oracle安装记录 一、下载以后,解压到同一路径下面 二、双击可执行安装文件,等待文件加载 三、双击以后,弹出信息 四、提示该窗口,点击【是】即可 五、未填写配置安全更新信息 六、弹出小窗口,选择【是】 七、安装选项…

SQLI-labs-第二十四关

目录 1、登录界面 2、注册界面 3、修改密码界面 知识点:二次注入 思路: 这一关有几个页面可以给我们输入,一个登录界面,一个注册页面,一个修改密码界面 1、登录界面 首先我们登录界面看看 登录后出现一个修改密码…

Ubuntu 搭建SRT协议 环境

1.官网clone源码 GitHub - Haivision/srt: Secure, Reliable, Transport 打不开的话国内gitee 不是最新的 https://gitee.com/smartavs/srt.git 下下来之后 cd 到srt目录 需要安装cmake openssl等依赖 我的环境已经有了 mkdir build && cd build cmake .. -…

最有效的企业数据防泄漏手段 | 数据泄漏防护系统推荐

随意信息安全意识不断提高,企业纷纷寻求高效的数据防泄漏手段。在众多解决方案中,这五款软件各具特色,但它们的共同目标都是确保企业数据的安全性和保密性。 接下来,我们将逐一介绍这五款软件的特点和优势。 1、Ping 32 Ping32…

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件,给nginx镜像使用 .gitlab-ci.yml和Makefile是c…

阿里云 EMR Serverless Spark 版开启免费公测

阿里云 EMR Serverless Spark 版是一款云原生,专为大规模数据处理和分析而设计的全托管 Serverless 产品。它为企业提供了一站式的数据平台服务,包括任务开发、调试、调度和运维等,极大地简化了数据处理的全生命周期工作流程。使用 EMR Serve…

LayUI使用(一)点击树组件的右边空白区域也可响应事件

前提: 如下,希望能够点击右边的空白区域也能够响应,而不仅仅是点击文本才响应 分析流程 一开始问了chatgpt,但它给的方案太麻烦了,而且还有错误,因此自己上手F12进入调试模式,点击查看最终渲…

文件外发审核是数据防泄漏的重要手段,那该怎么落地?

企业在日常经营中,无可避免地会产生文件外发的需求,文件发送对象包括但不限于合作方、供应商、客户、公关媒体、慈善组织等等,不一而足。而由于外发的对象不同,所涉及的文件类型也多种多样: 商业合作合同:…

STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位(三)

STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位(三) 文章目录 STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位(三)文档说明:官方参考文档线上链接(可在线阅读与下载)&#…