回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(227)---PWM调速直流马达BLDC ESC 无刷电机 简单

头像 驴友花雕 2024.08.27 232 0

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机

 

02 (3).jpg

00 (1).jpg

02.jpg
03.jpg
04.jpg
05.jpg

无刷电机内部原理

 

08.jpg

上图为无刷电机的基本模型示意,电机内部有三个线圈,每个线圈的一端都连接起来,另外一端引出到外部,中间有一个具有N/S两极的永磁铁内转子。如果我们按照一定的顺序给电机通电,转子就可以旋转起来。

无刷电机(BLDC)的工作原理主要依赖于电子换向器和永磁体的相互作用。以下是无刷电机的基本工作原理:
1、结构组成:无刷电机由定子、转子和位置传感器组成。定子上有绕组,转子上有永磁体。位置传感器(如霍尔传感器)用于检测转子的位置。
2、电子换向:无刷电机不使用机械电刷,而是通过电子换向器来控制电流的方向。电子换向器根据位置传感器的反馈,切换定子绕组的电流方向,产生旋转磁场。
3、磁场相互作用:定子产生的旋转磁场与转子上的永磁体相互作用,驱动转子旋转。转子的旋转速度和方向由定子绕组的电流频率和相序决定。
4、闭环控制:无刷电机通常采用闭环控制系统,通过位置传感器实时监测转子位置,并调整定子电流,实现精确控制。
5、高效低噪:由于没有机械电刷,无刷电机具有高效率、低噪音和长寿命的优点,广泛应用于工业控制、家用电器和交通工具等领域。

 

09.jpg
10.gif
11.gif

无刷电机一些关键参数
无刷电机的关键参数主要包括扭矩、转速和功率。具体介绍如下:
1、扭矩:扭矩是指电机转动力量的大小,反映了电机的负载能力。扭矩越大,电机所能承受的负载也就越大,通常表现电机的性能也越好。在实际应用中,需要考虑应用所需要的最大扭矩,并留有至少20%的余量以应对额外因素,如气隙空气阻力等。
2、转速:转速指的是电机在单位时间内旋转的速度,通常用每分钟转数(rpm)来表示。这个参数决定了无刷电机能够提供多快的运转速度。
3、功率:功率是衡量电机工作能力的一个重要指标,它代表了电机在单位时间内能做多少工。一个电机的功率是由其电压和电流决定的,公式为P=VI,其中P是功率,V是电压,I是电流。
此外,还有一些其他重要参数需要注意:
4、空载电流:这是指在指定电压下,电机无负载工作时的工作电流。了解空载电流有助于评估电机在不承载任何负载时的电能消耗水平。
5、KV值:KV值代表的是电机的转速常数,即在特定电压下电机的空转转速。这个参数对于需要精确控制转速的应用来说非常重要。

在选择无刷电机时,除了考虑上述关键性能参数外,还应该根据具体的应用场景和要求来确定合适的电机型号。例如,如果对尺寸有特定要求,那么电机规格就显得尤为重要。像2212或2216这样的数字,通常用来表示无刷电机的定子直径和高度,这对于确保电机能够适配安装空间非常关键。

 

12.jpg

30A电调(电子调速器)用于控制无刷电机的速度和方向,常见于无人机、RC车等应用。以下是一些关于30A电调的关键点和使用方法:

1、电流容量:30A电调能够持续承受30安培的电流,适用于中等功率的无刷电机。通常,电调的最大瞬时电流会高于标称值,例如40A1。
2、电源输入:电调通常支持多种电池类型和电压范围,例如3S至4S的锂电池(11.1V至14.8V)2。
3、PWM控制:通过PWM(脉宽调制)信号控制电调,调节电机的转速和方向。PWM信号的频率和占空比决定了电机的运行状态3。
4、BEC功能:一些电调内置BEC(电池消除电路),可以将电池电压转换为稳定的5V或6V电压,供给接收机或飞控2。
5、保护功能:高质量的电调通常具备过流保护、过温保护和低电压保护功能,确保电调和电机的安全运行2。
6、连接电源和电机:将电调的电源线连接到电池,三根相线连接到无刷电机。确保连接正确,避免短路。
7、设置PWM信号:通过飞控或单片机输出PWM信号,控制电调的油门。调整PWM信号的频率和占空比,实现电机的速度控制。
8、调试和校准:在首次使用时,需要对电调进行校准,确保PWM信号范围与电调匹配。通常通过设置最大和最小油门位置完成校准。
9、监控运行状态:在运行过程中,监控电调和电机的温度、电流和电压,确保系统在安全范围内工作。
 

13.jpg

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

使用 Arduino 控制无刷电机的参考电路示意图

 

14.jpg
15.jpg

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机
 项目实验之一:用于 BLDC 电机控制的 Arduino 简单代码

实验开源代码

 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机
  项目实验之一:用于 BLDC 电机控制的 Arduino 简单代码   
*/

#include <Servo.h>

Servo ESC;     //创建伺服对象以控制ESC

int potValue;  //模拟引脚的值

void setup() {
  //将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发送信号
}

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

 

在循环部分,首先我们读取电位计,将其值从 0 到 1023 映射到从 0 到 180 的值。然后使用 write() 函数将信号发送到 ESC,或生成 50Hz PWM 信号。从 0 到 180 的值对应于 setup 部分中定义的 1000 到 2000 微秒的值。因此,如果我们将此代码上传到我们的 Arduino,然后使用电池为所有设备供电,那么我们可以使用电位计将无刷电机的速度从零控制到最大。

 

但是,这里我们应该注意的几件事。最初为电机供电时,信号值必须等于或低于最小值 1 毫秒。这称为 ESC 的布防,电机会发出确认蜂鸣声,以便我们知道它已正确布防。如果我们在通电时有更高的值,这意味着我们有一个油门,那么在我们油门降低到正确的最小值之前,ESC 不会启动电机。这在安全方面非常方便,因为如果我们在通电时油门升起,电机就不会启动。

实验场景图
 

17.jpg

实验记录视频

 

【花雕学编程】Arduino动手做(227)---BLDC ESC 无刷电机

 

https://www.bilibili.com/video/BV13bsxejEYw/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
 

BLDC 和 ESC 的一些常见术语:

If you have just started to work with BLDC motors then you might have probably come across the terms like Braking, Soft start, Motor Direction, Low Voltage, Response time and Advance. Let’s take a look into what these terms mean.
如果您刚刚开始使用 BLDC 电机,那么您可能遇到过制动、软启动、电机方向、低电压、响应时间和前进等术语让我们来看看这些术语的含义。

Braking: Braking is the ability of your BLDC motor to stop rotating as soon as the throttle is removed.  This ability is very important for multi-copters since they have to change their RPM more often to manoeuvre in the air.  
制动:制动是 BLDC 电机在油门移除后立即停止旋转的能力。这种能力对于多旋翼飞机来说非常重要,因为它们必须更频繁地改变 RPM 才能在空中机动。

Soft Start: Soft start is an important feature to consider when your BLDC motor is associated with gear. When a motor has soft start enabled, it will not start rotating very fast all of a sudden, it will always gradually increase the speed no matter how quickly the throttle was given. This will help us in reducing the wear and tear of gears attached with the motors (if any).
软启动:软启动是 BLDC 电机与齿轮关联时需要考虑的重要功能。当电机启用软启动时,它不会突然开始非常快速地旋转,无论油门的速度有多快,它总是会逐渐增加速度。这将帮助我们减少与电机相连的齿轮(如果有)的磨损。

Motor Direction: The motor direction in BLDC motors are normally not changed during operation. But when assembling, the user might need to change the direction in which the motor is rotating. The easiest way to change the direction of the motor is by simply inter changing any two wires of the motor.
电机方向:BLDC 电机中的电机方向在运行期间通常不会改变。但是在组装时,用户可能需要改变电机的旋转方向。改变电机方向的最简单方法是简单地互换电机的任意两根电线。

Low Voltage Stop: Once calibrated we would always need our BLDC motors run at the same particular speed for a particular value of throttle. But this is hard to achieve because the motors tend to reduce their speed for the same value of throttle as the battery voltage decreases. To avoid this we normally program the ESC to stop working when the battery voltage has reached below the threshold value this function is called Low Voltage Stop and is useful in drones.
低电压停止:校准后,我们始终需要我们的 BLDC 电机以相同的特定速度运行,以实现特定的节气门值。但这很难实现,因为随着电池电压的降低,电机往往会在相同的节气门值下降低速度。为避免这种情况,我们通常会对 ESC 进行编程,使其在电池电压低于阈值时停止工作,此功能称为 Low Voltage Stop,在无人机中很有用。

Response time: The ability of the motor to quickly change its speed based on the change in throttle is called response time. The lesser the response time is the better the control will be.
响应时间:电机根据油门的变化快速改变速度的能力称为响应时间。响应时间越短,控制效果越好。

Advance: Advance is a problem or more like a bug with BLDC motors. All BLDC motors have a little bit of advance in them. That is when the stator coils are energised the rotor is attracted towards it because of the permanent magnet present on them. After getting attracted the rotor tends to move a bit more forward in that same direction before the coil de-energises and then next coil energises.  This movement is called “Advance” and it will create problems like jittering, heating up, making noise etc. So this is something a good ESC should avoid on its own.
进展:Advance 是 BLDC 电机的一个问题,或者更像是一个错误。所有 BLDC 电机都有一点进步。也就是说,当定子线圈通电时,由于它们上存在永磁体,转子被吸引到它身边。被吸引后,转子往往会在线圈断电之前沿同一方向向前移动一点,然后下一个线圈通电。这种运动称为 “Advance”,它会产生抖动、发热、发出噪音等问题。所以这是一个好的 ESC 应该自己避免的事情。

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机
 项目实验之二:通过串口校准电机油门后就可以在串口监视器中输入1000~2000中的
 任意数字来控制电机油门,可以实现开环的电机转速控制。

实验开源代码
 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机
  项目实验之二:通过串口校准电机油门后就可以在串口监视器中输入1000~2000中的
  任意数字来控制电机油门,可以实现开环的电机转速控制。
*/

#include <Servo.h>

Servo myServo;

String comStr = "";
int comInt = 0;

void setup() {
  //将您的设置代码放在此处,运行一次
  Serial.begin(9600); //启动串行端口
  while (Serial.read() >= 0) {} //清除串行端口的缓冲区
  Serial.println("BLDC无刷电机准备就绪!");
  myServo.attach(9); //将myServo连接到GPIO_09
  myServo.writeMicroseconds(1000); //将初始PWM设置为最小值
}

void loop() {
  //把你的主代码放在这里,重复运行
  if (Serial.available() > 0) {
    //监听串口,当有东西被捕获时运行代码...
    delay(10);
    comStr = Serial.readString(); //读出字符串
    comInt = comStr.toInt(); //将字符串转换为整数
    comInt = constrain(comInt, 1000, 2000);
    //将整数限制在1000和2000之间
    Serial.print("串口输入= ");
    //在串行监视器上显示整数
    Serial.println(comInt);
    //以微秒为单位将整数写入伺服系统
    myServo.writeMicroseconds(comInt);
  }
}

实验串口返回情况
经多次实验测试,串口输入数字,小于等于1500时,2212无刷电机不会启动,输入1550时,开始低速转动,随着增大数字,电机转速越来越快。
 

18.jpg

实验场景图 

 

19.jpg

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机
 项目实验之三:测试42无刷减速电机(减速比为100:1)

 

20.jpg

实验开源代码

 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百二十七:PWM调速直流马达BLDC ESC 无刷电机
  项目实验之三:测试42无刷减速电机(减速比为100:1)
*/

#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
}

实验场景图  

 

21.jpg

实验记录视频

 

【花雕学编程】Arduino动手做(227)---测试42无刷行星齿轮减速电机(减速比为100:1)

 

https://www.bilibili.com/video/BV1LJsxepEqx/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987

 

评论

user-avatar
icon 他的勋章
    展开更多