STM32 ABZ编码器模式详解

这篇具有很好参考价值的文章主要介绍了STM32 ABZ编码器模式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本文旨在记录和说明STM32CubeIde中ABZ编码器的配置。本人作为STM32新手,在使用STM32时,太多的意义不明的配置项让我摸不着头脑,查阅资料并在这里记录,如果有不对的,欢迎各位大佬指正。

        本文硬件使用ST官方提供的NUCLEO-G474RE+X-NUCLEO-IHM16M1,记录ABZ的配置过程。


ABZ编码器

本文使用的是磁电增量式编码器

原理:利用霍尔效应,将位移转换成计数脉冲,用脉冲个数计算位移和速度。具体原理如下图所示

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

图中,磁电增量式编码器的结构包含:磁盘、霍尔传感器以及信号转换电路 3 个部分,其中,磁盘是由一个个交替排布的 S 极和 N 极磁极组成;霍尔传感器可以把磁场的变化转换成电信号的变化,它通常有 A、 B 两相(有的还有 Z 相),这两相的安装位置形成一定的夹角,这使得输出的 A、 B 两相信号有 90°的相位差;信号转换电路可以把电信号转换成脉冲信号。
在实际应用中,磁盘会装在电机的转轴上,它会随着电机的转轴旋转,而磁盘上面的 S 极和 N 极就会交替地经过霍尔传感器的 A、 B 两相,霍尔传感器就可以把磁盘上的磁场变化转换为电信号的变化,输入到信号转换电路中,经过信号的转换之后,我们就可以得到 A、B 两相脉冲信号了。从上图中可以看到, A、 B 两相脉冲信号存在 90°的相位差,而磁盘的正反转方向就决定了是 A 相信号在前还是 B 相在前

定时器模式

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

编码器模式

我们选择定时器1,配置Combined Channels为Encoder Mode +Index

编码器模式简单来说就是一个带方向的外部时钟,根据方向从0增加到ARR寄存器的值或者从ARR寄存器的值减少到0。

具有index的编码器有三个输出:A和B,用于控制计数器和索引的递增/递减;index,也就是Z信号,在每转一圈触发一次。在时序图中,当轴到达特定位置时产生零脉冲。

Encoder Mode + Index:就是有AB两相进行计算的变化,将Z相接入tim_etr_in,发出信号时会自动将计数重置,不需要我们手动增添计数重置的代码。同时,Index检测事件根据计数方向的不同而不同,以确保在速度反转期间对称操作:

在计数增加时,重置为0;

在计数减小时,重置为ARR寄存值;

One Pulse Mode

简单来说,该模式通过PWM mode、CCR、ARR的值生成一个脉冲后停止定时器计数。

具体参考:

STM32 - 定时器的设定 -高级- 08 - One-pulse mode - 触发波的实现 - 可变长度和相位_one pulse mode-CSDN博客

定时器配置

Count Settings AND Trigger Output(TRGO) Parameters

之前我们提到,编码器模式就像外部时钟一样,所有捕捉,比较,分频,重复计数,触发都和定时器一样。具体可以参考我写的另一篇PWM配置文章

STM32CubeIde中互补PWM配置项的详细解读_chn ldle state-CSDN博客

Encoder

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

Index Position

这个选择是指出现Index信号时,检测到AB两相处于什么状态时,进行计数重置,如下图为检测到AB都为高电平,才对编码器计数进行重置。

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

Index Direction

该值修改IDIR[1:0]的值,表示index信号被激活仅在指定的方向。电机有正反转,所以我们这里选择无论方向都重置。具体的图例如下。

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

Encoder Mode

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

该模式选择编码器时钟的计数方式,计数模式分为3种,分别为正交编码器模式、时钟加方向模式、定向时钟模式。

正交编码器模式:

Encoder Mode TI1:只通过TI1计数,计数2分频

Encoder Mode TI2:只通过TI2计数,计数2分频

Encoder Mode TI1 and TI2:通过TI1和TI2计数,计数4分频

Encoder Mode x1_TI1:只通过TI1计数,计数1分频

Encoder Mode x1_TI2:只通过TI2计数,计数1分频

示例如图所示

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

接下来我们讲解一下正交编码器计数原理

编码器接口可以利用输入脉冲的边沿进行计数,我们通过计数值的变化量,就可以算出输入脉冲信号的变化量,也就可以进一步计算出电机的转速了。接下来我们看一下编码器接口是如何根据脉冲边沿计数的,它的计数方向与输入脉冲信号的关系如表所示:
 

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

表来自于《STM32G4xx 参考手册_V7(英文版) .pdf》中的表 75(第 415 页),上表中的有效边沿我们可以通过代码去配置,一共有 3 种边沿检测方式,其中仅在 TI1 处计数表示只检测 TI1 上的脉冲边沿变化,这时候的计数方向需要结合 TI2FP2 上的电平情况来确定,其他的两种边沿检测方式原理也是一样的,下面我们以一个实例来理解这个表格的内容:
假设我们把 A 相接在 CH1(TI1), B 相接在 CH2(TI2),选择仅在 TI1 处计数(仅检测A 相边沿)。此时编码器接口计数方向和输入脉冲信号的关系如下表:

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

编码器输出的 A、 B 两相脉冲信号如图所示:
stm32 io abz,STM32,stm32,嵌入式硬件,单片机

图 中, A、 B 两相输出的脉冲信号有两种情况:当编码器正转, A 相在前;当编码器反转, B 相在前,我们选择仅在 TI1 处计数,也就是只检测 A 相的边沿。接下来我们分别介绍这两种情况下的计数方向:
正转:当 A 相上升沿到来时(图中①处),我们需要关注 B 相的电平高低,从图中可看到 B 相此时是低电平,结合表,可以得知此时计数方向为递增计数;当 A 相下降沿到来时(图中②处),从图中可以看到 B 相此时是高电平,结合表,可以得知此时计数方向为递增计数;当 A 相上升沿再次到来时(图中③处),同理可得此时计数方向为递增计数。综上所得,我们可以知道此时编码器正转对应的计数方向就是递增计数。
反转:当 A 相上升沿到来时(图中④处),我们需要关注 B 相的电平高低,从图 中可看到 B 相此时是高电平,结合表,可以得知此时计数方向为递减计数;当 A 相下降沿到来时(图中⑤处),从图中可以看到 B 相此时是低电平,结合表 ,可以得知此时计数方向为递减计数;当 A 相上升沿再次到来时(图中⑥处),同理可得此时计数方向为递减计数。综上所得,我们可以知道此时编码器反转对应的计数方向就是递减计数。
上述的就是仅在 TI1 处计数的实例分析,其他两种边沿计数方式的原理是一样的,大家可以举一反三,我们这里就不再展开分析。

其他编码器模式

stm32 io abz,STM32,stm32,嵌入式硬件,单片机

除了正交编码器模式,定时器提供支持其他两种类型的编码器。在顶部时序图所示的“时钟加方向”模式中,时钟提供在TI2上的单线上,而方向是使用TI1输入强制的。在下面时序图所示的“定向时钟”模式下,时钟在两条线上,根据方向,同时有一条单时钟线,这样就有一条上行时钟线和一条下行时钟线。

实例

下图为编码器更新的函数,通过__HAL_TIM_GET_COUNTER()获取ABZ计数值文章来源地址https://www.toymoban.com/news/detail-827367.html

int UpdataEncoderCnt(void)
{
	//获取电机读数
	encoderDef.preCnt = encoderDef.cnt;
	encoderDef.cnt = (int32_t)__HAL_TIM_GET_COUNTER(&htim4);
	//计算电机偏移量
	encoderDef.incCnt = ModifyIncCnt(encoderDef.cnt - encoderDef.preCnt);
	// 获取真实的编码器计数值
	int realCnt = encoderDef.cnt - encoderDef.offsetCnt;
	// 当计数值为负数时,加上一圈的计数数
	while(realCnt<0)
	{
		realCnt += ABZ_PULSE * 4;
	}
	// 计算真实的角度值
	encoderDef.angle=realCnt*2*3.1415926f / ABZ_PULSE / 4;
	// 计算电角度
	encoderDef.elecAngle = encoderDef.angle * MOTOR_POLE;
	// 返回编码器读数
	return encoderDef.cnt;
}

到了这里,关于STM32 ABZ编码器模式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】【HAL库】定时器编码器模式测速

    目录 概述 HAL设置  定时器的编码器模式 定时器设置  常用函数 代码 电机AB相增量型编码器的介绍和解码方法在这里介绍过了 电机编码器 https://blog.csdn.net/m0_57585228/article/details/125791283 测速可以使用外部中断进行脉冲计数 很多型号的单片机中有专门的电路来计算脉冲的速度和

    2023年04月18日
    浏览(50)
  • 【嵌入式】STM32计时器编码器接口模式使用

    使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。 硬件: STM32F103C8T6 光栅测距传感器 编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信

    2024年02月20日
    浏览(40)
  • 【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

    旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的脉冲个数。 旋转编码器广泛用于电机、或者角度传感器,STM32的定时器可以直接接入这两个波形获取到信息。 前两个引脚(接地和Vcc)

    2024年02月13日
    浏览(38)
  • STM32定时器捕获编码器模式测速和方向测不准问题

    ** 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮车,控制运动就需要精确的测量转速和方向,我用的是直流有刷、减速比90、11线霍尔编码器的减速电机。 原本想着用个

    2024年02月15日
    浏览(41)
  • STM32定时器编码器模式实现直流有刷电机测速(HAL库)

    最近在做一个单片机大作业,要用到直流有刷,在这里把学习编码器的知识记录一下,学习参考资料: 正点原子DMF407电机控制专题教程_V1.0 我所使用的编码器是市面上常见的 磁电增量式编码器 ,其有AB两相,用于输出电机转动时的 脉冲数 ,AB两相的先后顺序决定了电机的

    2023年04月24日
    浏览(59)
  • 初出茅庐的小李博客之STM32CubeMx配置定时器的编码器模式

    上次文章写了编码器是如何工作的,今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。 话不多说,上教程! 选择外部高速时钟源HSE 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 选择编码器模式 分频值设置为2-1 计数值设

    2024年02月12日
    浏览(33)
  • stm32-编码器测速

    编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。 使用定时器

    2024年03月19日
    浏览(43)
  • STM32——TIM编码器接口

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

    2024年01月19日
    浏览(37)
  • STM32 TIM编码器接口

    单片机学习! 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时器框图 3.1 编

    2024年04月14日
    浏览(41)
  • STM32 EC11 旋转编码器

    代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种。一种是转两格,A、B对C端输出一个完整脉冲(转一格就只是由低电平-高电平或由高电平-低电平);另一种就是转一格,A、B对C端输出一个完整脉冲。

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包