【一文搞懂】—带霍尔编码器的直流有刷减速电机

文章目录

  • 一、直流有刷电机
  • 二、减速比
  • 三、霍尔编码器
    • 3.1 霍尔编码器
    • 3.2 霍尔编码器测速原理
  • 四、测速程序设计
    • 4.1 跳变沿检测
    • 4.2 计算转速

一、直流有刷电机

宏观上说直流有刷电机由固定部分(定子)和旋转部分(转子)组成。在定子上装有两个励磁的磁极N和S。在其转子部分有电枢铁芯。电枢铁芯上有绕组线圈,线圈的首尾接有两个圆弧形铜片,称为换向片。两个换向片之间互相绝缘。换向片固定在转轴上,换向片与转轴之间也相互绝缘。换向器上固定着一对电刷,电刷与换向器互相接触。绕组线圈通过换向片和电刷与电源连接。下面是直流有刷电机的结构图。

直流有刷电机结构图

电机是怎么转起来的呢?

这时候就要搬出我们高中所学的物理知识了,因为电机能转起来,离不开一个力——安培力

首先复习一下安培力,主要是知道什么是安培力以及如何判断安培力的方向。通电导线在磁场中受到的作用力叫做安培力。判断安培力的方向我们用到左右定则,什么是左手定则?伸开左手,使拇指与其他四指垂直且在一个平面内,让磁感线从手心流入,四指指向电流方向,大拇指指向的就是安培力方向(即导体受力方向)。

左手定则

有的资料上可能说是洛伦兹力,磁场对运动电荷的作用力称为洛伦兹力,安培力是洛伦兹力的宏观表现。

了解了上面的知识,我们开始正式探讨电机是怎么转起来的。

看上面的电机结构图,如果外部电源上正下负接到电刷两边,那么绕组线圈中的电流方向为顺时针,我们来对绕组线圈做一个受力分析。

绕组线圈电流方向

电流方向垂直于磁场方向的部分是不受安培力作用的,也就是上图的蓝色部分。上图的红色部分中我们用左手定则分析一下受力。根据左手定则,上半部分受到垂直屏幕向内的安培力。下半部分受到垂直屏幕向外的安培力。上下两部分受力相反,这时电机就转起来了。同理,如果改变外部电源的接入方向,改成上负下正,上下两部分受力依旧相反,电机依旧可以转动,只不过转动方向相反。

至此,我们了解了直流有刷电机的转动原理以及如何控制正反转。

二、减速比

首先回答一个问题,为什么要有减速电机?

用简单几个字总结一下,为什么会有减速电机?目的是降低转速,增加扭矩。至于到底是怎么降低转速,增加扭矩,我们继续往后看。

什么是减速比?

用到减速电机我们难免会碰到一个概念——减速比。那么什么叫减速比?首先我们先看一下减速电机内部的结构。

减速电机内部结构图

减速电机内部有两个齿轮,一个是转自连接轴上的齿轮,一个是输出主轴上的齿轮。转子转动N圈,主轴转动一圈,这就实现了降低转速。比如我们常见的1:30减速比的减速电机,就是转子转动30圈,主轴转动一圈。如此一来,就实现了降低转速,增加扭矩的目的。减速比就是小齿轮数比大齿轮数的比值。

扭矩实际可以理解为电机转动的力量。如果我们不使用减速电机,拿一个小马达,我们会发现它转的很快,但是很容易用手捏住制动,力量很小。但是如果是减速电机,我们发现转速比较慢,但是我们需要用比制动小马达更大的力来制动。减速比越大,电机转动的力越大。

举一个更加常见的例子,比如我们的山地车。我们上坡时可以调节变速器,让我们用很轻松的力就能上坡,实际就是上面的原理,我们蹬好多圈,车轮才能转一圈,但是我们用的力小了,如果把我们和变速器看作一个电机,实际也就是扭矩大了。

三、霍尔编码器

3.1 霍尔编码器

什么是编码器?

编码器是把角位移或直线位移转换成电信号的一种装置。

编码器按照工作原理,可以分为增量式编码器和绝对式编码器,绝对式编码器的每一个位置对应一个确定的数字码(二进制数)。增量式编码器就是每转过单位的角度就发出一个脉冲信号。

从编码器检测原理上来分,还可以分为光学式、磁式、感应式、电容式。我们常见的是光电编码器(光学式)和我们要介绍的主角霍尔编码器(磁式)。一般来说光电编码器是霍尔编码器精度的几十倍。

编码器的作用。

了解了什么是编码器,那么我们用编码器有什么实际作用呢?通常我们会使用编码器来检测电机的转速和旋转方向。那我们常用的控制算法PID算法来说,PID算法是为了实现闭环控制,要想实现闭环控制,就需要有一个反馈。我们的编码器测得的转速就可以作为反馈,搭配PID算法,实现转速的闭环控制。

霍尔编码器的工作原理。

其实从上面的介绍就能大概了解到编码器的工作原理。我们这次主要介绍对象是霍尔编码器。霍尔编码器由码盘和霍尔元件组成。霍尔码盘与电机主轴同轴,码盘上等分的分布有多个磁极,电机转动时,霍尔元件会输出若干个脉冲信号,我们正是利用这些脉冲信号实现电机的测速和电机转向的判断。

霍尔编码器的线数。

什么是霍尔编码器的线数?转动一圈我们会产生几个脉冲,取决于编码器的线数。比如我们的霍尔编码器线数为13。那么霍尔编码器的码盘旋转一圈,会产生13个脉冲。

3.2 霍尔编码器测速原理

我们正是通过检测霍尔编码器输出的脉冲信号来测速。通常会有三相输出,A、B和Z。A和B的输出是正交的。Z是用来标记旋转一周的起始位置,我们通常不使用。

A、B相正交方波
如何判断电机转向?

我们通过A相出现脉冲时检测B相电平来判断电机旋转方向。

  • A检测到上升沿脉冲时,B为低电平,正转;
  • A检测到上升沿脉冲时,B为高电平,反转;

如何判断电机转速?

我们通过检测单位时间内产生的脉冲数来确定电机转速。为什么可以这么做?因为电机转动一圈产生的脉冲数是确定的。比如我们有一个减速比为1:30的减速电机,霍尔编码器的线数为13。那么霍尔码盘旋转一圈,产生13个脉冲,霍尔码盘旋转30圈,电机主轴旋转一圈。综上所述,电机主轴旋转一圈会产生13 * 30 = 390个脉冲。注意,这里是只检测A相的上升沿脉冲,电机旋转一圈有390个脉冲。

有的小伙伴可能会疑问,是转一圈A和B一共产生390个脉冲,还是A和B都产生390个脉冲?答案是后者。

接下来我们只需要检测单位时间内A相或者B相输出的脉冲数,就可以计算电机转速了。

四倍频
什么是四倍频?由上面的介绍可知,霍尔编码器输出有A相和B相两条线。我们如果只用A相,检测高电平脉冲数,那么就是上面介绍的那种。如果我们A相和B相都检测,而且不止检测上升沿脉冲,也检测下降沿脉冲,那么此时霍尔码盘旋转一圈会产生四倍于之前的脉冲数。这就是所谓的四倍频。利用四倍频可以提高检测精度。

四、测速程序设计

上面介绍了这么多理论知识,下面我们动手来实现一下利用霍尔编码器,用一个1:30减速比的减速电机,来实现测速。

4.1 跳变沿检测

检测跳变沿可以用两种方法,一种是使用外部中断,另一种是使用定时器的输入捕获功能。这里使用的是外部中断,只检测A相输出的上升沿,因此只需要配置一个引脚的外部中断,来检测上升沿并在中断中进行计数即可。外部中断初始化函数与中断服务函数如下

/**==============================================================================*函数名称:Exit_Init*函数功能:初始化外部中断*输入参数:无*返回值:无*备  注:无*==============================================================================*/
void Exit_Init (void)
{// 定义结构体NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef  EXTI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   // 开启AFIO时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);   //选择GPIO管脚用作外部中断线路// 配置GPIO结构体GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   // 下拉输入GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);//EXTI0 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //EXTI0中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;   //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   //子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能NVIC_Init(&NVIC_InitStructure);	   //根据指定的参数初始化VIC寄存器EXTI_InitStructure.EXTI_Line=EXTI_Line0;   // EXIT0EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;   // 中断EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   // 上升沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE;   // 使能EXTI_Init(&EXTI_InitStructure);
}
/**==============================================================================*函数名称:EXTI0_IRQHandler*函数功能:外部中断0中断服务函数*输入参数:无*返回值:无*备  注:无*==============================================================================*/
u32 gCunt = 0;   // A相上升沿计数变量void EXTI0_IRQHandler(void)
{// 如果EXIT0中断标志位被置1if(EXTI_GetITStatus (EXTI_Line0)==1){gCunt = gCunt + 1;}EXTI_ClearITPendingBit (EXTI_Line0);   // 清除中断标志位
}

4.2 计算转速

知道了怎么检测跳变沿并计数,我们就可以进行下一步,单位时间内读取跳变沿计数值。我们初始化一个定时器来进行时间控制。配置每一秒进入一次中断,读取一次跳变沿计数值,然后计算转速。转速的单位是RPM,也就是转每分。我们用一秒的脉冲计数乘以60,认为是一分钟的脉冲数,以此来计算电机转速。定时器配置函数以及中断服务函数如下

/**==============================================================================*函数名称:TIM2_Iint*函数功能:初始化定时器2*输入参数:per:自动重装载值;psc:预分频系数*返回值:无*备  注:无*==============================================================================*/
void TIM3_Iint (u16 per,u16 psc)
{// 结构体定义TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   // 使能TIM2时钟TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   // 不分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;   // 设置向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);   // 开启定时器中断TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   // 使能更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;   // 定时器中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;   // 抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority =4;   // 子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // IRQ通道使能NVIC_Init(&NVIC_InitStructure);	TIM_Cmd(TIM3,ENABLE);   // 使能定时器	
}// TIM3中断服务函数
// 1s进入一次
u32 gSpeed = 0;   // 转速void TIM3_IRQHandler(void)   // TIM3中断
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)){gSpeed = (gCunt * 60) / (30 * 13);printf ("Speed = %d = RPM\r\n",gSpeed);gCunt = 0;   // 清零上升沿计数变量}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}

该文章会绑定一个资源,资源是通过串口输入占空比,范围是0~999,然后串口会打印电机转速。电机驱动模块使用的是TB6612。关于TB6612,可以查看博主STM32外设系列专栏。

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

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

相关文章

同一份数据,Redis为什么要存两次

Redis作为目前最主流的高性能缓存,里面有很多精妙的设计,其中有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么要这么做呢?这么做会造成同一份数据占用两倍空间吗? …

Reinforcement Learning with Code 【Chapter 7. Temporal-Difference Learning】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

高层金属做power mesh如何避免via stack

随着工艺精进,pr要处理的层次也越来越多,如何选择power plan的层次尤为关键,一方面决定ir drop的大小,影响着芯片的功能,一方面决定绕线资源,影响面积。 选择高层metal做power mesh的关键在于厚金属&#…

局域网内主机ping不通,但是可以调用对方http接口(防火墙阻止了icmp协议)(关闭防火墙或者启用ICMP回显请求(ICMPv4-In))

文章目录 背景可能的原因问题排查及解决 背景 局域网内有一台主机,ping它ping不通,但是可以调用它的http接口,很诡异。。。 可能的原因 可能的原因有以下几种: 防火墙设置:局域网内的主机可能设置了防火墙&#xff…

勘探开发人工智能应用:地震层位解释

1 地震层位解释 层位解释是地震构造解释的重要内容,是根据目标层位的地震反射特征如振幅、相位、形态、连续性、特征组合等信息在地震数据体上进行追踪解释获得地震层位数据的方法。 1.1 地震信号、层位与断层 图1.1 所示为地震信号采集的过程,地面炮…

opencv-21 alpha 通道详解(应用于 图像增强,合成,蒙版,特效 等)

什么是alpha 通道? Alpha通道是计算机图形学中用于表示图像透明度的一种通道。在一个图像中,通常会有三个颜色通道:红色(R)、绿色(G)、蓝色(B),它们合在一起…

macOS 源码编译 Percona XtraBackup

percona-xtrabackup-2.4.28.tar.gz安装依赖 ╰─➤ brew install cmake ╰─➤ cmake --version cmake version 3.27.0brew 安装 ╰─➤ brew update╰─➤ brew search xtrabackup > Formulae percona-xtrabackup╰─➤ brew install percona-xtrabackup╰─➤ xtr…

scrcpy2.0+实时将手机画面显示在屏幕上并用鼠标模拟点击2023.7.26

想要用AI代打手游,除了模拟器登录,也可以直接使用第三方工具Scrcpy,来自github,它是一个开源的屏幕镜像工具,可以在电脑上显示Android设备的画面,并支持使用鼠标进行交互。 目录 1. 下载安装2. scrcpy的高级…

Go语言开发小技巧易错点100例(八)

往期回顾: Go语言开发小技巧&易错点100例(一)Go语言开发小技巧&易错点100例(二)Go语言开发小技巧&易错点100例(三)Go语言开发小技巧&易错点100例(四)Go…

【论文笔记】RCM-Fusion: Radar-Camera Multi-Level Fusion for 3D Object Detection

原文链接:https://arxiv.org/abs/2307.10249 1. 引言 目前的一些雷达-相机融合3D目标检测方法进行实例级的融合,从相机图像生成3D提案,并与雷达点云相关联以修正提案。但这种方法没有在最初阶段使用雷达,依赖于相机3D检测器&…

Spring中如何用注解方式存取JavaBean?有几种注入方式?

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 本篇文章将讲解如何在spring中使用注解的方式来存取Bean对象,spring提供了多种注入对象的方式,常见的注入方式包括 构造函数注入,Setter 方法注入和属性…

如何在局域网外SSH远程访问连接到家里的树莓派?

文章目录 如何在局域网外SSH远程访问连接到家里的树莓派?如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpol…

word图自动编号引用

一.引用,插入题注,新建标签,图1-,这样生成的就是图1-1这种,确定 再添加图片就点击添加题注就行,自动生成图1-2这种 二.图例保存为书签 插入,书签,书签命名,如图1 三…

Tensorflow(二)

一、过拟合 过拟合现象:机器对于数据的学习过于自负(想要将误差减到最小)。 解决方法:利用正规化方法 二、卷积神经网络(CNN) 卷积神经网络是近些年来逐渐兴起的人工神经网络,主要用于图像分类、计算机视觉等。 卷积:例如对图片每一小块像素区域的处理&#xff…

sqlite触发器1

SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。 SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEM…

SpringBoot+Jpa+Thymeleaf实现增删改查

SpringBootJpaThymeleaf实现增删改查 这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例。 1、pom依赖 pom 包里面添加Jpa 和 Thymeleaf 的相关包引用 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.…

Ubuntu 20.04下的录屏与视频剪辑软件

ubuntu20.04下的录屏与视频剪辑 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 2、设置录制窗口参数 3、开始录制 二、视频剪辑软件kdenlive的安装 1、安装 2、启动 一、录屏软件SimpleScreenRecorder安装与使用 1、安装 &#xff08;1&#xff09;直接在终端输入以下命…

DAY2,Qt(继续完善登录框,信号与槽的使用 )

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff0c;来回切换页面&#xff1b; ---mychat.h chatroom.h---两个页面头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> /…

STC12C5A60S2 单片机串口2的通信功能测试

根据手册说明&#xff0c;STC12C5A60S2 系列单片机可以直接使用 reg51.h 的头文件&#xff0c;只是在用到相应的特殊功能寄存器时&#xff0c;要做相应的定义即可。 笔记来自视频教程链接: https://www.bilibili.com/video/BV1Qq4y1Z7iS/?spm_id_from333.880.my_history.page…

EtherNet/IP转Modbus网关以连接AB PLC

本案例为西门子S7-1200 PLC通过捷米特Modbus转EtherNet/IP网关捷米特JM-EIP-RTU连接AB PLC的配置案例。 网关分别从ETHERNET/IP一侧和MODBUS一侧读写数据&#xff0c;存入各自的缓冲区&#xff0c;网关内部将缓冲区的数据进行交换&#xff0c;从而实现两边数据的传输。 网关做为…