TIM编码器接口

一、知识点

1、Encoder Interface 编码器接口的工作流程

编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度

 2、编码器接口举例子讲解

若初始化之后CNT初始值为0,右转产生10个脉冲后停下来,CNT就由0自增到10停下来
再让编码器在左转产生5个脉冲,那CNT就在原来10的基础上自减5停下来
编码器接口:相当于一个带有方向控制的外部时钟,它同时控制着CNT的计数时钟和计数方向,CNT的值就表示了编码器的位置
若每隔一段时间取是CNT的值,再把CNT清零,每次取出来的值就表示了编码器的速度

3、编码器测速(带方向的测速)实质

实质:测频法测正交脉冲的频率

CNT计次,然后每隔一段时间去一次计次,其实是测频法的思路

 4、其他知识点

  • 每个高级定时器和通用定时器都拥有1个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2(通道3和通道4不能用)
  • 如果一个定时器配置成了编码机接口模式,则基本干不了其他活,C816芯片只有(TIM1、TIM2、TIM3、TIM4,4个定时器,故最多只能接4个编码器,接完后就没定时器可以用了

5、正交编码器 

(1)方波的频率代表速度 
(2)用正交信号的好处:
      a、正交信号精度更高,因为A、B相都可以计次,相当关于计次频率提高了一倍

      b、其次正交信号可以以抗噪声,因为正交信号两个信号必须是交替跳变的,可以设计一个抗  噪声电路,如果一个信号不变,另一个信号连续跳变,也就是产生了噪声,这时计次值是不会变化的

(3)编码器接口的设计逻辑:
首先把A相和B相的所有边缘,作为计数器的计数时钟,出现边缘信号时就计数自增或自减,增还是减由另一相的高低电平决定
(4)定时器中的编码器

6、编码器接口基本结构 

7、工作模式 

8、实例

(1)TI1和TI2都不反向

(2)TI1反相,TI2不反相 

若发现正转自减、反转自增,则应该把某个极性反相,就能反转计数方向,或者TI1\TI2调换 

 9、uint16_t写成int16_t

想把65535——>-1,则把uint16_t写成int16_t(借助补码的方式)

 二、编码器接口测速实验

1、功能:每隔一段时间去计数值,就能得到编码器旋转的速度
        向右旋转:计数为正,想左旋转,计数为负,大小均为速度

        现在:通过定时器的编码器接口,自动计次(节约软件资源)

        之前:触发外部中断,在中断函数中自动计次

2、原理图(A相接在PA6、B相接在PA7)

 3、 步骤

第一步:RCC开启时钟,开启GPIO和定时器的时钟

第二步:配置GPIO,PA6和PA7配置成输入模式

第三步:配置时基单元,预分频器选择不分频,自动重装,一般给最大65535,只需要给CNT执行计数即可

第四步:配置输入捕获单元(只有滤波器和极性两个参数)

第五步:配置编码器接口模式(调用库函数)

最后,调用TIM_Cmd开启定时器

  • 电路初始化后,CNT会随着编码器旋转而自增自减
  • 若想测量编码器的位置:直接读出CNT即可
  • 测量编码器的速度和方向:需要每隔一段固定的闸门时间,取出一次CNT,然后再把CNT清零,这是测频法测量速度

4、代码:

(1)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;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);//调用后就写入硬件寄存器,故结构体可以继续使用
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	//编码器模式:TIM_EncoderMode_TI12,TI1和TI2都计数
	//后面两个参数为通道1和通道2的电平特性,上升沿:高低电平不反转(编码器上升沿和下降沿都有效)
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	TIM_Cmd(TIM3, ENABLE);
}
 
int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

 (2)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);
	}
}
 
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Speed = Encoder_Get();
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构和CQRS的整合

这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章。在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识。如果您阅读了本系列以前的文章,那么本文的内容可能更有意义。 今天的帖子…

【多任务学习】Multi-task Learning 手把手编码带数据集, 一文吃透多任务学习

文章目录 前言1.多任务学习1.1 定义1.2 原理 2. 多任务学习code2.1 数据集初探2.2 预处理2.3 网络结构2.4 训练 3. 总结 前言 我们之前讲过的模型通常聚焦单个任务,比如预测图片的类别等,在训练的时候,我们会关注某一个特定指标的优化. 但是有时候,我们需要知道一个图片,从它身…

PostgreSQL 基础知识:psql 提示和技巧

对于积极使用和连接到 PostgreSQL 数据库的任何开发人员或 DBA 来说,能够访问psql命令行工具是必不可少的。在我们的第一篇文章中,我们讨论了 psql的简要历史,并演示了如何在您选择的平台上安装它并连接到 PostgreSQL 数据库。 在本文中&…

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

HTTP的method方法 GET POST PUT DELETE HEAD OPTIONS CONNECT PATCH TRACE

HTTP的method方法 GET POST PUT DELETE HEAD OPTIONS CONNECT PATCH TRACE GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意…

Docker 持久化存储 Bind mounts

Docker 持久化存储 Bind mounts Bind mounts 的 -v 与 --mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档:https://docs.docker.com/storage/bind-mounts/ Bind mounts 的 -v 与 --mount 区别 如果使用…

ePWM模块(1)

ePWM模块 ePWM模块内部包含有7个子模块,分别是时间基准子模块TB、比较功能子模块CC,动作限定子模块AQ、死区控制子模块DB、斩波控制子模块PC、事件触发子模块ET和故障捕获子模块TZ。 每个ePWM模块都具有以下功能: 可以输出两路PWM,EPWMxA和EPWMxB两路PWM可以独立输出,也可…

大二一个学期学这么点内容,没有概念,只有实操

如何查看所有的数据库: Show databases; 如何进入某个数据库: use xxx; 如何新进数据库: Create database jx; 如何删除数据库: Drop database jx; 如何查看所有的表格: Show tables; 如何创建数据表&#xf…

【Flink】DataStream API使用之执行环境

1. 执行环境 Flink 程序可以在各种上下文环境中运行:我们可以在本地 JVM 中执行程序,也可以提交 到远程集群上运行。不同的环境,代码的提交运行的过程会有所不同。这就要求我们在提交作业执行计算时,首先必须获取当前 Flink 的运…

(异或相消)猫猫数字异或和

E - Red Scarf (atcoder.jp) 刚入坑写的一道题被我拉出来对比分析了 我的思路: 垃圾运气选手凭借直觉乱搞猜出来的,没有思路。 题解思路: 由问题陈述中XOR的定义,我们可以看出计算3个或更多整数的XOR可以以任意顺序进行&#…

ChatGPT :十几个国内免费可用 ChatGPT 网页版

前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言…

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂,通过印刷,利用一切可能的方式,在机械通孔、机械盲埋孔等各种类型的孔内进行填充,实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后,利于层压的真空下…

盲目自学网络安全只会成为脚本小子?

前言:我们来看看怎么学才不会成为脚本小子 目录: 一,怎么入门? 1、Web 安全相关概念(2 周)2、熟悉渗透相关工具(3 周)3、渗透实战操作(5 周)4、关注安全圈动…

2.RabbitMQ

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应&am…

springboot整合flowable工作流引擎的简单使用

内容来自网络整理,文章最下有引用地址,可跳转至相关资源页面。若有侵权请联系删除 环境: mysql5.7.2 springboot 2.3.9.RELEASE flowable 6.7.2 采坑: 1.当前flowable sql需要与引用的pom依赖一致,否则会报library…

进程/线程 状态模型详解

前言:最近操作系统复习到线程的状态模型(也可以说进程的状态模型,本文直接用线程来说)时候,网上查阅资料,发现很多文章都说的很不一样,有五状态模型、六状态模型、七状态模型.......虽然都是对的…

[Python]爬虫基础——urllib库

urllib目录 一、简介二、发送请求1、urlopen()函数2、Request()函数 三、异常处理四、解析URL五、分析Robots协议 一、简介 urllib库是Python内置的标准库。包含以下四个模块: 1、request:模拟发送HTTP请求; 2、error:处理HTTP请…

前端技术——css

1.CSS的引入 【1】为什么要学习CSS? 如果只用HEML画页面的话--->这个页面就是页面上需要的元素罗列起来,但是页面效果很差,不好看,为了让页面好看,为了修饰页面。所以我们需要用到CSS。 CSS的作用:修饰HTML页面…

linux操作手册

开机&关机 指令 shutdown -h now 立刻进行关机 shutdown -h num num分钟后执行关机 shutdown -r now 现在重启计算机 halt 关机 rebboot 重启计算机 sync 把内存的数据同步到磁盘 注意事项 无论是重启还是关闭系统,都必须先执行sync,将内存…

使用无标注的数据训练Bert

文章目录 1、准备用于训练的数据集2、处理数据集3、克隆代码4、运行代码5、将ckpt模型转为bin模型使其可在pytorch中运用 Bert官方仓库:https://github.com/google-research/bert 1、准备用于训练的数据集 此处准备的是BBC news的数据集,下载链接&…