STM32CubeMx配置HAL库编码器测速

news2024/11/22 20:53:06

编码器概述

img

编码器是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系

列电信号。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。编码器按照检测原

理,可以分为光学式、磁式、感应式和电容式。

而我们常见的是光电编码器(光学式)和霍尔编码器(磁式)

下面主要以霍尔编码器的原理及应用为主。

霍尔编码器

原理

image-20230824102110353

霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘(磁环)和霍尔元

件组成。霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。当电动机旋转时,霍尔元件检测输出电压信号,从而得到电动机的转

速和位置信息 。

根据A、B相位信号来测量转速和方向:

  • 转速:单位时间测量到的脉冲数量
  • 旋转方向:A、B之间相位的超前或滞后

实物

通常编码器一般和电机相连在一起,实现电机实际测速

image-20230824112400666

接线

硬件引脚作用
编码器1+PA0TIM2_CH1
编码器1-PA1TIM2_CH2
编码器2+PB6TIM4_CH1
编码器2-PB7TIM4_CH1

STM32编码器模式

STM32单片机自带正交解码函数,采用定时器的编码器模式,所以一个电机需要采用两个定时器通道来采集A、B相信号。

三种计数模式

  • A相计数(TI1计数)
  • B相计数(TI2计数)
  • A相和B相都计数(TI1和TI2都计数)

image-20230824105005435

如图假设以TI1技术,当上升沿或下降沿触发时,看对应的TI2信号,图中的计数方向1为例,此时TI1为上升沿,对应的TI2为低电平,由表中可知TI1FP1信号为上升,相对信号(TI2)为低电平,则为向上计数;计数方向2对应TI1为下降沿,TI2为高电平,为向上计数。依次类推,仅在TI2计数和在TI1、TI2计数原理相同。

  • 仅在TI1计数或仅在TI2计数为——二倍频
  • 在TI1和TI2都计数为——四倍频

计数方向

image-20230824111026698

向上计数0—65535装载值,向下计数65535—0

两种计数测速方法:

①这次编码器计数值 = 计数器值 + 计数器溢出次数 * 计数器最大计数值

计数器两次变化值 = 这次编码器计数值 - 上次编码器计数值

然后根据此变化量计算速度

②计数器变化量 = 当前计数值

每次计数器清零

根据此变化量 计算速度

本次使用方法②来进行测速

STM32CubeMx配置

TIM2->Combined Channels->Encoder Mode

TIM4->Combined Channels->Encoder Mode

!!!STM32编码器模式采用定时器的通道1和通道2

image-20230824112807447

最大装载值设置为65535,编码器模式为Encoder Model TI1 and TI2(TI1和TI2都计数),有需要的也可以适当调节下滤波值Input Fiter

也可以适当打开全局中断,方便查看溢出值

编写代码

主函数main.c

  // 编码器初始化
  short Enc1_cnt = 0;
  short Enc2_cnt = 0;
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
  HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
  // 定时器中断初始化
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_Base_Start_IT(&htim4);
  while (1)
  {
      Enc1_cnt = -(short)__HAL_TIM_GET_COUNTER(&htim2);
      Enc2_cnt = (short)__HAL_TIM_GET_COUNTER(&htim4);
      printf("Enc1_cnt: %d\r\n", Enc1_cnt);
      printf("Enc2_cnt: %d\r\n", Enc2_cnt);
      __HAL_TIM_SET_COUNTER(&htim2, 0);
      __HAL_TIM_SET_COUNTER(&htim4, 0);
      HAL_Delay(10);
  }

编码器测速

image-20230824113610792

image-20230824113729265

根据自己购买的编码器参数,主要看脉冲数减速比,我所用电机型号为驰海电机 GM25-370:

  • 脉冲数为11PPR(编码器线数),
  • 减速比为1:45

即 编码器转一圈计数值 = 脉冲数 * 减速比

又因为我们采用四倍频计数,所以

编码器转一圈计数值 = 脉冲数 * 减速比 * 4

再考虑到延时函数,将速度单位设置在m/s,需要再速度乘以1s/延时时间

所以 速度 = 计数变化量 / 一圈计数值 = 计数变化量 / 减速比 / 脉冲数 / 4 * 1s/延时时间

Speed = Cnt * 100 /45/ 11/4

可以将程序烧录,把清零程序注释,看看转一圈的计数值是否与自己的计算值对应

则主函数main.c修改为

short Enc1_cnt = 0;
short Enc2_cnt = 0;
float motor1_speed = 0.00;
float motor2_speed = 0.00;
//..................
int main(void)
{
  //..............................
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
  HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_Base_Start_IT(&htim4);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      Enc1_cnt = -(short)__HAL_TIM_GET_COUNTER(&htim2);
      Enc2_cnt = (short)__HAL_TIM_GET_COUNTER(&htim4);
      
      motor1_speed = (float)Enc1_cnt*100/45/11/4;
      motor2_speed = (float)Enc2_cnt*100/45/11/4;
      
      printf("Enc1_cnt: %d\r\n", Enc1_cnt);
      printf("Enc2_cnt: %d\r\n", Enc2_cnt);
      printf("motor1_speed: %.3f\r\n", motor1_speed);
      printf("motor2_speed: %.3f\r\n", motor2_speed);
      __HAL_TIM_SET_COUNTER(&htim2, 0);
      __HAL_TIM_SET_COUNTER(&htim4, 0);
      HAL_Delay(10);
  }
  /* USER CODE END 3 */
}

演示

可以转动电机来观察计数值与速度,正转为正值,反转为负值

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全局ID生成方式

全局ID生成方式 目录 1. 全局唯一id介绍 1.1 特点 2. 常见的全局唯一id生成策略 2.1 利用数据库自增字段生成id2.2 UUID2.3 Redis生成id2.4 zookeeper生成ID2.5 Twitter的snowflake算法 3. 面试题目:实现一个全局的ID生成器,注意线程安全 3.1 单例模式…

【PCL-9】AABB包围盒

当一个物体边与坐标轴平行时&#xff0c;生成的ABB最小外接立方体有偏差&#xff0c;故这里采用AABB算法。 示例代码&#xff1a; #include <pcl/features/moment_of_inertia_estimation.h> #include <vector> #include <pcl/io/pcd_io.h> #include <pc…

在 Pytorch 中使用 TensorBoard

机器学习的训练过程中会产生各类数据&#xff0c;包括 “标量scalar”、“图像image”、“统计图diagram”、“视频video”、“音频audio”、“文本text”、“嵌入Embedding” 等等。为了更好地追踪和分析这些数据&#xff0c;许多可视化工具应运而生&#xff0c;比如之前介绍的…

机器学习十大算法之七——随机森林

0 引言 集成学习&#xff08;ensemble learning&#xff09;是时下非常流行的机器学习算法&#xff0c;它本身不是一个单独的机器学习算法&#xff0c;而是通过在数据上构建多个横型&#xff0c;集成所有模型的建模结果&#xff0c;基本上所有的机器学习领域都可以看到集成学习…

华为OD机试 - 连续字母长度 - 字符串(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明4、再输入5、输出6、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08…

混币器——隐私交易的天堂,还是洗钱犯罪的聚集地?

据美国财政部官网&#xff0c;Tornado Cash 联创 Roman Storm 已被 FBI 和国税局逮捕&#xff0c;罪名是串谋洗钱、串谋经营未经许可的资金传输业务以及串谋违反制裁规定&#xff0c;另一创始人 Roman Semenov仍然在逃。 FBI局长Christopher A. Wray说&#xff1a;“今天的公告…

动物体外受精手术VR模拟仿真培训系统保证学生及标本的安全

奶牛是养殖业主要的资源&#xff0c;因此保证奶牛的健康对养殖业的成功和可持续发展具有重要已用&#xff0c;奶牛有一些常见易发病&#xff0c;一旦处理不当&#xff0c;对奶牛业都会造成较大的经济损失&#xff0c;传统的奶牛手术培训实操难度大、风险高且花费大&#xff0c;…

[管理与领导-43]:IT基层管理者 - 个人管理 - 管理中从角色定位迈步

前言&#xff1a; 管理者的“四位” &#xff1a; ‣ 定位——在什么位置做什么事情&#xff1b; ‣ 到位——全力以赴把事情做好&#xff1b; ‣ 不越位——不要把别人的工作做了&#xff1b; ‣ 补位——同事临时“缺位” &#xff0c;及时补位&#xff0c;提升效率&…

前端(十四)——DOM节点操作手册:你需要了解的一切

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;DOM节点操作手册&#xff1a;你需要了解的一切 文章目录 前言DOM基础知识操作现有节点创建新节点遍历节点树修改节点属性和样式事件处理实践应用动态创建表格动态更新列表 前言 DOM&#xff08;文档…

性能测试工具Jmeter你所不知道的内幕

谈到性能测试&#xff0c;大家一定会联想到Jmeter和LoadRunner,这两款工具目前在国内使用的相当广泛&#xff0c;主要原因是Jmeter是开源免费&#xff0c;LoadRunner 11在现网中存在破解版本。商用型性能测试工具对于中小型企业很难承担相关的费用。国内的性能测试工具有&#…

【Linux】一张图了解系统文件

首先先认识磁盘结构 系统文件分布图 文件查找 文件删除 文件的增删改查都是围绕inode来完成的&#xff0c;所以当我们要进行文件删除的时候&#xff0c;只需要通过inode来获取到它对应的block bitmap和inode bitmap数据块容器和保存文件属性的位置置为 0即可 &#xff0c;如果想…

Visual Studio 2022的MFC框架——WinMain函数

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 大家还记得创建Win32应用程序是怎么弄的吗&#xff1f;Win32应用程序有一条很明确的主线&#xff1a;首先进入WinMain函数&#xff0c…

RK3568 安卓源码编译

一.repo安卓编译工具 项目模块化/组件化之后各模块也作为独立的 Git 仓库从主项目里剥离了出去&#xff0c;各模块各自管理自己的版本。Android源码引用了很多开源项目&#xff0c;每一个子项目都是一个Git仓库&#xff0c;每个Git仓库都有很多分支版本&#xff0c;为了方便统…

一种特殊的NC文件转TIF——知道每个像元的坐标值怎么转为TIF

之前写过一篇文章&#xff0c;介绍了NetCDF文件格式&#xff0c;并详细讲解了如何使用Python对NetCDF文件进行读写操作&#xff0c;进而介绍了NetCDF文件的地理参考&#xff0c;最后以两个数据为例讲解了怎么将NetCDF格式的数据转GeoTIFF格式的数据。 但是上次介绍的NC文件的地…

1212页Kubernetes学习指南,几乎涵盖所有K8S核心技术点,建议收藏!

Kubernetes&#xff08;简称K8S&#xff09;是一个开源的容器编排平台&#xff0c;主要用于自动化部署、扩展和管理容器化应用程序。由于K8S在容器编排方面的优势&#xff0c;它已经成为了现代化应用程序部署和管理的事实标准 因此&#xff0c;对于运维人员来说&#xff0c;学…

数电票红利悄然而至 百望云数据驱引“供应链协同”新纪元

2023年&#xff0c;全面数字化的电子发票政策正如飞驰的列车在各地试点推广中加速前行&#xff0c;“以数治税”的全新时代即将来临&#xff0c;基于数电票赋能的企业数字化红利正在悄然释放。借着政策快速落地的东风&#xff0c;财税数字化也进入到全面建设的新周期&#xff0…

打造B2B2C商城系统成功的关键要素有哪些?

电子商务的蓬勃发展&#xff0c;B2B2C商城系统成为了越来越多企业的选择。然而&#xff0c;在激烈的市场竞争中&#xff0c;要想打造一款成功的B2B2C商城系统并不容易。下面就B2B2C商城系统成功的关键要素作一些简单介绍&#xff0c;希望对大家有帮助(仅供参考)。 一、整合供应…

VIT 论文精读 | transformer架构引入CV的开创性工作

目录 1. 背景 2. 方法 2.1 怎么把2D图像变成1D序列输入到transformer中 像素&#xff1f; 先提取特征图&#xff1f; 打成多个patch 2.2 transformer和卷积网络比较 2.3 结构 1. 背景 VIT是基于transformer的在图像分类大放异彩的变体&#xff0c;transformer是VIT的亲…

LeetCode面试经典150题(day 2)

26. 删除有序数组中的重复项 难度:简单 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

【LeetCode-中等题】56. 合并区间

题目 题解一&#xff1a;排序 思路&#xff1a; 1、对数组按第一个元素大小进行排序&#xff0c;使得数组按大小连续排列 2、先将第一个数组提前放入list集合&#xff0c;因为肯定是从第一个开始算起的 3、接着对下一个数组的左边界和list集合最后一个元素的右边界对比&#x…