编码器测速原理与实现
目录:
- 一、测速原理
- 二、CubeMX配置编码器模式
- 三、利用外部中断采集脉冲
一、测速原理
通常情况下编码器旋转一周会输出固定的脉冲数,即编码器的分辨率,通过测量固定时间T内编码器输出的脉冲数即可求得电机的转速。
假设编码器的分辨率为P,T时间内测得脉冲数m个,则单倍频(编码器转动一圈输出的脉冲数与分辨率相同)情况下电机转速为:
(其中m/p为编码器转过的圈数,再除以时间即为转速)
编码器AB相输出两列相位差为90°的方波,当A相超前于B相90°时为正转,相反,B相超前于A相90°时为反转
为了提高采样精度,利用软件实现四倍频,即将编码器的分辨率提高4倍。原理图如上,一个小周期内AB两相分别各有一个上升沿和下降沿,只需要在AB两相的每个上升沿、下降沿进行采集,这样就实现了四倍频技术,即如果编码器分辨率为p,则现在编码器转动一圈就可以采集到4p个脉冲
二、CubeMX配置编码器模式
stm32的部分定时器有编码器模式,可以直接利用该功能采集编码器脉冲数
先配置串口,方便后期打印采集的数据
我这里采用定时器4做测速,选择编码器模式,Encoder Mode选择Encoder Mode T1 and T2,这个模式下将在AB相的上升沿和下降沿进行脉冲技术,即四倍频
配置一定时器用于定时读取和清空脉冲数,此处设置每500ms读取一次
打开定时器全局中断
配置时钟
打开创建好的工程,在主函数中启动编码器脉冲采集和定时器中断
重定向
定时器中断服务函数中读取采集到的脉冲数,TIM2的计数值为0-65535,采用short int类型对其强制类型转换,若TIM2计数器值为0 ~ 32767,则强制转化后的值仍为0 ~ 32767,电机正转;
若TIM2计数器值为32768 ~ 65535,则强制转化后的值仍为-32768 ~ -1,电机反转;使用一阶滤波减小误差,每次采集的脉冲数保存至new_capturenumber,编码器转动一圈输出4096个脉冲,则new_capturenumber/4096为编码器转动的圈数,最后除以采集时间500ms就得到了电机转速(r/s)
三、利用外部中断采集脉冲
有些单片机没有编码器功能,如esp32,我们可以利用外部中断对编码器输出脉冲进行计数
设置PE11 PE14的外部中断,上升沿、下降沿均触发
打开全局中断
配置一定时器每500ms读取一次脉冲值
打开定时器全局中断
编码器正反转时,脉冲波形如上图所示,我们可以先定义pulse_num来对脉冲进行计数
当A相下降沿时,若B相为低电平则为反转,pulse_num减一,若B相为高电平则为正转,pulse_num加一
当A相上升沿时,若B相为低电平则为正转,pulse_num加一,若B相为高电平则为反转,pulse_num减一
当B相下降沿时,若A相为低电平则为正转,pulse_num加一,若A相为高电平则为反转,pulse_num减一
当B相上升沿时,若A相为低电平则为反转,pulse_num减一,若A相为高电平则为正转,pulse_num加一
即:
/* USER CODE BEGIN 2 */
int pulse_num=0;
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){//PE11 - A相发生中断if(GPIO_Pin==GPIO_PIN_11){//A相下降沿if(HAL_GPIO_ReadPin(GPIOE,A_phase_Pin)==0){if(HAL_GPIO_ReadPin(GPIOE,B_phase_Pin)==0)pulse_num--;elsepulse_num++;}//A相上升沿else{if(HAL_GPIO_ReadPin(GPIOE,B_phase_Pin)==0)pulse_num++;elsepulse_num--;}
}//PE14 - B相发生中断
else if(GPIO_Pin==GPIO_PIN_14){//B相下降沿if(HAL_GPIO_ReadPin(GPIOE,B_phase_Pin)==0){if(HAL_GPIO_ReadPin(GPIOE,A_phase_Pin)==0)pulse_num++;elsepulse_num--;}//B相上升沿else{if(HAL_GPIO_ReadPin(GPIOE,A_phase_Pin)==0)pulse_num--;elsepulse_num++;}}
}
最后在定时器中断函数中对采集到的脉冲个数处理,注意需要手动清空pulse_num
编码器测速原理与实现相关推荐
- STM32——编码器测速原理及STM32编码器模式
1. 编码器概述 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器,我们可以通过编码器测量到底位移或者速度信息.编码器从输出数据类型上 分,可以分为增量式编码器和绝对式编码器. 从 ...
- 直流有刷电机编码器测速基于STM32F302R8+X-NUCLEO-IHM07M1
文章目录 前言 一.编码器测速原理 二.STM32F302R8+X-NUCLEO-IHM07M1直流电机编码器测速 2.1.功能需求 2.2.硬件设计 2.3.软件设计 2.3.1.底层配置 2.3. ...
- 【一文读懂】如何用编码器测速
文章目录 前言 一.AB相编码器计数原理 四倍频 二.要用到的一些参数 编码器参数 电机参数 轮子参数 计算 三.代码如下(更契合原理的代码) 四倍频的代码(更新) 前言 详解编码器测速原理及实现 参 ...
- STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机
文章目录 1.L298N电机驱动 1.1 产品参数 1.2 实物图和接线 2.编码器 2.1 编码器简介 2.2 常用编码器分类 2.3 霍尔编码器实物图接线!!!! 2.4 编码器倍频原理 3.控制 ...
- 平衡小车—编码器使用教程与测速原理
文章目录 1.编码器概述 2.编码器原理 3.编码器接线说明 4.编码器软件四倍频技术 5.单片机如何采集编码器数据 6.获取方式 来自平衡小车之家,与大家一起学习编码器使用与测速原理. 1.编码器概 ...
- linux直流电机测试,带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)...
查看: 14294|回复: 83 带霍尔传感器编码器的直流减速电机测速原理讲解(附源码) 高级会员, 积分 891, 距离下一级还需 109 积分 积分金钱891 注册时间2019-4-22 在线时间 ...
- STM32 CubeMax 编码器电机测速 原理与实现
编码器电机测速 部分参考:https://blog.csdn.net/lzzzzzzm/article/details/119416134 其他参考部分见图片水印 1. 编码器种类及原理 常见的编码器 ...
- 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc
课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...
- 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
基于51单片机光电编码器测速 PAGE PAGE 2 课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器 ...
最新文章
- Python,Opencv cv2.Canny()边缘检测
- 除夕快乐 | 2月11日 星期四 | B站发文回应热搜风波;美团上线“团好货”独立App;国内首家自动驾驶企业获网约车运营许可...
- 基于HOG特征的Adaboost行人检测
- php 当前linux用户权限,Linux 下用户组别权限的理解
- TF2.0-tf.keras.layers.Concatenate
- python学习(三)
- jQuery学习笔记:文档处理
- java同步器有哪些_Java 队列同步器 AQS
- 数学建模——确定性数学方法
- 使用spack mirror简化离线环境的包安装
- November Matrix的算力革命之路
- [词性] 四、形容词
- 招聘时最看重应聘者的什么特质?
- UIkit框架之轮播特效
- 【转载】分页插件中关于PageInfo
- LQ0187 猜年龄【填空题】
- liunx 查看oracle监听,Linux配置Oracle监听提示异常
- 眼科刀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- xshell 瓷砖排列 /发送输入键到所有会话
- Centos7安装libpcap+libnet+libnids