良许Linux教程网 干货合集 STM32编码器接口及应用编程(附源码)

STM32编码器接口及应用编程(附源码)

编码器的概述

编码器是一种常见的设备,通常与电机配合使用,并用作传感器。编码器有多种类型,包括增量式编码器、绝对值编码器、有轴或无轴编码器,以及电压输出、推拉输出和集电极开路输出等。尽管类型多样,但编码器的目的大致相同,即获取旋转的角度、角速度和位移等信息。

本文将详细介绍增量式编码器,它也被称为正交编码器。通过增量式编码器的A、B相位,我们可以确定编码器是正转还是反转。此外,还可以根据编码器的参数来确定旋转角度的大小。

常见的增量式编码器A、B、Z三根线代表什么意思呢?使用过编码器的人不难理解,这里简单给初学者讲述一下:

A、B两线提供相位相差90度的脉冲信号,用其来计算旋转的角度;Z线为过零点线,也就是说每转一转,经过某一点都会输出一个脉冲信号,主要用于“过零校正”,三线的信号大致如下图:

image-20230806224334720
image-20230806224334720

有些编码器出来的线有一个对应的“非”信号线(如上图右边),其实主要用于抗干扰的。

更多关于编码器的描述,请网上搜索相关的知识进行了解,本文不再讲述。

STM32编码器接口模式

在STM32芯片中,都有这么一个定时器,叫通用定时器“General-purpose timers”,定时器里面存在这么一个模式,叫编码器接口模式“Encoder interface mode”。当然,具体可参看芯片对应的数据手册。

STM32提供的编码器接口模式主要针对的就是“正交编码器”,它可以利用定时器的“计数”功能,得出编码器计了多少个脉冲;同时,它可以根据编码器AB的相位得出编码器是正转,还是反转。

image-20230806224337614
image-20230806224337614

(图片来自STM32参考手册)

1.计算脉冲个数

有点类似TIM的捕获功能,捕获A相、B相的脉冲信号;只是编码器模式是捕获A(TI1)、B(TI2)相的边沿信号(如上图),相当于一个周期内,计4个脉冲信号的值。

2.计数器的增减(方向)

STM32的计数器会根据方向(+ 或者 -)来进行计数,TI1和TI2相位相差90,4个阶段的边沿,对应TI1和TI2不同电平信号,从这个不同的信号,硬件自身可以判断出其方向。在编码器模式下,有个寄存器(TIMx_CR1)中有一个方向位(DIR),会随着编码器旋转方向的改变而改变,我们可以通过读取该位来判断编码器的正转,还是反转。

3.TIM时基

STM32编码器接口模式,其实是通过利用AB相位TIM时基提供时钟信号,使其计数。

image-20230806224340308
image-20230806224340308

应用编程

相信看了上面的一些描述,大家应该对编码器有所理解了。其实,在STM32中,可以通过配置编码器模式对应的函数,就能实现获取编码器传感器上面的信息了。

使用STM32提供的标准外设库,或者使用STM32CubeMX工具很容易将TIM配置成编码器模式。

1.标准外设库配置编码器

TIM_EncoderInterfaceConfig,它就是编码器接口的配置函数。简单的只需要配置该函数,使能TIM,即可实现采集编码器上面的信息。(当然,需要复杂的操作,还需要做其他相应的配置)

比如TIM3编码器配置:

void TIM_ENCODER_Configuration(void)
{
  GPIO_InitTypeDef        GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  /* 时钟配置 */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,  ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,   ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  /* 引脚配置 */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;           //引脚(A、B项)
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;                      //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* 复用配置 */
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);            //复用配置
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);            //复用配置

  /* 时基配置 */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;                           //预分频值
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上计数模式
  TIM_TimeBaseStructure.TIM_Period = 10000;                          //定时周期
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;            //时钟分频因子
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* 编码器配置 */
  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

  /* 初始化 */
  TIM_SetCounter(TIM3, 0);
  TIM_Cmd(TIM3, ENABLE);
}

2.STM32CubeMX配置

STM32CubeMX是一套快速开发的工具,让很多不了解STM32底层的朋友可以快速的在STM32上编写应用程序。

本文说的配置编码器接口,在某些TIM上存在一个“Combined Channel”配置,可以理解为“连接通道”,也算是TIM的一种复用模式。选择里面的“Encoder Mode”即可。

image-20230806224406176
image-20230806224406176

实例代码

本文提供的代码为一个使用标准外设库编写的简单Demo工程,其中里面附带一个工程(用于模拟编码器AB相波形的工程),如下:

image-20230806224409096
image-20230806224409096

该工程主要配置TIM的编码器模式,通过定时读取编码器的方向(DIR),和计数(CNT),并通过串口打印出来。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部