stm32f103单片机—编码器测速

2023-10-31

一、涉及资源

stm32f103ZET6开发板(非指定)
MG513P3012V型号电机(带霍尔编码器)(非指定)

二、涉及概念

1、单片机资源要求

此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8,定时器使用通道1、2来实现编码器功能,接线时注意把A/B相接到定时器通道1/2的引脚。

2、减速比

电机结构
在这里插入图片描述
减速结构
在这里插入图片描述
减速比为1:30通俗地讲就是当电机外伸轴转1圈时实际轴转30圈,外伸轴我们一般接上轮胎等实际作用物体,而实际轴是电机自身的转子,霍尔编码器的检测对象是实际轴

3、测速原理

霍尔编码器工作方式

霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘和霍尔元件组成。霍尔码盘是在一 定直径的圆板上等分地布置有不同的磁极。电机旋转一圈霍尔元件发出特定数目的脉冲信号。,用时间间隔内接收的总的脉冲数目除以转一圈发出的脉冲数目即可得到转轴转的圈数,再除以时间间隔就能得到转速。 为判断转向,一般输出两组存在一定相位差的方波信号。

定时器判断电机正反转的依据

定时器通道1、通道2接收A相和B相的脉冲信号,转一圈A相和B相发出的脉冲数目是一样的,但是发送有先后之分。
在这里插入图片描述

定时器针对正反转的两种计数方式

定时器在编码器模式下有两种计数方式,正转时是从重载值开始向下减数,反转时是从零开始向上加数(正反是相对而言的)。例如,如果我设定定时器的重载值为0x7fff,那么当定时器接收到10个正转的脉冲时,计数值变为0x7ff3,当定时器接收到的是反转的脉冲时,定时器的计数值变为0x000A。

定时器编码器模式1、2、3

TI1和TI2分别为定时器的通道1和通道2
在这里插入图片描述

在这里插入图片描述
编码器模式3即为四倍频模式,这个模式下对于A和B相发过来的一组脉冲会有四次计数(四个跳变沿),这样就能将检测精度提到四倍。

4、M法测速

在这里插入图片描述

三、编码器与单片机的接线

注:这里以stm32f1系列的定时器4为例,若使用其他定时器进行测速需要更换对应的引脚资源,编码器A/B相需接到定时器的通道1和通道2

1、霍尔编码器实物图

在这里插入图片描述

接线

编码器A相和B相接PB6和PB7引脚(无对应要求)

四、单片机引脚和定时器的初始化

1、代码示例

引脚选择PB6和PB7
定时器选择TIM4,使用编码器模式3

/*****************************************************
*@Func:	编码器涉及资源的初始化
******
*@para:	
******
*@desc:	选择TIM4作为此编码器的解码时钟
******	设置重装值
******  注意:实际使用时对转速有限制,如果转速太快可能发生定时器溢出的情况,就要考虑使用中断
******  目前对脉冲一次定时仅能计32768次,超过即无效,可以分别正反转。
******	定时器在编码器模式下电机如果正转计数器会从零开始正数,如果反转计数器会从重载值开始倒数
******************************************************/ 
void EncoderA_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 			//	引脚初始化的结构体  
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;	//	定时器初始化的结构体
	TIM_ICInitTypeDef TIM_ICInitStructure; 			//	定时器编码器模式初始化的结构体
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 	//	使能TIM4时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 	//	使能GPIOB时钟
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	//	PB6、PB7
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 	//	浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//	根据GPIO_InitStructure的参数初始化GPIOB0

	TIM_TimeBaseStructure.TIM_Period = 0xffff; 				//	设定计数器自动重装值
	TIM_TimeBaseStructure.TIM_Prescaler = 0; 						//	预分频器 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 		//	选择时钟分频:不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 	//	TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 				//	根据TIM_TimeBaseInitStruct的参数初始化定时器TIM4
	
	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3:CH1、CH2同时计数,四分频
	
	//初始化TIM4输入捕获参数
	TIM_ICStructInit(&TIM_ICInitStructure); 							//	把TIM_ICInitStruct 中的每一个参数按缺省值填入
	TIM_ICInitStructure.TIM_ICFilter = 0x03;  							// 	IC1F=0011 配置输入滤波器(连续采样八次)
	TIM_ICInit(TIM4, &TIM_ICInitStructure); 							//	根TIM_ICInitStructure参数初始化定时器TIM4编码器模式

	TIM_Cmd(TIM4, ENABLE); 												// 使能定时器4
}

五、读定时器的计数值

定时器的计数值即为编码器发出的脉冲数目*4(定时器的编码器模式3)

/*****************************************************
*@Func:	读取定时器计数值
******
*@para:	
******
*@desc:	
******************************************************/ 
void Read_EncoderA(void)
{
	if(TIM4->CNT > 0x7fff)
	{
		EncoderA = TIM4->CNT - 0xffff;	// 反转
	}
	else
	{
		EncoderA = TIM4->CNT;			// 正转
	}
	TIM4->CNT = 0xffff;
}

六、由定时器计数值得到转速

1、计算公式

使用M法测速,计算公式为:
转速n = 总脉冲数/四倍频/单圈脉冲数/减速比/时间间隔

2、代码示例

电机转一圈本款霍尔编码器发出13个脉冲,本款电机的减速比为1:30

/*****************************************************
*@Func:	获取电机A的速度
******
*@para:	
******
*@desc:	返回的是电机的转速 n圈/s
******	转速n = 总脉冲数/四倍频/单圈脉冲数/减速比/时间		
******************************************************/ 
void Get_MotorA_Speed(void)
{
	Read_EncoderA();	// 获取编码器产生的脉冲数
	MotorASpeed = (float)EncoderA / 4 / PulseNum / ReRate / DecodeGapTime * 1000;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32f103单片机—编码器测速 的相关文章

随机推荐

  • Android Studio App开发入门之图形定制Drawable的讲解及实战(附源码 超详细必看)

    运行有问题或需要源码数据集请点赞关注收藏后评论区留言 图形Drawable Android把所有能够显示的图形都抽象为Drawable类 这里的图形不止是图片 还包括色块 画板 背景等等 包含图片在内的图形文件放在res的目录的各个draw
  • 本地改代码服务器同时修改,sync_web: 将本地的修改通过ftp一键同步到服务器上 ,非常适合维护多个网站并且经常改动代码的情况...

    sync web 将本地的修改通过ftp一键同步到服务器上 非常适合维护多个网站并且经常改动代码的情况 监测文件变动依赖于svn或git author hellstar 在ksc的sync web项目基础上改进 需要安装python2 7环
  • c++11之std::enable_shared_from_this入门

    一 std enable shared from this
  • MySQL之rank() over(order by)

    一 准备工作 创建一个表palyers CREATE TABLE players pid int 2 NOT NULL AUTO INCREMENT name varchar 50 NOT NULL age int 2 NOT NULL P
  • JSON、AJAX简单介绍

    链接 https pan baidu com s 1CS9eQJB YyXorHR7k4P Ww 提取码 nkt2 JSON JavaScript 对象表示法 JavaScript Object Notation JSON 是存储和交换文本
  • 偷偷爆料下国内比较大型的 IT 软件外包公司名单(2023 最新版!)

    点击关注公众号 Java干货及时送达 来源 网络 1 软件外包公司名单 2 如何区分是否是外包公司 3 外包公司真是无一是处吗 4 软件外包的几种形式 5 哪些情况可选择外包 根据网上的资料 整理出来的一份国内软件外包公司的名单 找工作的同
  • RS485收发切换多0x00数据影响bootload升级程序

    串口升级使用RS485接口 RS485收发切换多0x00数据 部分有问题电路板在app程序中输入调试指令有响应 app通过ULINK下载 而使用ymodem在bootloader中升级程序失败 通过printf打印捕捉到数据包头多0x00数
  • 【机器学习】支持向量机SVM - 对SVM与核函数的理解及sklearn参数详解

    支持向量机是在深度学习流行开来之前 性能表现最好的一种机器学习方法 在看这篇blog之前 默认读者已经有了对支持向量机的基本概念的认识 一 支持向量机的进一步理解 支持向量机的优化目标在逻辑回归优化目标基础上进一步产生的 具体优化目标不说了
  • web标准化设计:常用的CSS命名规则

    头 header 内容 content container 尾 footer 导航 nav 侧栏 sidebar 栏目 column 页面外围控制整体布局宽度 wrapper 左右中 left right center 登录条 loginb
  • (二) three.js 导入模块

    导入模块 目录结构 示例 First html 导入three js 的模块 script 标签导入模块 红色框是导入three js 下面绿色框就不用加type module Import导入模块 同样注意红色框和绿色框的对应关系
  • es6面试题

    1 es5和es6的区别 说一下你所知道的es6 ECMAScript5 即ES5 是ECMAScript的第五次修订 于2009年完成标准化ECMAScript6 即ES6 是ECMAScript的第六次修订 于2015年完成 也称ES2
  • 常见的通讯协议总结(USART、IIC、SPI、485、CAN)

    目录 一 通讯的基本概念 1 串行通讯 2 并行通讯 3 串行通讯与并行通讯对比 4 传输模式 单工 半双工 全双工 二 USART 串口通讯 1 物理层 2 协议层 1 波特率 2 起始和停止信号 3 有效数据 4 数据校验 2 异步串行
  • 使用CSMA/CD协议一个计算题

    题干 首先计算一下A这个以太网所容许的最短的帧它的发送帧的长度时间为 8 前同步码为8 64 最短帧长 8 单位转换b到B 576比特 有关于单位转换 B是Byte的缩写 B就是Byte 也就是字节 Byte b是bit的缩写 b就是bit
  • 理解高内聚低耦合

    低耦合 耦合就是元素与元素之间的连接 感知和依赖量度 这里说的元素即是功能 对象 系统 子系统 模块 例如 现在有方法A和方法B 我们在A元素去调用B元素 当B元素有问题或者不存在的时候 A元素就不能正常的工作 那么就说元素A和元素B耦合
  • 【数据结构】实验六:图论

    文章目录 7 1 邻接矩阵表示法创建无向图 参考代码 代码解析 7 2 邻接表创建无向图 参考代码 代码解析 7 3 图深度优先遍历 参考代码 代码解析 7 4 单源最短路径 参考代码 代码解析 7 5 列出连通集 参考代码 代码解析 7
  • 在Servlet中使用开源fileupload包实现文件上传功能

    当我们在 HTML 表单中选择本地文件之后点击 提交 按钮则会将文件上传到服务器中 此时该 HTTP 请求正文的数据类型就是 multipart form data 型的 而在 Servlet 技术中 该 HTTP 请求会被 Servlet
  • 在Windows上使用clang编译器

    在Stackoverflow等网站上 经常出现各种编译器的对比的结果 其中clang是很常见的 那么 怎样在Windows上使用clang呢 没那么直观 直接去llvm官网上下载clang的发行包 解压 到bin下面 看到应该是我们想要的工
  • QTreeWidget实现的树形节点的添加+双击响应+删除详解

    承接该文http blog csdn net bzhxuexi article details 10054289 在该文基础上继续讲解QTreeWidget控件的使用 同时解决该文最后留下的问题 QTreeWidget是实现树形结构的类 在
  • 微信小程序map组件路线规划,腾讯地图sdk的应用案例

    腾讯地图WebService API 是基于HTTPS HTTP协议的数据接口 开发者可以使用任何客户端 服务器和开发语言 按照腾讯地图WebService API规范 按需构建HTTPS请求 并获取结果数据 目前支持JSON JSONP方
  • stm32f103单片机—编码器测速

    一 涉及资源 stm32f103ZET6开发板 非指定 MG513P3012V型号电机 带霍尔编码器 非指定 二 涉及概念 1 单片机资源要求 此种测速方法要求单片机的定时器具有编码器模式 对于stm32f1系列 具备编码器模式的定时器有T