编码器电机测速


部分参考:https://blog.csdn.net/lzzzzzzm/article/details/119416134
其他参考部分见图片水印

1. 编码器种类及原理

常见的编码器有两种,分别为光电编码器和霍尔编码器

1.1 光电编码器

如图,打孔码盘随电机进行旋转。每当光线穿过圆孔,输出电平就会改变,如此产生方波,测量方波的频率即可测出电机转速

1.2 霍尔编码器

现在的电机基本上都是霍尔编码器

霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和转向

2. 常用测速方法

2.1 倍频技术

霍尔编码器会输出两路方波信号,如果只在通道A的上升沿计数,那就是1倍频;通道A的上升、下降沿计数,那就是2倍频;如果在通道A、B的上升、下降沿计数,那就是4倍频

使用倍频可以最大程度地利用两路信号,提高测速的灵敏度

下面说的三种测速方法只是在软件计算上的区别,硬件上是没有改变的

2.1 M法测速

M法测速(又叫周期测量法)是统计一段时间内的脉冲数,再根据电机转一圈产生的脉冲数来计算转速的测速方法

设转速为n,r/s;测量时间为 T 0 T_0 T0​,s; T 0 T_0 T0​时间内的脉冲数为 M 0 M_0 M0​;电机转一圈产生的脉冲数为C;则转速计算公式为
n = M 0 C T 0 n=\frac{M_0}{CT_0} n=CT0​M0​​
当 M 0 M_0 M0​很大,即转速快时,这个方法测得精度和平稳性都很好,但当 M 0 M_0 M0​很小,速度改变带来的 M 0 M_0 M0​变化很小,即转速慢时算出的误差就很大。所以M法测速适用于高转速场景

2.2 T法测速

T法测速(又叫频率测量法)是这样操作的:是指先建立一个频率已知且固定的高频脉冲,当编码器读到一个信号,开始对高频脉冲进行计数,编码器第二个信号到来后,停止计数。根据对高频脉冲计数的次数、高频脉冲频率和电机转一圈编码器产生的脉冲数进行速度计算

设转速为n,r/s;两个脉冲的时间间隔为 T E T_E TE​,s;电机转一圈产生的脉冲数为C; F 0 F_0 F0​为编码器输出脉冲的频率,Hz; M 1 M_1 M1​为高频脉冲的计数值,则转速计算公式为

n = 1 C T E = F 0 C M 1 n=\frac{1}{CT_E}=\frac{F_0}{CM_1} n=CTE​1​=CM1​F0​​
其中 T E T_E TE​、 M 1 M_1 M1​, F 0 F_0 F0​有如下关系
T E = M 1 F 0 T_E=\frac{M_1}{F_0} TE​=F0​M1​​
理解: C T E CT_E CTE​为当前速度下电机转一圈需要的时间,1圈除以1圈所需要的时间即可得到转速

当 T E T_E TE​很大即转速很慢时,T法测速有较高的精度和平稳度,但当 T E T_E TE​很小,即转速很快时,速度改变带来的 T E T_E TE​变化很小,算出的误差就很大。所以T法测速适用于低转速场景

2.3 M/T法测速

M/T法综合了M法和T法的优势,计算公式如下

n = F 0 M 0 C M 1 n=\frac{F_0M_0}{CM_1} n=CM1​F0​M0​​

理解:公式中只有 M 0 M_0 M0​( T 0 T_0 T0​时间内的脉冲数)、 M 1 M_1 M1​(高频脉冲的计数值)为变量。当转速快时, M 1 M_1 M1​变小, M 0 M_0 M0​变大,相当于M法;当转速慢时, M 1 M_1 M1​变大, M 0 M_0 M0​变小,相当于T法。

3. STM32实现编码器测速

3.1 CubeMax配置

为了进行测速,我们一共需要3个定时器,作用分别是:①输出PWM控制电机;②编码器输入进行测速;③计时,确定每次测速的时间间隔

具体配置如下:

TIM2:编码器输入定时器

这里开启了两个通道计数,就是上文倍频技术的4倍频

编码器模式下的定时器其实是个计数器,在编码器的脉冲到来时,Counter会相应地加和减,正转时加,反转时减,溢出后到达另一个极端值,比如说向上计数到达20001时会变成0

TIM3:PWM输出定时器

设置初始PWM频率为100Hz

TIM4:计时间隔定时器

设定为10Hz即1秒计算10次速度

最后要开启中断,并保证编码器定时器的中断优先级高于计时间隔定时器的中断优先级,避免编码器输入被间隔计时中断

其他基础配置不再赘述

3.2 接线

编码器电机、电机驱动(这里用的L298n)、STM32、电源(可以是12V电池)的接线如下

编码器电机 电机驱动 STM32 电机驱动供电
VM VCC
VDD PWM1 PA6
VSS PWM2 PA7
3V3 3V3
GND GND GND GND
编码器通道1 PA0
编码器通道2 PA1

3.3 代码编写

encoder.h中的内容

#ifndef _ENCODER_H_#define _ENCODER_H_#include "stm32f1xx.h"//电机1的编码器输入引脚#define MOTO1_ENCODER1_PORT GPIOA#define MOTO1_ENCODER1_PIN  GPIO_PIN_0#define MOTO1_ENCODER2_PORT GPIOA#define MOTO1_ENCODER2_PIN  GPIO_PIN_1//定时器号#define ENCODER_TIM htim2#define PWM_TIM     htim3#define GAP_TIM     htim4#define MOTOR_SPEED_RERATIO 45u    //电机减速比#define PULSE_PRE_ROUND 11 //一圈多少个脉冲#define RADIUS_OF_TYRE 34 //轮胎半径,单位毫米#define LINE_SPEED_C RADIUS_OF_TYRE * 2 * 3.14#define RELOADVALUE __HAL_TIM_GetAutoreload(&ENCODER_TIM)    //获取自动装载值,本例中为20000#define COUNTERNUM __HAL_TIM_GetCounter(&ENCODER_TIM)        //获取编码器定时器中的计数值typedef struct _Motor{int32_t lastCount;   //上一次计数值int32_t totalCount;  //总计数值int16_t overflowNum; //溢出次数float speed;         //电机转速uint8_t direct;      //旋转方向}Motor;#endif

encoder.c中的内容

#include "encoder.h"Motor motor1;void Motor_Init(void){HAL_TIM_Encoder_Start(&ENCODER_TIM, TIM_CHANNEL_ALL);      //开启编码器定时器__HAL_TIM_ENABLE_IT(&ENCODER_TIM,TIM_IT_UPDATE);           //开启编码器定时器更新中断,防溢出处理HAL_TIM_Base_Start_IT(&GAP_TIM);                       //开启10ms定时器中断HAL_TIM_PWM_Start(&PWM_TIM, TIM_CHANNEL_2);            //开启PWMHAL_TIM_PWM_Start(&PWM_TIM, TIM_CHANNEL_1);            //开启PWM__HAL_TIM_SET_COUNTER(&ENCODER_TIM, 10000);                //编码器定时器初始值设定为10000motor1.lastCount = 0;                                   //结构体内容初始化motor1.totalCount = 0;motor1.overflowNum = 0;                                  motor1.speed = 0;motor1.direct = 0;}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器回调函数,用于计算速度{if(htim->Instance==ENCODER_TIM.Instance)//编码器输入定时器溢出中断                    {      if(COUNTERNUM < 10000) motor1.overflowNum++;       //如果是向上溢出else if(COUNTERNUM >= 10000) motor1.overflowNum--; //如果是向下溢出__HAL_TIM_SetCounter(&ENCODER_TIM, 10000);             //重新设定初始值}else if(htim->Instance==GAP_TIM.Instance)//间隔定时器中断,是时候计算速度了{motor1.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM);//如果向上计数(正转),返回值为0,否则返回值为1motor1.totalCount = COUNTERNUM + motor1.overflowNum * RELOADVALUE;//一个周期内的总计数值等于目前计数值加上溢出的计数值motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10;//算得每秒多少转//motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10 * LINE_SPEED_C//算得车轮线速度每秒多少毫米motor1.lastCount = motor1.totalCount; //记录这一次的计数值}}

这里用的是4倍频的M法测速,如果想使用T法测速,则需要对算法进行更改,以后再写吧

3.4 结果

现在将测得的速度值输出到串口,就可以看到电机的实时转速了

STM32 CubeMax 编码器电机测速 原理与实现相关推荐

  1. stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速. 编码器被广泛应用于电机测速,实现电机闭环控制.所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速. 一.参数 编码电机其实就是一个带有编码 ...

  2. STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机

    文章目录 1.L298N电机驱动 1.1 产品参数 1.2 实物图和接线 2.编码器 2.1 编码器简介 2.2 常用编码器分类 2.3 霍尔编码器实物图接线!!!! 2.4 编码器倍频原理 3.控制 ...

  3. STM32之增量式编码器电机测速

    STM32之增量式编码器电机测速 编码器 编码器种类 按监测原理分类 光电编码器 霍尔编码器 按输出信号分类 增量式编码器 绝对式编码器 编码器参数 分辨率 精度 最大响应频率 信号输出形式 编码器倍 ...

  4. STM32C8T6编码器电机测速与arduino光电模块测速

    文章目录 前言 一.STM32编码器测速 定时器配置 配置四倍频 二.arduino光电测速 前言 前面也是只学习了四倍频测速的原理,并没有真正实验过,今天正好看到编码器电机了,就尝试一下 一.STM ...

  5. 51单片机电机测速程序c语言,单片机仿真编码器电机测速程序

    /***********头文件声明************/ #include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器 /***********数据类型声明 ...

  6. 平衡小车—编码器使用教程与测速原理

    文章目录 1.编码器概述 2.编码器原理 3.编码器接线说明 4.编码器软件四倍频技术 5.单片机如何采集编码器数据 6.获取方式 来自平衡小车之家,与大家一起学习编码器使用与测速原理. 1.编码器概 ...

  7. 编码器测速原理与实现

    目录: 一.测速原理 二.CubeMX配置编码器模式 三.利用外部中断采集脉冲 一.测速原理 通常情况下编码器旋转一周会输出固定的脉冲数,即编码器的分辨率,通过测量固定时间T内编码器输出的脉冲数即可求 ...

  8. linux直流电机测试,带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)...

    查看: 14294|回复: 83 带霍尔传感器编码器的直流减速电机测速原理讲解(附源码) 高级会员, 积分 891, 距离下一级还需 109 积分 积分金钱891 注册时间2019-4-22 在线时间 ...

  9. STM32定时器捕获编码器模式测速和方向测不准问题

    ** STM32定时器捕获编码器模式测速和方向测不准问题 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮 ...

最新文章

  1. CentOS firewall添加开放端口
  2. 64位LINUX下hadoop2.2.0重新编译及安装步骤
  3. 使用Nginx代理和转发Websocket连接
  4. jquery中attr和prop的区别分析
  5. 基于设备树的TQ2440的中断(2)
  6. 管理感情:工作犯错了,不要狡辩,不要把错误推到别人身上
  7. opencv codebook背景减除
  8. 使用wireshark进行安卓抓包分析
  9. 【vn.py】SpreadTrading价差交易
  10. DotNetTools Workflow教程
  11. echarts中月份数据缺少怎么补齐呢?
  12. linux 内核模块 编写例子,LINUX内核模块编程8
  13. SQL数据库管理—DBCC数据库修复
  14. 两万字,清华刘云浩教授回答新生关于AI的90个问题
  15. Linux非常牛逼的命令
  16. 【IT情感】久坐易死,IT人员您知道吗
  17. VIM实用指南(3)复制,粘贴 ,删除,撤销,重做指令速记
  18. 视频管理软件技术分析报告(二)--商业VMS产品分析(Milestone)
  19. python中英文混输对不齐_python中英文混合字符串对齐输出
  20. imx6ull用C语言实现按键点灯代码

热门文章

  1. 机器学习-3.数据特征预处理与数据降维
  2. Linux下SPI驱动详解(干货)
  3. 【Pygame实战】变异狗大战:据说是最近还不错的小游戏,这一个个玩到表情崩坏,点开即玩,赶紧来~(Python代码搞笑版本)
  4. python基础教程:python怎么换行写代码
  5. 托福考试可以用临时身份证吗?
  6. JAVA注解--原理理解,(借用他人资料举例,一通百通)
  7. 从宝洁到腾讯:我的职场转型四部曲
  8. 全站最详细OpenCV AI开发套件OAK(OpenCV AI Kit)介绍
  9. 鸿蒙手机真的出来会买吗,如果鸿蒙真的大批采用,你还会买华为手机吗?迟疑的瞬间答案明了!...
  10. PodFest China发布首份《中文播客听众与消费调研》报告