STM32CubeMX的正交编码器encoder
由于最近干活遇到需要获取正交编码的功能,所以返回来研究一下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相关推荐
- STM32CubeMX学习——旋转编码器模块
前言 雨打灯难灭,风吹色更明. 若飞天上去,定作月边星.--李白<咏萤火> 一.旋转编码器介绍 旋转编码器是一种可以左右旋转,同时也可以按下,也可以按下旋转的器件,通过左右旋转对应着内部不 ...
- CSR8675的学习笔记:驱动正交编码器
为了方便大家学习,现与我爱蓝牙网联合推出[QCC300x/CSR867x/QCC30xx/QCC51xx开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单 ...
- STM32正交编码器接口
STM32四路正交编码器接口 一.主要内容 芯片型号.使用引脚及初始化程序源码 TIM2端口重映射问题 与JTAG接口冲突时的现象及解决方法 二.芯片型号.使用引脚及初始化程序源码 芯片型号:STM3 ...
- STM32定时器---正交编码器模式详解
编码器分类: 按工作原理:光电式.磁电式和触点电刷式 按码盘的刻孔方式:增量式和绝对式两类 由于博主接触面还不是很广,一共就用过两个种类的编码器,都是属于光电的 差分编码器:一般由8根线连接 信号线分 ...
- 使用stm32 定时器TIM3 的重映射引脚 捕获正交编码器数据的一些积累
关注+星标公众号,及时获取更多技术分享~ 作者 | 冰茶奥利奥 微信公众号 | 嵌入式电子创客街 因为我们公司的软件和硬件是分开的,硬件人员在设计电路板的时候,为了布线方便,往往会使用一些引脚的重映 ...
- STM32正交编码器测速
一.正交编码解码原理 参考链接:https://blog.csdn.net/as480133937/article/details/98750922 二.解码思路 (1)方法一:使用定时器的输入捕获功 ...
- 正交编码器单端转差分
现在手头上有一个Autonics的增量式正交编码器(型号为E40H82048-3-V-24),输出有A.B.Z三相,电压输出12V,当前需要将编码器的信号接到一个差分输入的电机驱动器上(型号为Copl ...
- [享学Feign] 五、原生Feign的编码器Encoder、QueryMapEncoder
士不可不弘毅,任重而道远. 本专栏所有文章均计划逐步重写搬迁至本人公号:Java方向盘,且免费开放!故不再建议下单购买,可关注我公号前往免费学习.交流 –> 返回Netflix OSS套件专栏汇 ...
- STM32CubeMX EC11旋转编码器开发心路历程(encode模式 外部中断模式 普通IO口模式 定时器模式探索)
文章目录 ENCODE模式探索 普通IO口探索 定时器使用 外部中断探索 编码器开关的理解 最后的实现方案 这篇文章主要还是记录整个过程以及想法的不断改进,对于一些实际的操作还有代码,我准备都分开写到 ...
最新文章
- MySQL获取Schema表名和字段信息
- 百田公司:与神策数据携手,筑就爆款游戏背后的 4 个数据砝码
- 几个环境变量说明:ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAMES
- android dimensions.xml,android – Value等于match_parent或fill_parent在dimensions.xml?
- Java EE的三层架构
- Git - 版本控制工具十分钟入门手册
- 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
- Java集合之LinkedHashMap源码分析
- linux java no x11_在linux下运行javaMail程序报No X11 DISPLAY variable was...
- 20200410:路径总和 Ⅰ Ⅱ(leetcode112 /113)
- 51nod 1218 最长递增子序列 V2(dp + 思维)
- stata面板数据gmm回归_12短动态面板数据模型1-差分GMM估计-Stata软件操作教程
- Linux-基础部分
- DIY回音壁多媒体音箱
- [SPRD CAMERA] 5 HAL Camera open流程二
- 【哪吒社区Java技能树 打卡day2】Java学习路线总结(思维导图篇)
- ubuntu12.04 显卡 散热
- 炉石android更新日志,炉石传说新版本一览_炉石传说更新内容
- Linux的Matlab使用
- clusterProfiler R package
热门文章
- python中pivot函数用法_python中pivot()函数基础知识点
- 2015071103 - 忘记带火车票
- 网络连接状态断开服务器无响应,已断开(服务器无响应),路由器连不上网什么原因...
- 同样是保存模型,model.save()和model. save_weights ()有何区别
- 从7个方面看人工智能的失败
- OA系统选型:明确需求是捷径
- 曙光服务器怎么进入bios_曙光服务器安装手册
- PMP认证与NPDP认证哪个含金量高?
- 如何用Python编程实现算术割圆术?
- flarum使用随机头像