STM32——TIM编码器接口

news2024/9/26 5:22:45

文章目录

  • 一、编码器接口简介
  • 二、正交编码器
  • 三、通用定时器框图
  • 四、编码器接口基本结构
  • 五、工作模式
  • 六、实例(均不反相)
  • 七、实例(TI1反相)
  • 八、编码器接口测速
    • 电路设计
    • 关键代码

一、编码器接口简介

  • Encoder Interface 编码器接口
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口,C8T6拥有4个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2(CH1和CH2引脚)
  • 编码器接口可以看做是带有方向控制的外部时钟
  • 实际上是测频法测正交脉冲的频率,可以根据旋转方向,实现自增计次,自减计次,然后每隔一段时间取一次CNT的值,再把CNT清零,每次取出来的就是编码器的速度。如果只是取出CNT的值不清零,则表示编码器当前的位置
  • 外部中断实现的效果和编码器接口实现的效果相同,区别是后者使用硬件资源取代软件资源开销

二、正交编码器

在这里插入图片描述

  • 可以测量位置(返回CNT的值),或带方向的速度值(返回CNT的变化值)
  • 旋转越快,频率越高,频率代表速度
  • 设计正交信号可以抗噪声
  • 由右侧的图可知,A相上升沿的时候,B相在正传和反转时是不同的电平。所以,将A相和B相的所以边沿作为计数器的时钟,出现边沿变化时,计数器就自增或自减

三、通用定时器框图

在这里插入图片描述

  • 编码器接口的两个输入引脚借用了输入捕获的通道的CH1和CH2引脚
  • 编码器接口是从模式控制器,通路连接到CNT计数器
  • 72MHZ的内部时钟和时基单元初始化设置的计数方向并不会使用,而是受到编码器控制

四、编码器接口基本结构

在这里插入图片描述

  • ARR自动重装器设置为65535。利用补码特性得到负数,将16位的无符号数转化为16位的有符号数,65535为-1,65534为-2。
  • 函数TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//配置编码器接口,第二个参数为编码器模式,参数三四为通道的极性
  • 边沿检测:上升沿有效表示的是高低电平不翻转,下降沿有效表示翻转高低电平

五、工作模式

在这里插入图片描述

  • 左侧的有效边沿为3种工作模式:由于在判断为正转时可以有四种状态,也就是AB相都可以用来判断,仅仅采用一个通道进行判断也可以只是计次精度会下降
    在这里插入图片描述

六、实例(均不反相)

在这里插入图片描述

  • 一个引脚不变,另一个引脚多次变化的毛刺信号,计数值还是原来那个数

七、实例(TI1反相)

在这里插入图片描述

  • TI1反相,在分析前先将TI1的时序图翻转
  • TI1反相,是修改将CH1或2通道内的极性选择,在编码器模式下是高低电平的极性翻转,而不是输入捕获模式下的边沿翻转
  • 用途:当计数相反的时候可以修改极性

八、编码器接口测速

本质:编码器计次,计次可以使用外部中断方式,方波信号来自编码器,在中断函数里面手动计次,占用软件资源,CPU会频繁进入中断,可以采用硬件自动化计次,也就是定时器的编码器接口模式。

使用场景:使用PWM驱动电机,再使用编码器(无接触式的霍尔传感器或光栅)测量电机速度,再用PID算法实现闭环控制

电路设计

旋转编码器的AB相分别接PA6和PA7
在这里插入图片描述

关键代码

main.c

#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);//OLED_ShowSignedNum()可以显示负数
		//Delay_ms(1000);为了避免在主循环中造成阻塞,可以用定时中断的方式读取CNT的变化值,如TIM2_IRQHandler()函数
	}
}

void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Speed = Encoder_Get();//每隔一秒读取一次速度
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

Encoder.c

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	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);
		
		//因为编码器接口是一个带有方向控制的外部时钟,所以不需要配置时钟
	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_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICStructInit(&TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//通道1
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	//无须定义新的结构体配置成员,因为调用TIM_ICInit()函数后就写入到硬件寄存器中
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道2
	TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//配置编码器接口,第二个参数为编码器工作模式,参数三四为通道的极性,Falling表示通道反向,Rising表示通道不反向
	
	TIM_Cmd(TIM3, ENABLE);
}

//返回有符号位的16位计数器的值
int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

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

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

相关文章

pycharm配置详解

配置解释器File-->setting-->Project:somename-->Project InterpreterPycharm下Python环境没有块注释"""something"""是文档,不是块注释Python中就没有块注释Pycharm版本控制配置Pycharm中的快捷键pycharm中自定…

手把手教你用springboot实现jdk文档搜索引擎

目录 项目背景 项目描述 项目整体架构 项目流程 构建索引 项目背景 搜索引擎是我们经常会用到的工具,例如我们熟知的百度,谷歌等搜索引擎。除了网络搜索引擎,还有很多地方也有搜索引擎的身影,例如视频网站的搜索框,…

Windows系统下使用mingw32编译curl-7.87.0办法

使用工具:Windows10QT5.14.2CMake (cmake-gui)curl-7.87.0 编译办法: 1、下载CURL源码:curl - Download,解压缩zip文件到指定路径下(如:D:\QTCode\curl-7.87.0) 2、新增环境变量,打…

为什么说IO密集型业务,线程数是CPU数的2倍?

I/O密集型业务,线程数量要设置成 CPU 的 2 倍! 也不知道这是哪本书的坑爹理论,现在总有一些小青年老拿着这样的定理来说教。说的信誓旦旦,毋庸置疑,仿佛是权威的化身。讨论时把这样的理论当作前提,真的是受…

MySQL复制底层技术——单线程复制、DATABASE并行复制

1. 单线程复制 单线程复制是MySQL最早出现的主从复制技术,本节我们将对单线程复制做进一步说明。 在MySQL5.6之前的版本中,从库复制不支持多线程,所以当主库写压力稍微大一点时,从库就会出现复制延迟。当然,目前的最…

网络音频广播RtpCast软件

RtpCast是一款基于Windows平台运行的网络音频广播软件。这款RTPCast软件可以以目标分组的方式播放电脑系统声卡(麦克风、喇叭和音频混合器)、MP3文件列表和网络Rtp音频流等音源到终端设备。此外,RtpCast网络音频广播软件支持方案调度&#xf…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据位置:Calldata

深入了解Solidity数据位置 - Calldata 原文链接: https://betterprogramming.pub/solidity-tutorial-all-about-calldata-aebbe998a5fc理解Solidity中以太坊交易的 "data" 字段 这是 深入Solidity数据存储位置 系列的第三篇 今天,我们将学习 calldata 的特殊性,以…

springboot项目使用SchedulingConfigurer实现多个定时任务

目录一、引入依赖二、配置文件属性配置三、代码目录结构四、示例代码4.1、定义 定时任务基础接口4.2、定义 定时任务一(每天几点几分执行)4.3、定义 定时任务二(每几分钟执行一次)4.4、定义 定时任务注册器4.5、运行springboot项目…

欧拉系统部署NextCloud与常见部署问题解决

欧拉系统部署NextCloud与常见部署问题解决一、欧拉系统安装二、openEuler安装图形界面Ukui三、yum安装的npm包进行本地保存设置(个人任务需要)四、部署nextCloud4.1构建LAMP环境基础4.1.1开启httpd,防火墙端口号4.1.2开启MariaDB服务4.1.3安装并测试php4…

2023/1/4总结

今天AC了三个题目: 第一个题目:P4913 【深基16.例3】二叉树深度 (1条消息) P4913 【深基16.例3】二叉树深度_lxh0113的博客-CSDN博客 第二个题目:P1229 遍历问题 (1条消息) P1229 遍历问题_lxh0113的博客-CSDN博客 第三个题目&#xff1…

药品市场信息查询-药品数据库(全面)

药品市场信息包含了药品招标、药品投标、药品集采、药品销售数据(医院、零售)、药品海关进出口数据、药品交易(药品license in/out)、价格、一致性评价、政策法规、药品公司等多个方面的数据信息,是医药行业市场信息工…

双向循环链表的讲解及实现(图解+代码/C语言)

本次为大家分享的是双向循环链表的增删查改等系列操作。 目录 一、图解双向循环链表结构 二、分步实现 (1)创建并初始化 (2)链表元素打印 (3)头插和尾插 (4)判断链表为空 &a…

MySQL调优-MySQL索引优化实战一

目录 MySQL调优-MySQL索引优化实战一 插入数据: 举一个大家不容易理解的综合例子: 1、联合索引第一个字段用范围不会走索引 2、强制走索引 什么是回表?为什么要回表?如何进行回表? 但是回表具有很大的弊端&#…

NetInside网络分析帮您解决系统性能问题(二)

前言 某大学信息中心负责人表示,有用户反馈,在通过VPN访问某一IP的80端口时连接时断时续。同时信息中心给到的信息是通过VPN:XXX.XXX.253.5访问IP地址XXX.XXX.130.200的80端口出现访问时断时续问题。 前一文章我们分析了系统整体性能分析&a…

学编程有哪些误区吗?避坑指南拿去不谢!

学习编程时信心满满,但反而效率不高,从“入门”到“放弃”,你肯定猜中了这些误区! 今天就专门写了一篇避坑指南,提前避开误区,有助于更好学习编程。 误区1:忽略基础,好高骛远 现在…

@Column写在属性和写在get方法上面的区别

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

【YOLOv7/YOLOv5系列改进NO.51】融入多分支空洞卷积结构RFB-Bottleneck改进PANet构成新特征融合网络

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列…

axios中get、post请求传参区别及使用

axios 发送请求时 params 和 data 的区别 params 中的参数是通过地址栏传参,一般用于get请求data 是添加到请求体(body)中的, 一般用于post请求get请求只能传query参数,query参数都是拼在请求地址上的post可以传body和…

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

一、前言 本片文章主要记录和分享一下qt使用qxlsx开源文件读写xlsx表格文件用法。 目录一、前言二、环境三、正文1.读取指定xlsx文件2.保存xlsx文件3.保存xlsx文件内容过大崩溃解决方案一4.保存xlsx文件内容过大崩溃解决方案二四、结语二、环境 windows linux qt5.7 三、正文…

【财务】FMS财务管理系统---对账平台

人工进行对账工作是非常繁杂的,此时,就非常有必要建设一个对账平台。笔者在本文介绍了对账平台的相关内容,分享给大家。 前面介绍过应收对账、财务应付结算两部分内容;应收对账主要是调用第三方支付的接口获取支付流水信息与我司的…