当前位置:网站首页>STM32CubeMX的正交编码器encoder
STM32CubeMX的正交编码器encoder
2022-07-20 05:33:00 【ASWaterbenben】
由于最近干活遇到需要获取正交编码的功能,所以返回来研究一下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!!!!!!
接下来会推出一系列的关于串口使用的分享,有需要的猿们敬请关注!!!!!
以上内容欢迎大家转载引用,标明出处即可!!!!!
边栏推荐
- Endnote x9 import journal reference format of paper submission
- Understand the seperable revolution
- 直观理解Transpose Convolution
- Realization of data warehouse technology
- Load different plist files according to different configurations
- Package (.Py) files into (.Exe) files in pychart
- [cann training camp] essays on the realization of GaN based on Shengsi
- Basic architecture of data warehouse -- layered functions
- There is a lot of garbage on wechat on the computer side that can be cleaned up
- MIMO-OFDM Wireless Communication Technology and matlab implementation (2) - Outdoor channel model under SISO
猜你喜欢
论文学习---Resource allocation in EE URLLC in Relay System
微分与梯度的概念理解
理解原始Gan Loss 和 Hinge Gan Loss
点云SSD模型
论文学习--Resource allocation for multi-user downlink MISO OFDMA-URLLC systems
基于华为自研NPU Ascend 910的TensorFlow 1.x训练脚本迁移和使能混合精度记录
Flink datastream API (I) execution environment
【2022年第一期 CANN训练营进阶班应用课】附加题——媒体数据处理+模型推理
【CANN训练营】CANN训练营_昇腾AI趣味应用实现AI趣味应用(上)随笔
Endnote x9 import journal reference format of paper submission
随机推荐
Flink SQL implements the data processing of Kafka and writes it to tidb
(8) Pytorch deep learning: convolutional neural network (basic) -- change (VII) fully connected neural network into convolutional neural network
Understanding the concept of differentiation and gradient
2D目标检测综述之提议生成和特征表示篇(三)
Li Hongyi machine learning 2020---p12 brief introduction of DL & p15 why DL
直观理解Transpose Convolution
Qcombobox in pyqt5 realizes multi selection function
Swift archiving serialization
C语言内存对齐规则及计算公式详解
Realization of data warehouse technology
Analyze the relationship between iteration, epoch and batchsize
YOLO 目标检测 识别框不显示文字标签(已解决)
Task scheduling: common types and tools
论文学习---Resource allocation and beamforming desing in the short blocklength regime for URLLC
Find a number between two Fibonacci series
【CANN訓練營】基於昇思的GAN實現隨筆
The meaning of coordinates in qlineargradius
通俗理解深度学习梯度累加(Gradient Accumulation)的原理
List element addition
[camp d'entraînement can] essai de mise en œuvre du Gan basé sur Shengsi