Arduino无刷电机控制教程| ESC | BLDC

在本教程中,我们将学习如何使用Arduino和Esc控制无刷电机。如果您想要更多详细信息,您可以检查其他文章或观看以下视频,其中包含对此的说明无刷电机的工作原理以及如何控制一个使用Arduino和ESC。

概述


对于这个例子,我有一个超跑无刷直流电机与以下规格:它有千伏额定1000,它可以使用2S, 3S或4S LiPo电池供电,它需要30A ESC。无刷电机上的KV额定值定义了空载时电机每伏特的RPM。

BLDC电机规格 -  1000KV 2S 3S 4S Lipo电池30A ESC

在这个例子中,1000KV意味着,例如,如果我们给电机提供7.4伏的2S LiPo电池,电机可以达到7.4乘以1000的最大转速,也就是7400 RPM。

无刷电机是电力饥饿,最常用的供电方法是使用Lipo电池。Lipo电池的“S”数量表示电池具有多少个细胞,并且每个电池的电压为3.7V。

3S Lipo电池,用于无刷电机

对于这个例子,我将使用3S LiPo电池有3个电池,这是11.1V。所以,我可以期待我的电机达到最大转速11100。

最后,这是一个30A的ESC,我将用于这个例子并与电机要求匹配。在一侧,ESC具有三个线,可控制电机的三个阶段,另一侧,它具有两根电线,VCC和GND,用于供电。

还有一组来自ESC出来的三根线,这是信号线,+ 5V和地面。ESC的此功能称为电池消除器电路,并且顾名思义,它可以消除用于微控制器的单独电池的需要。有了这个,ESC提供了调节的5V,可用于为我们的Arduino供电。

我们可以在这里注意到这一连接实际上与我们在伺服电机上看到的连接相同。

无刷电机和伺服相同类型的连接

所以,控制一个无刷电机使用ESC和Arduino是简单的使用Arduino控制伺服。ESCs使用与伺服相同类型的控制信号,这是标准的50Hz PWM信号。

无刷电机控制信号50hz PWM与伺服电机相同

这非常方便,因为例如,当建造一个RC飞机,我们通常需要两个伺服和无刷电机,这样,我们可以很容易地控制他们与相同类型的控制器。

因此,使用arduino我们只需生成50Hz PWM信号并取决于脉冲宽度或高状态持续时间,应从1毫秒到2毫秒,ESC将使电机从最小驱动到最大RPM。

Arduino使用ESC的电机控制

Arduino无刷电机控制-电路图

这是此示例的电路图。除了ESC外,我们还将使用简单的电位器来控制电机速度。

Arduino BLDC电机控制 - 电路图 - 原理图

您可以从下面的链接获取此Arduino教程所需的组件:

必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

无刷直流电机控制Arduino代码

Arduino代码真的很简单,只有几行代码。

/* Arduino无刷电机控制由Dejan, //www.mfxpo.combet188官方网站 */ #包括 Servo ESC;//创建伺服对象控制ESC int potValue;//从模拟引脚无效设置(){//连接ESC针9 ESC. Attach (9,1000,2000);//(引脚,最小脉冲宽度,最大脉冲宽度,以微秒为单位)}void loop() {potValue = analogRead(A0);//读取电位计的值(值介于0和1023之间)potValue = map(potValue, 0, 1023, 0, 180);//缩放它使用它与伺服库(值在0和180之间)ESC.write(potValue);//发送信号到ESC}

描述:所以,我们需要定义伺服图书馆,因为有了伺服库,我们可以很容易地产生50Hz的PWM信号,否则Arduino产生的PWM信号是在不同的频率。然后,我们需要为ESC控制创建一个伺服对象,并定义一个变量来存储来自电位器的模拟输入。在设置部分,使用attach()函数,我们定义Arduino引脚是连接的ESC控制信号,并定义以微秒为单位的PWM信号的最小和最大脉冲宽度。

在循环部分中,首先读取电位器,将其从0到1023的值映射为0到180的值。然后使用write()函数将信号发送到ESC,或产生50Hz的PWM信号。0到180之间的值对应于设置部分中定义的1000到2000微秒之间的值。

所以,如果我们把这个代码上传到Arduino,然后用电池给所有的东西通电,那么我们就可以用电位器把无刷电机的速度从0控制到最大。

使用Arduino和Esc控制无刷电机

然而,这里有几件事我们应该注意。电机初始供电时,信号值必须等于或小于1毫秒的最小值。这叫做ESC的启动,电机会发出确认的哔哔声,这样我们就知道它启动正确了。如果我们有更高的价值,当动力,这意味着我们有一个油门上升,ESC不会启动电机,直到我们油门下降到正确的最小值。这是非常方便的安全方面,因为电机不会启动,如果我们有一个油门时,供电。

ESC校准

最后,让我们解释ESC校准是如何工作的。每个ESC都有自己的高点和低点,它们可能略有不同。例如,低点可能是1.2毫秒,高点可能是1.9毫秒。在这种情况下,我们的油门在前20%不会做任何事情,直到它达到低点1.2毫秒。

ESC校正-脉冲宽度-高低点调整

为了解决这个问题,我们可以校准ESC或设置高点和低点作为我们想要的。为此目的,在为ESC供电之前,首先我们需要油门加大我们的电位器到最大或一个值至少大于当前的中点。然后我们可以启动ESC,我们将听到几声哔哔的电机,这实际上确认我们已经设置了新的高点。

使用Arduino校准ESC

然后在2秒后,我们应该移动我们的电位器到我们的新低点的位置。我们将再次听到确认哔哔声,并与此同时,我们完成了ESC校准。现在我们的油门会立即反应,我们可以控制电机在这两个新的点。

这对本教程来说几乎是一切。如果您想学习如何无线制作此Arduino无刷电机控制,您可以查看我以前的视频,其中我构建和Arduino的RC发射器,并解释了如何使用它控制BLDC电机。

无刷电机无线控制使用Arduino

我希望你喜欢这个教程,并学到一些新的东西。欢迎在评论区提出任何问题,不要忘记查看我的Arduino项目的集合bet188me

29回应

  1. 埃里克

    谢谢你始终发布这么好的内容!我正试图通过蓝牙运行两个带有两个ESC的无刷电机。我一直在尝试将这些信息与您的教程合并在两个直流电机和蓝牙上。我认为我难以遇到代码,因为我的ESC没有识别信号。是否有一个重要的一步,我可能缺少通过蓝牙传输信息到ESC?谢谢!

    回复
    • 德扬

      首先,首先,您必须通过测试单独的教程来确保ESC控制和蓝牙通信都正常工作。一旦你知道他们正在工作,那么你就不会有任何问题将它们组合在一起。您正在从蓝牙接收的值应该简单地用于控制ESC。您知道您可以始终转换值以匹配您的需求,例如,如果从蓝牙接收到0到25​​5的接收值,则可以使用地图函数转换为1000至2000的值,等等。

      回复
  2. Idris Delvi.

    谢谢你的指导。解释得很好。关于组件工作的详细信息和对代码的一步一步的解释,确实使整个主题很容易理解。我有几个问题希望你能解释清楚,
    -有一个命令arduino关闭/解除电机
    - 有方法可以通过代码反转电机的方向。
    谢谢您的帮助!!

    回复
    • 德扬

      谢谢你!为了反转方向,你需要一个特定的ESC,它能这样做。要用Arduino命令解除马达,你可以使用某种继电器。

      回复
  3. 诺姆

    感谢您的指导!我搜索了一段时间关于这个的教程,现在终于有了,谢谢。
    我连接了你所展示的一切,但它仍然没有从某种原因工作 -

    sometimes it beeps like it should work (the good beep, not the error one) but then when I turn the penteometer it doesn’t work, but sometimes (with some values – usually around 60) it randomly does “work” – moving but staying in the same position ? like it’s “fighting” itself and trying to rotate but can’t
    很多时候它只是一次哔哔声(大约半秒) - 我找不到关于一个单一嘟嘟声的在线。或者根本没有发出哔哔声,或者像它应该工作一样哔哔声,然后在它之后立即发出错误蜂鸣声。

    然后我试着重新启动电路板/重新连接电脑/重新连接电池,每次我做这些事情,它的反应都不一样。
    这里有一些电线的照片,和一个视频时,电机是移动的,但不移动
    https://imgur.com/a/c8dzljc.

    任何想法如何存在问题以及如何解决它?我试图弄清楚这么长时间,仍然无法让电机工作:\我真的很欣赏任何帮助,谢谢!

    回复
    • 德扬

      嘿,ESC或电机本身可能出错。作为一个例子,我现在的电机遇到了问题,因为如果它的电线是塑料管中的电线中间的故障/切割。我虽然是esc,但这是一个简单的电线问题。然后我刚刚取下绝缘并将电线重新焊接到连接器,一切正常工作。所以我的观点,尝试不同的ESC和电机,本教程中解释的方法应该工作100%。

      回复
      • 诺姆

        首先感谢您的快速回复!!
        我重新检查了一切,重新运行,仍然不起作用:/然后我用一个全新的电机(和新的Esc)尝试 - 并再次有线并不合适,没有嘟嘟声或任何东西。(我也尝试了对电机的固定值,结果)
        我用的电池和你的一样(或者是同样的牌子,3号),还有arudino nano。
        我很沮丧,很绝望。我在这上面花了太多时间…
        有办法检查esc或马达吗?也许不用密码,就能让马达全速运转?或者只是检查esc ?我真的很绝望,不知道该怎么办

  4. 哈立德

    嗨,谢谢你的完美解释。
    我使用代码来控制200kv BLDC,从Racerstar和尝试代码后,它不起作用,它才能通过USB连接到笔记本电脑时工作。电动机在两个方向上工作并停止在电位器范围的中间。

    回复
    • 德扬

      嘿,谢谢!看来你没有BEC来给Arduino供电或者它不能正常工作或者连接不正常。BEC提供5V,所以你应该把它连接到Arduino的5V和GND引脚上。

      回复
      • 哈立德

        谢谢你的回复…
        ESC提供BEC,它有效,我还使用您的代码来制作我自己的遥控器,所以我真的很感谢您的工作并喜欢这些有用的视频。
        最后一个问题是校准,因为每个Esc都有自己的方式,而且没有许多关于它的教程。我应该使用示波器,然后在附加功能中更改(1000,2000)吗?

  5. 丹尼尔·布鲁克

    伟大的写作!但…。您的代码部分在困惑我的评论中存在错误。我不得不通过伺服库文档看,以确保即使......但是读取的代码部分:“Esc.Attach(9,1000,2000);//(PIN,MIN脉冲宽度,最大脉冲宽度为毫秒)“错误,它不是毫秒,它的微秒!我很困惑,因为我知道脉冲宽度并不假设为1和2秒大声笑。

    回复
  6. 支队伍

    谢谢你提供的宝贵信息。
    我有一个问题。
    你的3S LiPo电池容量是多少?1800mAh的电池够了吗,还是我应该拿一个2400mAh的?电机我将使用的是大培XXD A2212 1000KV无刷电机与30A ESC如果你需要这个信息。
    我很期待你的答案。祝你一天愉快

    回复
    • 支队伍

      现在我有一个问题
      把它映射到0到180的代码有什么意义?你为什么选择这个而不是其他的值?

      回复
      • 德扬

        好的驱动无刷直流电机,我们使用的伺服库,这与这些值从0到180。从0到1023的值是从电位器的模拟读取,所以我们映射到从0到180的值,这样我们可以控制无刷直流电机的速度从最小到最大。

  7. 一点点

    我刚刚发现了你们的网站,我不得不说,你们在解释机电方面做得很好!!我一直在玩基本的遥控飞机,已经阅读、看到和观看了许多关于无刷直流电机和ESCs的文章和视频。要么我试图在一天中过早(或太晚)获取信息,要么它最终只是…点击! !做得好,谢谢!!

    回复
  8. Asma

    谢谢,它是如此富有成效,
    我有两个问题,我在任何地方都找不到答案。
    RPM和PWM之间的关系是什么?
    例如,如果Kv是1000和Lipo电池供应7.4 (v),我们有一个最大RPM 7400。我从很多资料中看到,当我们没有负载时,这是正确的。所以我现在的问题是1)负载是什么意思?是与马达相连的螺旋桨吗?如果我们有螺旋桨最大转速还是7400 ?
    2)如果我们说最大转数是7400。这意味着当我们有10%的负载率时,我们的速度是7400转/分??(像您的情况2毫秒,这等于10%的占空比)。如果这是真的,我们应该在代码中定义“10%的占空比,我们得到7400 RPM″??
    如果您能给我回复,我将不胜感激。
    谢谢你!

    回复
    • 德扬

      1)没错,载荷是任何与轴的自由旋转相反的东西。不同尺寸的螺旋桨会有不同的负载,更大的螺旋桨会抓住更多的空气,这意味着更大的阻力,这意味着更大的负载。
      2)在这种情况下,控制无刷电机的RPM和PWM实际上是不相关的。20毫秒的信号只是一个标准的信号,用于控制转速的无刷电机。根据这个信号控制器,ESC,适当地驱动无刷电机。

      回复
  9. 诺曼萨瓦尔

    嗨,我试图通过Esc(Simonk 30a)使用Arduino的2212个BLDC电机(Simonk 30a),但在接地时遇到麻烦。有时我的BLDC电机运行一段时间,然后停止。我意识到,当我上电Arduino时,所以BLDC开始工作,但只是几秒钟,然后回到停止。请让我知道解决方案。
    我上传的代码是。

    #包括
    伺服Esc;//创建伺服对象来控制ESC

    无效的设置(){
    //连接ESC在引脚9
    Esc.attach(9);
    }
    void loop(){
    ESC.WRITE(100);//将信号发送到ESC
    }

    //我只是想运行电机,这就是为什么我没有使用电位器在这里。

    回复
  10. 诺曼萨瓦尔

    如果我使用3200 MAH的3S Lipo电池运行1000kV BLDC电机,那么如果他们没有任何负载,我可以在时间内或电机运行多长时间的备份或者电机可以在此电池上运行多长时间?
    1000kv无刷直流电机负载电流是多少?
    如果您能回复我,我将不胜感激。
    谢谢。

    回复
    • 您应该制作V除法,以将电池输入模拟输入。

      一旦完成,你可以实时检查它,并添加一个低电平警告或关机。

      回复
  11. Siddh Narhari

    嗨,我想使用无刷电机作为我的机器人的车轮中的驱动电机,但我无法弄清楚如何使用ESC以前方,向前和反向操作BLDC。有没有办法我们可以做到这一点?

    回复
    • 德扬

      嘿,为此,您需要一个特殊的ESC,能够在两个方向上驱动无刷电机。还有其他方法可以实现这一点,例如使用继电器。在这种情况下,您可以在激活继电器的方式,电机开关的两根电线中以某种方式通过继电器连接三根电线。

      回复
  12. 耶稣

    BEC接错了,BEC提供了5V(+引脚是输出),Arduino的5V引脚也是输出,所以没人能做到。
    不要连接ESC的+引脚,连接Arduino的Vin引脚或者用USB线给Arduino供电。

    回复
    • 德扬

      你可以使用Arduino上的5+引脚作为输入,如果你提供5V。Vin引脚不能在5V下工作,因为它有稳压器,可以在7V到12V的电压下工作,然后降到5V。

      回复
  13. 丹尼尔·费尔南德斯

    问候
    我有一个“用于多边形镜的无刷电机驱动器”,取自Xerox激光打印机。电路板有5个输入引脚:我想它是24V,GND,5V加两个信号引脚,它使用了名为HA13535的IC。我想跑步;您用哪个电路来控制?
    我需要你的帮助。谢谢

    回复

留下一个回复

您的电子邮件地址不会被公开。

推荐

2019年面向初学者和爱好者的最佳入门级示波器

最适合初学者和爱好者的示波器

推荐

2019年针对初学者的8个最佳Arduino入门工具包

8个最好的arduino初学者工具包

推荐

最佳3D打印机初学者和爱好者- 3D打印

最好的3d打印机初学者和爱好者