风筝
发表于: 2019-8-13 22:07:22 | 显示全部楼层

在本篇文章中,我们将学习如何使用Arduino开发板和ESC控制无刷电机。如果您想了解BLDC电机如何工作的更多细节,您可以查看另一篇文章,其中包含无刷电机工作原理的说明。


概览

在本文中,我使用的是外转子BLDC电机,规格如下:KV等级为1000,可以使用2S、3S或4S LiPo电池供电,需要30A ESC。无刷电机的KV额定值定义了无负载时每伏电机的转速。

BLDC-Motor-Specs-1000KV-2S-3S-4S-Lipo-Battery-30A-ESC.jpg

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


本例中,1000KV意味着,例如,如果我们为电机提供电压为7.4伏的2S LiPo电池,则电机可以达到最大转速1000的7.4倍或者7400转。

无刷电机耗电量大,最常用的电源是使用LiPo电池。 LiPo电池的“S”数表示电池有多少节电池,每个电池的电压为3.7V。

3S-Lipo-Battery-for-Brushless-Motor.jpg

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


在这个例子中,我将使用3S LiPo电池,它有3个电池,电压为11.1V。所以,我可以预期电机达到最大转速为11100。

最后,这是一个30A ESC,我将用于此示例并与电机要求相匹配。 ESC的一侧有三根电线控制电机的三相,另一侧有两根电线,VCC和GND,用于供电。

30A-ESC-with-BEC-for-Brushless-Motor-Control.jpg

还有另外一组三条线从ESC引出来,那就是信号线、+ 5V和地线。 ESC的这一功能称为电池消除器电路(Battery Eliminator Circuit),顾名思义它不需要为微控制器提供单独的电池。有了这个,ESC提供稳定的5V,可以用来为我们的Arduino供电。


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

brushless-motor-and-servo-same-type-of-connection.jpg

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


因此,使用ESC和Arduino控制无刷电机就像使用Arduino控制伺服一样简单。 ESC使用与伺服相同类型的控制信号,这是标准的50Hz PWM信号。

Brushless-motor-control-signal-50hz-PWM-same-as-servo-motor.png

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


这非常方便,因为例如在构建RC遥控飞机时,我们通常需要伺服电机和无刷电机,这样我们就可以使用相同类型的控制器轻松控制它们。

因此,使用Arduino我们只需生成50Hz PWM信号,并根据脉冲宽度或高状态持续时间(从1毫秒到2毫秒不等),ESC将驱动电机从最小到最大RPM。

Arduino-Brushelss-Motor-Control-using-ESC.png

使用ESC的Arduino Brushelss电机控制


Arduino无刷电机控制的电路图

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

Arduino-BLDC-Motor-Control-Circuit-Diagram-Schematic.png

Arduino BLDC电机控制的原理图


用于BLDC电机控制的Arduino代码

只需几行代码,Arduino代码非常简单。

  1. /*
  2.         Arduino Brushless Motor Control
  3.      by Dejan, https://howtomechatronics.com
  4. */
  5. #include <Servo.h>
  6. Servo ESC;     // create servo object to control the ESC
  7. int potValue;  // value from the analog pin
  8. void setup() {
  9.   // Attach the ESC on pin 9
  10.   ESC.attach(9,1000,2000); // (pin, min pulse width, max pulse width in microseconds)
  11. }
  12. void loop() {
  13.   potValue = analogRead(A0);   // reads the value of the potentiometer (value between 0 and 1023)
  14.   potValue = map(potValue, 0, 1023, 0, 180);   // scale it to use it with the servo library (value between 0 and 180)
  15.   ESC.write(potValue);    // Send the signal to the ESC
  16. }
复制代码

代码描述:首先,我们需要包含伺服Servo库,因为使用伺服库我们可以轻松生成50Hz PWM信号,否则Arduino生成的PWM信号处于不同的频率。然后我们需要为ESC控制创建一个伺服对象,并定义一个变量来存储来自电位器的模拟输入。在setup()函数部分,使用attach()函数,我们定义哪个Arduino引脚是连接的ESC的控制信号,并定义PWM信号的最小和最大脉冲宽度,以微秒为单位。

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

因此,如果我们将此代码上传到我们的Arduino,然后使用电池为所有电源供电,那么我们可以使用电位器将无刷电机的速度控制为零到最大。

Controlling-brushless-motor-using-Arduino-and-ESC.jpg

使用Arduino和ESC控制无刷电机


但是,在这里我们应该注意一些事情。最初为电机供电时,信号值必须等于或低于1毫秒的最小值。这被称为ESC的启动,并且电机发出确认蜂鸣声,以便我们知道它已正确启动。如果我们在通电时具有更高的值,这意味着我们增大节气阀,ESC将不会启动电机,直到我们降低节气阀到正确的最小值。这在安全性方面非常方便,因为如果我们在通电时节气阀较大,电动机将不会启动。


ESC校准

最后,我们解释一下ESC校准的工作原理。每个ESC都有自己的高点和低点,它们可能略有不同。例如,低点可能是1.2毫秒,高点可能是1.9毫秒。本文中,我们的节气阀在前20%内不会做任何事情,直到它达到1.2毫秒的低点值。

ESC-Calibration-Pulse-Width-High-and-Low-Point-adjustment.jpg

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


为了解决这个问题,我们可以根据需要校准ESC或设置高点和低点。为此,在给ESC供电之前,首先我们需要将电位器加速到最大值或至少大于当前中间点的值。然后我们可以启动ESC,我们会听到电机发出几声嘟嘟声,这实际上证实了我们已经设定了新的高点。

Calibrating-ESC-using-Arduino.jpg

使用Arduino校准ESC


然后在2秒后,我们应该将电位器移动到新的低点所在的位置。我们将再次听到确认的哔哔声,并且已完成ESC校准。现在节气阀会立即响应,我们可以在这两个新点内控制电机。


以上就是本篇文章的所有内容。希望你能喜欢本篇文章并学到新的东西。如有问题,请随时在本帖下面进行回复。

跳转到指定楼层
yrtshuaib
发表于: 2024-3-24 17:01:19 | 显示全部楼层

要是加上蓝牙控制怎么写代码呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-25 18:34 , Processed in 0.041038 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表