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

简介: 本文详细介绍了直流有刷电机的工作原理,为什么要有减速电机,减速比是什么,什么是编码器,编码器的作用。针对霍尔编码器介绍了一些相关概念以及检测电机转速和转向的原理。最后,给出了详细的测速程序设计思路和代码实现。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


一、直流有刷电机

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

210fdcd4ad48a6a4cba5bfee813def94_62f0a83b79704752b158f1dfba099f13.png

电机是怎么转起来的呢?

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

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

834342ca2f8065911cc9be8551b5ac87_5af2e5da8999483ca8a8701206a07c94.png

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

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

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

a4caf7c7d57ba57143cca648a08ab196_c5a172f4aeaa4103859239ef19d5d8df.png

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

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

二、减速比

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

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

什么是减速比?

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

8fd581e8179e86776c4bcec8a960cf81_6f352350feea41cc8c8d413488e1fe70.png

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

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

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

三、霍尔编码器

3.1 霍尔编码器

什么是编码器?

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

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

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

编码器的作用。

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

霍尔编码器的工作原理。

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

霍尔编码器的线数。

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

3.2 霍尔编码器测速原理

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

917a76cfdc3f13ad9b0656c844c97af4_644b3fe4e852434390ef8bfa79ef6587.png

如何判断电机转向?

我们通过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;   // EXIT0
    EXTI_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中断标志位被置1
    if(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外设系列专栏

相关文章
|
9月前
基础运放电路专题
基础运放电路是电子电路中最基础和最常用的电路之一。基础运放电路使用运放(Operational Amplifier,简称Op Amp)作为核心元件,可以实现放大、滤波、积分、微分、比较等多种功能。以下是基础运放电路的专题介绍。 1. 运放的基本概念: 运放是一种高增益、高输入阻抗、低输出阻抗的电子放大器,通常由多个晶体管和电阻等元件组成。运放有两个输入端(正输入端和负输入端)和一个输出端,可以将输入信号放大到输出端并输出。 2. 基础运放电路的分类: 基础运放电路主要包括反馈电路、比较电路、积分电路和微分电路等。其中,反馈电路是最常见的基础运放电路,可以实现放大、滤波、振荡等多种功能。
50 0
|
9月前
模拟电路的介绍
一、基本电路元件的应用 模拟电路最早的应用是基于基本电路元件的构建,如电阻、电容和电感等。这些基本电路元件可以通过串联、并联和反馈等方式组合成各种电路,用于模拟信号的处理和传输。基本电路元件的应用为模拟电路的发展奠定了基础。 二、放大器的出现 放大器是模拟电路中最重要的组成部分之一,它能够将输入信号放大到所需的幅度。最早的放大器是由电子管构成的,通过电子管的放大特性来实现信号的放大。随着半导体技术的发展,晶体管放大器和集成电路放大器相继出现,使得放大器的性能得到了大幅提升。 三、滤波器的应用 滤波器是模拟电路中常用的电路元件,它能够选择性地通过或者抑制特定频率的信号。滤波器的应用使得模拟电
58 0
|
9月前
|
传感器
模拟电路
模拟电路是一种电子电路,用于处理和传输连续变化的电信号,如声音、图像和传感器信号等。与数字电路不同,模拟电路处理的是连续的电压和电流,而不是离散的数字信号。
37 0
|
18小时前
常见的并联谐振应用案例
并联谐振电路在音频处理中提升音质,振动检测中评估设备状态,电磁波检测中测量频率,电力电子及无功补偿中的优化,通信信号的滤波与放大,无线电接收发射,及家用电器如电视、洗衣机的信号控制。应用广泛,从通信到家电,发挥着关键作用。
|
24天前
|
算法
数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路
数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路
15 0
|
2月前
|
Python
物理电学:探索电流、电压与电阻的奥秘
物理电学:探索电流、电压与电阻的奥秘
18 1
|
7月前
直流稳压电源与信号产生电路(模电速成)
直流稳压电源与信号产生电路(模电速成)
87 1
|
10月前
第三章:晶体三极管及应用电路
第三章:晶体三极管及应用电路
35 0
|
12月前
|
内存技术
超实用总结,一文通吃所有整流滤波电路
超实用总结,一文通吃所有整流滤波电路
77 0
|
芯片
运算放大器(运放)介绍
运算放大器(运放)介绍
301 0