STM32F407+CubeMX-使用TIM计算编码器的脉冲总数,并计算脉冲方向

一、前言


STM32工程:

链接:https://pan.baidu.com/s/1o4lovPLwxNpSxf_jlLvCBA
提取码:hf2i

STM32F407,STM32F103,STM32H743的TIM都有编码器的功能。STM32的TIM上的编码器功能真的非常强大,它是纯硬件计算的,意味着MCU不需要参与脉冲数的计算(所以不需要进入中断做累加了),MCU只需要在合适的时间上读一下脉冲总数即可。如果你的闭环控制频率是500Hz的话,那么每2ms就需要读一下脉冲总数。通过STM32CubeMX可以非常便利地使用STM32的编码器功能去读取编码器反馈的脉冲数,在CubeMX生成的代码后,添加一点点代码就能实现该功能了。

有关步进电机与编码器的知识介绍,可以查看广州硬石科技《硬石YS-F4Pro开发板开发手册》从第40章开始。在嵌入式运动控制领域,广州硬石科技算是资料比较多的。
在这里插入图片描述
在机器人开发中,我经常使用步进电机。为了能够实现运动的闭环控制,步进电机是一定要增加编码器的。如下图所示:
在这里插入图片描述
**虽然这边博文不是介绍编码器的基本知识,但是为了看懂代码的目的。**编码器的关键参数需要了解一下:

1、分辨率

其实就是电机的转轴旋转一周,编码器的A相或B相(就是一个相)输出多少个脉冲信号而已。如下图的编码器所示,电机的转轴旋转一周,编码器的某一个相反馈3600个脉冲。
在这里插入图片描述
2、脉冲的电压

脉冲其实就是PWM信号,有1与0两种状态。一定要弄清楚脉冲的1是多少V(最好用示波器确认好!!!),不小心的话会烧掉芯片。STM32芯片基本都是支持3.3V与5V(容忍值,在芯片手册能查到是否支持5V)。

如下这个编码器,当VCC与GND接入5V时,它的脉冲的最高电压就是5V。
在这里插入图片描述
3、编码器的相数

一般的工业控制,采用两相(A/B相)的编码器足够。如下图所示,使用A相/B相就好了,细心的同学肯定发现,不是还有一个Z相吗?答案是,是有Z相,但是它的作用是电机的转轴旋转一周后,才反馈一个脉冲。其实就是反馈电机转了多少圈。这个Z相真的没什么用,原因是我通过A/B相也能知道电机旋转的多少圈,而且转了1/360也能测出来。但是Z相的话,只能测试1,2,3,4圈,无法测量0.5圈,0.3圈。
在这里插入图片描述

二、本次实验的编码器


在这里插入图片描述
分辨率:1000线 (意思是电机的转轴旋转一周,A相反馈1000个脉冲,B相也会反馈1000个脉冲)

脉冲电压:5V (博文最后,有示波器的观察,可以看到电压)

编码器相数:A/B相(Z相是电机转轴旋转一周,才反馈一个脉冲)

三、编码器与STM32的连接


编码器与单片机需要在同一个GND上(不然单片机与编码器怎么沟通呀),接着给编码器输入5V电源。
在这里插入图片描述

四、CubeMX的配置


4.1、RCC

在这里插入图片描述

4.2、Clock Configuration

在这里插入图片描述

4.3、TIM2

选择TIM2的原因是,只有TIM2与TIM5是32位的计数器(-2147483648 ~ 2147483647),其他TIM都是16位的计数器(-32768 ~ 32767)。说白了,当步进电机在旋转时,16位的计数器会频繁溢出,程序里要做好计数器溢出的处理。当使用TIM2与TIM5的32位计数器时,我觉得就可以省去了处理"计数器溢出"的问题了。
在这里插入图片描述
博文的后面,会解释为什么选用"Encoder Mode TI1 and TI2"即4倍频模式。
在这里插入图片描述
在这里插入图片描述

4.4、生成代码

在这里插入图片描述
在这里插入图片描述

五、Keil


5.1、Target

在这里插入图片描述

5.2、C/C++

在这里插入图片描述

5.3、Debug

在这里插入图片描述

六、代码


6.1、main.c

在这里插入图片描述
在这里插入图片描述

七、DEBUG


7.1、用手让步进电机逆时钟旋转约1圈

用手拧着电机的转轴逆时钟旋转一周(手动很难做到刚刚好的1圈),encoder_Counter = 4040(Encoder Mode TI1 与 TI2的四倍频模式),编码器是1000线 * 4倍频 = 4000个脉冲。脉冲的方向是:0x01(可以说是CW,也可以说是CCW。这取决于我们项目的定义)
在这里插入图片描述

7.2、用手让步进电机顺时钟旋转约1圈

程序复位后,用手拧着电机的转轴顺时钟旋转一周(手动很难做到刚刚好的1圈),encoder_Counter = -4040(Encoder Mode TI1 与 TI2的四倍频模式),编码器是1000线 * 4倍频 = 4000个脉冲。脉冲的方向是:0x00(可以说是CW也可以说是CCW。但是,如果0x01是CW的话,那么CCW肯定就是CCW)
在这里插入图片描述

八、示波器


最后,我用示波器观察一下电机的B相。步进电机旋转时,B相究竟会输出怎么样的电平。从GIF图看到,脉冲的高电平电压是5V左右。
在这里插入图片描述

九、细节补充


9.1、Encoder Mode

在这里插入图片描述
Encoder Mode一共有三种模式:

1、Encoder Mode TI1

2、Encoder Mode TI2

3、Encoder Mode TI1 and TI2

其实,这三种模式是决定定时器计数的方式,如下图所示:
在这里插入图片描述
通过时序图来理解Encoder Mode TI1 and TI2为什么能将脉冲数4倍频,也解释了TIM是如何判断脉冲的方向。
在这里插入图片描述

  • 27
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
STM32F407ZET6是STMicroelectronics推出的一款基于ARM Cortex-M4内核的32位微控制器。它具有高性能和丰富的外设资源,广泛应用于各种嵌入式系统中。 TIM4是STM32F407ZET6微控制器上的一个定时器模块,它可以用于测量时间、生成定时脉冲等应用。除了定时功能外,TIM4还集成了编码器模式,可以用于读取和解析编码器信号。 编码器是一种用于测量物理量或位置的装置。它通常由一个固定部分和一个旋转部分组成,旋转部分通过旋转来改变物理量或位置。编码器根据旋转部分的变化生成一个脉冲序列,这个脉冲序列可以用来测量旋转时间、计数旋转角度等信息。 在使用STM32F407ZET6的TIM4编码器模式时,我们可以配置TIM4定时器来读取编码器信号。具体步骤如下: 1. 配置GPIO引脚:编码器通常使用两个引脚,一个用于读取脉冲信号(例如PA0引脚),另一个用于读取方向信号(例如PA1引脚)。需要将这两个引脚配置为输入模式,并使能GPIO时钟。 2. 配置TIM4定时器:配置TIM4定时器为编码器模式,设置计数方向(正向递增或递减)、计数模式(四倍计数或正常计数)等参数。 3. 启动TIM4定时器:启动TIM4定时器开始计数。 4. 读取编码器值:通过读取TIM4的计数寄存器,可以得到编码器的当前值。根据TIM4的编码器模式和计数方向,可以计算出旋转的角度或物理量。 总之,使用STM32F407ZET6的TIM4编码器模式可以很方便地读取和解析编码器信号。这为测量物理量、计数旋转角度等应用提供了便利。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值