由于最近干活遇到需要获取正交编码的功能,所以返回来研究一下STM32CubeMX的编码器功能,之前也更新过STM32的定时器功能,但是因为之前搞平衡车的正交编码器没有搞清楚原理,就直接用了脉冲输入功能草草了事,现在也算是为之前的年轻买单了,不过看到现有的Encoder说明都比较简单,所以就当是为开发者做贡献了,我研究清楚之后来一篇博客。
书归正传,正交编码器通常是安装在电机上的,与电机转子的主轴同轴,有一些是通过主轴连接减速或加速齿轮组再接入编码器的,编码器一般有光栅编码器和磁极编码器两种,正转反转输出的脉冲都是下图这个样子

STM32本身带有处理正交脉冲的功能,也就是定时器中的Encoder模式
具体操作:

STM32CubeMX配置

1.打开STM32CubeMX,选择自己使用的芯片,此处我以STM32F429IGT6为例进行;

2.设置系统、时钟基本操作

SYS

RCC

3.定时器设置

此处我选用的是TIM3,TIM3位通用定时器,一般芯片通用定时器比较多
Combined Channels采用Encoder Mode(编码器模式)
选用此模式后TIM3的CH1和CH2就变为编码器接口了,记住对应的两个接口,之后要把编码器信号接到这两个口上,我的是PA6和PA7

下方参数设定根据需求进行设定,由于我需要记录编码器的上升沿和下降沿,所以此处选择的是Encoder Mode TI1 and TI2,这个模式将AB两组脉冲的上升下降沿都计数了,就是计数4次,不需要那么精确的同学可以把预分频系数(Prescaler)修改为4-1,那么脉冲检测到4个脉冲就会计数1次了,滤波器看个人,我用杜邦线直连的,距离10cm不到所以我设的是0,具体怎么选可以看STM32中文参考手册,懒人看下面的图

4.串口设置

为了方便观察,需要通过串口发送对应的旋转方向,旋转计数值到串口调试助手。
由于芯片只用于发送数据,就不搞中断了,直接选择异步串口即可

5.最后配置时钟树

这个大家自行处理,每块芯片都不同,最终让中间HCLK(MHz)为72即可

6.项目配置

我用的开发环境是Keil5,所以在Toolchain/IDE中选择了MDK-ARM


代码生成的时候把Generated files中的第一项选中,不然h文件和c文件混着,看着都难受

7.点击右上角GENERATE CODE生成代码即可

代码修改

1.串口代码修改

为了方便,用printf函数输出信息,所以需要在串口的/* USER CODE BEGIN 0 */后添加串口重定向函数,如下所示:

/* USER CODE BEGIN 0 */
#include <stdio.h>
struct __FILE
{ int handle;
};
FILE __stdout;
void _sys_exit(int x)
{ x = x;
}
int fputc(int ch, FILE *f)
{   while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR=(uint8_t)ch;      return ch;
}/* USER CODE END 0 */

2.main.c修改

首先要添加stdio.h的包含,方便后面用printf输出
在main.c的/* USER CODE BEGIN Includes */后添加如下代码:

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

之后需要几个变量,分别为

变量名 变量用途
Direction 编码器转动方向
counter 主函数计数,用于printf函数的定时段发送
enc1 编码器计数(0~65535)
enc1_old 上一次的编码器计数值(0~65535)
enc2 enc1的进位
enc 最终的编码器计数值

定义变量,在/* USER CODE BEGIN 1 */后添加如下代码

/* USER CODE BEGIN 1 */uint8_t Direction;uint16_t counter;uint16_t enc1 = 0,enc1_old = 0;int16_t enc2 = 0;int32_t enc;/* USER CODE END 1 */

启动编码器解释,在/* USER CODE BEGIN 2 */后添加编码器启动函数

/* USER CODE BEGIN 2 */HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
/* USER CODE END 2 */

在循环中,也就是/* USER CODE BEGIN 3 */后添加读取编码器数值函数以及进位处理函数和打印输出函数:

/* USER CODE BEGIN 3 */Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);  enc1 = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim3));  //获取定时器的值if((Direction == 0) &(enc1 < enc1_old))               //正向旋转数值变小,说明进位{enc2++;}if((Direction == 1) &(enc1 > enc1_old))              //反向旋转数值变小,说明借位{enc2--;}enc1_old = enc1;                                   //更新enc1_old,便于下次计算enc = enc2<<16 | enc1;                             //计算当前计数总值,带+-号counter++;                                         //主函数计数if(counter>1000)                                  //主函数每次运行约1ms,此处用于每1000ms发送一次数{counter = 0;                                 //计数值清零printf("Dir %d, Enc2 %d, Enc1 %d, ENC %d\r\n",Direction,enc2,enc1,enc);//打印相关计数数据}HAL_Delay(1);}/* USER CODE END 3 */

此时代码已经完全修改完成,编译下载到芯片内,等待接线测试

接线测试

我用的编码器是5v供电的一款磁极编码器,但最终接口都应该是VCC、GND、A、B四个接口,此时按如下方式连接

编码器 STM32
A TIM3_CH1
B TIM3_CH2
VCC 5V电平
GND 与STM32共地

接好之后就可以上电,打开串口调试助手,连接上串口1
就会收到如下数据,此时转动编码器就可以看到数值的改变

至此,编码器功能已完成。

       Good Game!!!!!!接下来会推出一系列的关于串口使用的分享,有需要的猿们敬请关注!!!!!

以上内容欢迎大家转载引用,标明出处即可!!!!!

STM32CubeMX的正交编码器encoder相关推荐

  1. STM32CubeMX学习——旋转编码器模块

    前言 雨打灯难灭,风吹色更明. 若飞天上去,定作月边星.--李白<咏萤火> 一.旋转编码器介绍 旋转编码器是一种可以左右旋转,同时也可以按下,也可以按下旋转的器件,通过左右旋转对应着内部不 ...

  2. CSR8675的学习笔记:驱动正交编码器

    为了方便大家学习,现与我爱蓝牙网联合推出[QCC300x/CSR867x/QCC30xx/QCC51xx开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单 ...

  3. STM32正交编码器接口

    STM32四路正交编码器接口 一.主要内容 芯片型号.使用引脚及初始化程序源码 TIM2端口重映射问题 与JTAG接口冲突时的现象及解决方法 二.芯片型号.使用引脚及初始化程序源码 芯片型号:STM3 ...

  4. STM32定时器---正交编码器模式详解

    编码器分类: 按工作原理:光电式.磁电式和触点电刷式 按码盘的刻孔方式:增量式和绝对式两类 由于博主接触面还不是很广,一共就用过两个种类的编码器,都是属于光电的 差分编码器:一般由8根线连接 信号线分 ...

  5. 使用stm32 定时器TIM3 的重映射引脚 捕获正交编码器数据的一些积累

    关注+星标公众号,及时获取更多技术分享~  作者 | 冰茶奥利奥 微信公众号 | 嵌入式电子创客街 因为我们公司的软件和硬件是分开的,硬件人员在设计电路板的时候,为了布线方便,往往会使用一些引脚的重映 ...

  6. STM32正交编码器测速

    一.正交编码解码原理 参考链接:https://blog.csdn.net/as480133937/article/details/98750922 二.解码思路 (1)方法一:使用定时器的输入捕获功 ...

  7. 正交编码器单端转差分

    现在手头上有一个Autonics的增量式正交编码器(型号为E40H82048-3-V-24),输出有A.B.Z三相,电压输出12V,当前需要将编码器的信号接到一个差分输入的电机驱动器上(型号为Copl ...

  8. [享学Feign] 五、原生Feign的编码器Encoder、QueryMapEncoder

    士不可不弘毅,任重而道远. 本专栏所有文章均计划逐步重写搬迁至本人公号:Java方向盘,且免费开放!故不再建议下单购买,可关注我公号前往免费学习.交流 –> 返回Netflix OSS套件专栏汇 ...

  9. STM32CubeMX EC11旋转编码器开发心路历程(encode模式 外部中断模式 普通IO口模式 定时器模式探索)

    文章目录 ENCODE模式探索 普通IO口探索 定时器使用 外部中断探索 编码器开关的理解 最后的实现方案 这篇文章主要还是记录整个过程以及想法的不断改进,对于一些实际的操作还有代码,我准备都分开写到 ...

最新文章

  1. MySQL获取Schema表名和字段信息
  2. 百田公司:与神策数据携手,筑就爆款游戏背后的 4 个数据砝码
  3. 几个环境变量说明:ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAMES
  4. android dimensions.xml,android – Value等于match_parent或fill_parent在dimensions.xml?
  5. Java EE的三层架构
  6. Git - 版本控制工具十分钟入门手册
  7. 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
  8. Java集合之LinkedHashMap源码分析
  9. linux java no x11_在linux下运行javaMail程序报No X11 DISPLAY variable was...
  10. 20200410:路径总和 Ⅰ Ⅱ(leetcode112 /113)
  11. 51nod 1218 最长递增子序列 V2(dp + 思维)
  12. stata面板数据gmm回归_12短动态面板数据模型1-差分GMM估计-Stata软件操作教程
  13. Linux-基础部分
  14. DIY回音壁多媒体音箱
  15. [SPRD CAMERA] 5 HAL Camera open流程二
  16. 【哪吒社区Java技能树 打卡day2】Java学习路线总结(思维导图篇)
  17. ubuntu12.04 显卡 散热
  18. 炉石android更新日志,炉石传说新版本一览_炉石传说更新内容
  19. Linux的Matlab使用
  20. clusterProfiler R package

热门文章

  1. python中pivot函数用法_python中pivot()函数基础知识点
  2. 2015071103 - 忘记带火车票
  3. 网络连接状态断开服务器无响应,已断开(服务器无响应),路由器连不上网什么原因...
  4. 同样是保存模型,model.save()和model. save_weights ()有何区别
  5. 从7个方面看人工智能的失败
  6. OA系统选型:明确需求是捷径
  7. 曙光服务器怎么进入bios_曙光服务器安装手册
  8. PMP认证与NPDP认证哪个含金量高?
  9. 如何用Python编程实现算术割圆术?
  10. flarum使用随机头像