6 计时器(六)

news2024/9/24 15:24:36

6.7 TMI编码器接口

Encoder Interface 编码器接口
编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
每个高级定时器和通用定时器都拥有1个编码器接口
两个输入引脚借用了输入捕获的通道1和通道2

正交编码器

使用正交信号精度更高,AB相都可以计次,相当于计次频率提高了一倍,还可以加抗噪声电路。

编码器接口基本结构

在这里插入图片描述

第一步:RCC开启时钟,开启GPIO和定时器的时钟
第二部:配置GPIO,把PA6和PA7配置成输入模式
第三步:配置时基单元(包括:PSC预分频器(不分频),ARR自动重装器(给最大65535),计数模式等)
第四步:配置输入捕获单元(滤波器和极性)
第五步:配置编码器接口模式
第六步,调用TIM_Cmd,启动定时器

工作模式

在这里插入图片描述

正转向上计数,反转向下计数

实例(均不反相)

在这里插入图片描述

实例(TI1反相)

在这里插入图片描述

比如接了一个编码器,发现数据的加减方向反了,可以调整极性,把任意一个引脚反相就能反转计数方向了(接一个非门)

6.8 编码器接口测速

第一步:RCC开启时钟,开启GPIO和定时器的时钟
第二部:配置GPIO,把PA6和PA7配置成输入模式
第三步:配置时基单元(包括:PSC预分频器(不分频),ARR自动重装器(给最大65535),计数模式等)
第四步:配置输入捕获单元(滤波器和极性)
第五步:配置编码器接口模式
第六步,调用TIM_Cmd,启动定时器

上拉输入和下拉输入如何选择 ,一般看外部模块的输出的默认电平,如果外部模块默认输出高电平,选上拉输入,默认输入高电平;如果外部模快保持默认状态一致,防止默认电平打架。

函数学习:配置编码器接口函数

void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);

具体参数含义如下:

  • - TIMx:TIMx表示要配置的定时器,如TIM1、TIM2等。
    - TIM_EncoderMode:TIM_EncoderMode表示定时器的编码器模式,有如下几种取值:
      - TIM_EncoderMode_TI1:仅使用TIMx_CH1通道的正向输入捕获模式。
      - TIM_EncoderMode_TI2:仅使用TIMx_CH2通道的正向输入捕获模式。
      - TIM_EncoderMode_TI12:同时使用TIMx_CH1和TIMx_CH2通道,采用正交编码模式。
    - TIM_IC1Polarity:TIM_IC1Polarity表示编码器模式下TIMx_CH1通道的输入捕获电平极性,有两种取值:
      - TIM_ICPolarity_Rising:上升沿捕获有效。
      - TIM_ICPolarity_Falling:下降沿捕获有效。
    - TIM_IC2Polarity:TIM_IC2Polarity表示编码器模式下TIMx_CH2通道的输入捕获电平极性,有两种取值:
      - TIM_ICPolarity_Rising:上升沿捕获有效。
      - TIM_ICPolarity_Falling:下降沿捕获有效。
    

主函数:

#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();
	Encoder_Init();

	OLED_ShowString(1, 1, "Speed:");

	while (1)
	{
		OLED_ShowSignedNum(1,7,Speed,5);
//		Delay_ms(1000);  //闸门时间:如果是电机,用时短一些,防止溢出
//		OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5); //自动重装值
	}
}

void TIM2_IRQHandler(void)    //少用Delay_ms()函数,采用定时中断,避免阻塞主循环运行
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Speed = Encoder_Get();
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

Encoder函数:

#include "stm32f10x.h"                  // Device header


void Encoder_Init(void)
{
	 //1.把TIM外设与GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 

	//2.GPIO初始化
	GPIO_InitTypeDef GPIO_InitStructure;
	//对于普通的开漏推挽输出,引脚的控制权来自输出数据库,如果用定时器来控制引脚,需使用复用开漏,来自片上外设控制引脚,断开输出数据寄存器
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//上拉输入	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;  		 	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//3.配置时基单元
	//	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;					//ARR自动重装值(设大值,防止溢出)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 -1;						//PSC预分频的值(一周期计多少次)这里选择不分频
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;				//重复计数器的值(高级TIM才有)
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	//4.配置输入捕获单元(这里只需要配置滤波器,极性)
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel= TIM_Channel_1; 				 //选择通道1
	TIM_ICStructInit(&TIM_ICInitStructure);							 //赋一个默认初始值
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							 //滤波器选择
//	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;		 //输入捕获触发事件的电平极性(上升沿) 重复配置,后面的配置编码器接口模式会再次配置
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							 //写入硬件,无需定义新结构体,只需定义一次即可
	TIM_ICInitStructure.TIM_Channel= TIM_Channel_2; 				 //选择通道2
	TIM_ICStructInit(&TIM_ICInitStructure);							 //赋一个默认初始值
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							 //滤波器选择
//	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;		 //输入捕获触发事件的电平极性(上升沿) 重复配置,后面的配置编码器接口模式会再次配置

	//5.配置编码器接口模式
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	
	//6.调用TIM_Cmd,启动定时器
	TIM_Cmd(TIM3,ENABLE);
}

int16_t Encoder_Get(void)  //强制转换为int
{
	//先读取后清零
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

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

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

相关文章

(二十一)查找算法-插值查找

1 基本介绍 1.1 插值查找 插值查找算法又称插值搜索算法,是在二分查找算法的基础上改进得到的一种查找算法。 插值查找算法只适用于有序序列,换句话说,它只能在升序序列或者降序序列中查找目标元素。作为“改进版”的二分查找算法&#xf…

手动测试台架搭建,让你的车载测试更轻松

目录:导读 引言 1、概述 2、主要内容 3、汽车测试台架分类 4、汽车测试台架分类 5、汽车测试台架分类台架测试输人台架硬件搭建CANoe台架搭建 6、台架测试输入? 7、需求规范是功能测试用例设计来源测试结果的判断﹔包括∶客户需求(功能规范)需求分…

Redis框架与SpringBoot的整合及详细学习汇总

目录 springBoot整合Redis Redis 的优势 Redis安装 Redis数据类型 springboot操作Redis springboot 配置redis RedisTemplate及其相关方法 springBoot实现上传下载 RedisTemplate及其相关方法 springBoot实现上传下载 springBoot CORS(跨域资源共享&#…

【C++11】简介、列表初始化、声明、范围for、STL中的一些变化

简介、列表初始化、声明、范围for、STL中的一些变化 文章目录 简介、列表初始化、声明、范围for、STL中的一些变化一、C11简介二、统一的列表初始化1.{ }初始化2.initializer_list容器 三、声明1.auto2.decltype3.nullptr 四、范围for循环五、STL中一些变化 一、C11简介 在2003…

虚拟数字人遇上ChatGPT,好看的皮囊和有趣的灵魂?

都说好看的皮囊千篇一律,有趣的灵魂万里挑一,博雅仔不禁好奇,到底有没有皮囊又好看,灵魂又有趣的人呢?二者能否得兼?答案是当然可以啊。 虽然在现实生活中,遇到这样的人需要静待缘分的安排&…

pg从磁盘读取文件

**瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 了解存储管理器 详细信息 0. 相关数据类型 打开的每一个段用如下结构表示,pg中有MdfdVec数组并且记录了这个数组的…

微信小程序开发--利用和风天气API实现天气预报小程序

本来是参照《微信小程序开发实战》做一个天气预报小程序的,实际运行的时候提示错误,code 400,参数错误。说明问题应该出在查询API的语句上,没有返回结果。 查阅后才知道,可能书籍出版时间较早,现在的和风获…

大数据学习初级入门教程(十六) —— Hadoop 3.x 完全分布式集群的安装、启动和测试

好久没用 Hadoop 集群了,参考以前写的《大数据学习初级入门教程(一) —— Hadoop 2.x 完全分布式集群的安装、启动和测试_孟郎郎的博客-CSDN博客》和《大数据学习初级入门教程(十二) —— Hadoop 2.x 集群和 Zookeeper…

C++代码使用 gperftools 工具进行性能分析

文章目录 前言gperftools 是什么使用方法安装工具代码插桩引入工具代码修改关键代码完整示例编译链接启动分析程序 数据分析总结 前言 一直想用 gperftools 做一下性能方面的尝试,之前一直忙着开发,目前已经到了后期,忙里抽闲亲自操作一遍&…

战争教育策略游戏 MiracleGame,开启新阶段重塑生态和玩法

香港 Web3 区块链周刚刚在一片喧嚣中结束。各路大V、KOL 们的 report 都对 GameFi 的前景非常自信。2021-2023年期间,大量资金涌入 GameFi 赛道,GameFi 一旦爆发将会是现象级的出圈事件。 MiracleGame 是一款基于 BNB Chain 构建的英雄和元神主题的战争教…

CorelDRAW2023最新版本图像设计软件

CorelDRAW 2023作为最新版的图像设计软件,在功能上做了较大提升,主要新的功能特性如下: 1. 全新界面设计:采用简约现代的 UI 设计,菜单和工具重新组织,更加直观易用。提供自动提示与设计指导,易于上手。 2. 智能工具与提示:运用 AI技术对用户操作行为和设计习惯进行分析,给出…

【AIGC】手把手使用扩散模型从文本生成图像

手把手使用扩散模型从文本生成图像 从 DALLE 到Stable Diffusion使用diffusers package从文本prompt生成图像参考资料 在这篇文章中,我们将手把手展示如何使用Hugging Face的diffusers包通过文本生成图像。 从 DALLE 到Stable Diffusion DALLE2是收费的&#xff0c…

Python数据分析第02课:环境准备

如果希望快速开始使用 Python 处理数据科学相关的工作,建议大家直接安装 Anaconda,然后使用 Anaconda 中集成的 Notebook 或 JupyterLab 工具来编写代码。因为对于新手来说,先安装官方的 Python 解释器,再逐个安装工作中会使用到的…

【JAVA】easyExcel导出导入使用

EasyExcel是阿里巴巴开源插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行地加载,并且…

【剑指 offer】数组中出现次数超过一半的数字

✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 数 组 中 出 现 次 数 超 过 一 半 的 数 字 核心考点: 数组使用,简单算法的设计 描述: 给一个长度为 n 的数组,数组中有一个数字出现的次数超…

php:php-fpm平滑重启为什么无效

一、问题 今天修改了fpm一些配置,需要上线重启fpm,但是发现一瞬间出现很多502的错误请求,查看日志发现以下错误 fpm:重启日志 nginx:错误日志 2023/04/23 15:19:00 [error] 9#0: *1893053661 recv() failed (104: Co…

【服务器数据恢复】重装系统导致分区无法访问的数据恢复案例

服务器数据恢复环境: 磁盘柜raid卡15块磁盘组建一组raid5磁盘阵列,划分2个lun; 上层操作系统划分若干分区,通过LVM扩容方式将其中一个分区加入到了root_lv中,其他分区格式化为XFS文件系统。 服务器故障: 为…

S/MIME电子邮件证书,符合FDA邮件安全要求

美国食品和药物管理局 (FDA)要求合作伙伴提交或接收电子监管信息时,必须使用数字证书保障通信安全。 01 为什么FDA使用数字证书保障通信安全? 为了维护数据完整性、准确性,有组织地管理文件,FDA为接受机构的电子监管提交设置了电子…

基于开源 web3引擎的三维系统的开发

目录 结合图像特征的平滑恢复技术 1.开发步骤 2 应用案例开发 结束语 应用 Web3D 引擎开发的计算机仿真系统或虚拟现实系统均需在 Web 浏览 器 上 运 行 &#xff0…

MII、 RMII、 GMII、 RGMII 接口介绍

1、RGMII 接口概要 以太网的通信离不开物理层 PHY 芯片的支持,以太网 MAC 和 PHY 之间有一个接口,常用的接口有MII、 RMII、 GMII、 RGMII 等。 MII(Medium Independent Interface, 媒体独立接口): MII 支持…