前言

在机器人的结构中,往往电机是必不可少的组成部分,例如地面智能车中的轮子驱动,空中无人机的动力部分。电机往往是产生运动动力的直接来源,而无刷直流电机(Brushless Direct Current Motor)是应用最为广范的。

本篇博客主要描述了无刷直流电机的基本概念、结构、优劣势并且在最后展示了一个单片机(Arduino )控制无刷直流电机旋转的实例。

基本概念

无刷直流电机,英语缩写为BLDC(Brushless Direct Current Motor)。电机的定子是线圈,或者叫绕组。转子是永磁体,就是磁铁 。根据转子的位置,利用单片机来控制每个线圈的通电,使线圈产生的磁场变化,从而不断在前面勾引转子让转子转动,这就是无刷直流电机的转动原理。

在无人机上用的多为这种,即外为转子,内为定子。
在这里插入图片描述
在这里插入图片描述

优势与劣势

优势

  • 无电刷、低干扰
    无刷电机去除了电刷,最直接的变化就是没有了有刷电机运转时产生的电火花,这样就极大减少了电火花对遥控无线电设备的干扰。

  • 噪音低,运转顺畅
    无刷电机没有了电刷,运转时摩擦力大大减小,运行顺畅,噪音会低许多,这个优点对于模型运行稳定性是一个巨大的支持。

  • 寿命长,低维护成本
    少了电刷,无刷电机的磨损主要是在轴承上了,从机械角度看,无刷电机几乎是一种免维护的电动机了,必要的时候,只需做一些除尘维护即可。

劣势

  • 有刷电机低速扭力性能优异、转矩大等性能特点是无刷电机不可替代的

使用寿命

无刷电机通常使用寿命在几万小时这个数量级

使用寿命有三个因素:

  • 轴承寿命
    一旦轴承损坏需要更换轴承
  • 磁钢退磁
    这种很少见

  • 线圈问题
    求线圈的温度不应过高,并确保良好的散热,从而延长其使用寿命

基本结构

无刷直流电机的基本结构主要为:定子和转子

定子:定子铁芯就是由硅钢片叠压而成,内圆表面开有槽,用于布置定子绕组,定子绕组:若干线圈。

转子

从转子基本结构上分,无刷直流电机可分为:

  • 内转子型(Inner Rotor)
  • 外转子型(Outer Rotor)

主要看转子(永磁铁)是在内部还是在外部
在这里插入图片描述
内转子结构更紧凑,散热更好一点,外转子的转动惯量更大一点,主要是运用在比较匀速的运动,硬盘,打印机,风扇等。内转子水泵,电钻,等快速变换的应用。

所以在智能车的轮子,无人机上的电机,都是外转子型。

下面是拆了一个无人机上的电机的实物图,来看具体的转子和定子。[无刷电机怎么拆:把下面的卡扣拆开,用力把转子从上面拔下来]

在这里插入图片描述

使用单片机控制实例

电子调速器(ESC)

说到对于无刷直流电机的控制,不得不提到电子调速器(ESC),简称电调。如下图所示
在这里插入图片描述

每台BLDC电机都需要某种控制器,以将来自电池的DC电压转换为脉冲以为电机的相线供电。该控制器称为ESC,它表示电子速度控制器。控制器的主要职责是按顺序向BLDC电机的相线通电,以使电机旋转。这是通过感测每条导线的反电动势并在磁铁穿过线圈时准确地为线圈通电来完成的。

电调主要完成两个功能:

  • 速度控制
  • 电池消除

速度控制:ESC可以通过读取橙色线上提供的PWM信号来控制BLDC电机的速度。它的工作原理与伺服电机非常相似,所提供的PWM信号的周期应为20ms,并且可以改变占空比以改变BLDC电机的速度。由于相同的逻辑也适用于伺服电动机来控制位置,因此可以在Arduino程序中使用相同的伺服库。

电池消除器电路(BEC) :几乎所有ESC都带有电池消除器电路。顾名思义,该电路消除了微控制器需要单独的电池的麻烦,在这种情况下,我们不需要单独的电源来为Arduino供电。ESC本身将提供可调节的+ 5V电压,可为单片机供电。通常有多种类型的电路可调节此电压,在便宜的ESC上将是线性调节,也可以找到带有开关电路的电路。

Arduino BLDC电机控制电路图

在这里插入图片描述
BLDC电机与Arduino接口的连接非常简单。ESC需要至少12V和5A左右的电源。
使用锂电池为ESC供电。ESC的三相线应与电机的三相线连接,无连接顺序,可以任意顺序连接。在电机的转向与希望的转向不一致时,可以任意更换其中的两根线即可。

ESC本身的BEC(电池消除器电路)将调节+ 5V,可用于为Arduino板供电。最后,为了设置BLDC电机的速度,使用了电位计,该电位计连接到Arduino的A0引脚。

实物连接如下:
在这里插入图片描述

代码

代码主要功能
创建一个PWM信号,其占空比从0%到100%不等,频率为50Hz。
通过使用电位计来控制占空比,以便可以控制电动机的速度。
使用来自Arduino的伺服库,产生PWM信号。

#include <Servo.h> //Use the Servo librarey for generating PWM
Servo ESC; //name the servo object, here ESC

void setup()
{
ESC.attach(9); //Generate PWM in pin 9 of Arduino
}

void loop()
{
int throttle = analogRead(A0); //Read the voltage from POT
throttle = map(throttle, 0, 1023, 0, 180); //Map the values of 0-102 from pot to 0-180 bcs servo works only from 0-180
ESC.write(throttle); //based on the value of throttle generate PWM signal
}

效果:电机转起来了
在这里插入图片描述