智能设备常用电机入门指南(实物+原理图)
一、电机的类型
智能设备如机器人中最常用的电机类型
- AC motor 交流电动机
- Brushed DC motor 有刷直流电机
- Brushless DC motor 无刷直流电机
- Geared DC motor 减速电机 (齿轮式直流电机)
- Servo motor 伺服电机
- Stepper motor 步进电机
- DC Linear Actuator 直流直线推杆
智能设备很少使用交流(交流电)电机,因为大多数智能设备如机器人使用的是来自电池的直流电。此外,由于电子元件使用直流,可以更方便的使用直流电源供电。交流电动机主要用于需要很大扭矩的工业环境,或者电动机连接到电源插座/墙壁插座的环境。所以,我不会在这里解释交流电动机。
二、电机控制器
- 有刷直流电机控制器: 用于有刷直流电机,减速电机,以及许多直线推杆
- 无刷直流电机控制器
- 伺服电机控制器
- 步进电机控制器
三、有刷直流电机
有刷直流电机由六个不同的部件组成: 轴、电枢/转子、换向器、定子磁铁和电刷。有刷直流电机由两块磁铁组成,磁铁面向同一个方向,绕在有刷直流电机中间的两个线圈,绕在转子周围。线圈的位置是面向磁铁,导致电流流向他们。这会产生一个磁场,最终将线圈推离它们所面对的磁铁,并导致转子转动。
优点:
便宜,轻量级,合理高效,良好的低速据矩,常用于玩具等
缺点:
噪音,另外电流噪声可能会影响电路
三、有刷直流电机控制
我所说的控制是指方向控制和速度控制。直流电动机的方向可以通过简单地反转电池连接的极性来反转。通过改变电压电平可以控制电机的转速,通过 PWM 信号可以改变直流电压电平。对于较高的电压电平速度会较高,对于较低的电压电平速度也会较低。
实际上,驱动电路用于需求速度控制的应用当中。驱动电路的作用是为控制器提供一种改变 BDC 电机电流的方法。控制器通过脉宽调制电压提供给 BDC 电机。与传统的模拟控制方法相比,这是一种更有效的方法。在某些情况下,电机只需要旋转一个方向,那么单一的开关拓扑与 PWM 调制就可以用来改变电机的电压,从而控制其速度。PWM 占空比越高,电机运转速度越快。下图显示了使用单个 FET (场效应晶体管)单向驱动 BDC 电机的电路。
请注意,在电路中有一个二极管穿过马达。这种二极管是为了防止反向电磁磁通(BEMF)电压损害 MOSFET(场效应晶体管)。电机转动时产生反电势。当 MOSFET (场效应晶体管)被关闭时,电机中的绕组仍然在此处充电并产生反向电流。必须对 D1进行适当的额定,这样它才能消散这个电流。图中的电阻 R1和 R2对电路的运行很重要。R1保护微控制器不受电流尖峰的影响,而 R2确保当输入引脚被触发时晶体管被关闭。
当需要定位或需要两个方向的旋转(大多数机器人需要) ,一个H桥与 PWM 控制是使用。H桥是一个4晶体管电路,允许你反向电流的电动机。通过一个H桥和一个 PWM 引脚,你可以同时控制电机的速度和方向。
四、H桥
![](https://content.instructables.com/FZ0/KZET/II3H9UZ7/FZ0KZETII3H9UZ7.png)
H 桥的基本工作模式相当简单: 如果启动 Q1和 Q4,电机的左引线将连接到电源,而右引线连接到地。电流开始通过电动机流动,电动机在(让我们说)的正向方向和电动机轴开始旋转。如果启动 Q2和 Q3,就会发生相反的情况,电机在相反的方向通电,轴就开始向后旋转。
在桥牌中,永远不要同时关闭 Q1和 Q2(或 Q3和 Q4)。如果你这样做,你只是创造了一个真正的低电阻之间的电源和 GND 路径,有效地短路您的电源供应。这种情况被称为“射穿” ,几乎可以肯定地说,这种方式能够迅速摧毁你的桥梁,或者你电路中的其他东西。
H 桥集成电路有多种型号和品牌可供选择。最常用的是德州仪器 L293NE 或德州仪器 SN754410和 L298意法半导体。
六、Arduino 直流电机控制
正如你已经知道的,直流电动机不能直接连接到 arduino 引脚,因为它会烧伤你的 arduino。所以你必须在 arduino 和马达之间连接一个晶体管。让我们先用单晶体管来控制一个小型的直流电动机。使用单晶体管你知道只有速度可以控制。PWM 是用来控制直流电动机的速度。如图1所示连接电路。Arduino 的 PWM 引脚必须连接到晶体管的基极引脚上。
/* Single transistor DC Motor control */ int motorPin = 3; int speed = 100; void setup() { pinMode(motorPin, OUTPUT); } void loop() { // analogWrite() function is used to generate PWM signal. // speed define the duty cycle of the PWM. // if the speed = 0 means duty cycle is 0 and motor is off // the maximum value of speed can be 255, then motor will run with maximum speed analogWrite(motorPin, speed); delay(1000); // wait 1 sec analogWrite(motorPin, 175); delay(1000); analogWrite(motorPin, 255); // maximum speed delay(1000); }
现在,使用 h 桥 IC 连接电机(我在这里使用 L293)。图3及图4。现在我们可以同时控制速度和方向了。采用引脚9作为 PWM 引脚,并增加一个开关控制速度。
const int switchPin = 2; // switch input const int motor1Pin = 3; // H-bridge leg 1 (pin 2, 1A) const int motor2Pin = 4; // H-bridge leg 2 (pin 7, 2A) const int enablePin = 9; // H-bridge enable pin //In the setup(), set all the pins for the H-bridge as outputs, //and the pin for the switch as an input. The set the enable pin high //so the H-bridge can turn the motor on. void setup() { // set the switch as an input: pinMode(switchPin, INPUT); // set all the other pins you're using as outputs: pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(ledPin, OUTPUT); // set enablePin high so that motor can turn on: digitalWrite(enablePin, HIGH); } //In the main loop() read the switch. If it’s high, //turn the motor one way by taking one H-bridge pin high and the other low. // If the switch is low, reverse the direction by reversing the states of // the two H-bridge pins. void loop() { // if the switch is high, motor will turn on one direction: if (digitalRead(switchPin) == HIGH) { digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high } // if the switch is low, motor will turn in the other direction: else { digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge high digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge low } }
L293是一种双 h 桥集成电路。因此,可以通过单片集成电路控制两台电机。如图5所示,将两台电机连接到集成电路上,并使用以下代码。根据您的要求进行修改。
/* * created by Md. Khairul Alam * Control 2 DC motors with arduino * 2015 */ int motor1Pin1 = 3; // pin 2 on L293D IC int motor1Pin2 = 4; // pin 7 on L293D IC int motor1EnablePin = 6; // pin 1 on L293D IC int motor2Pin1 = 8; // pin 10 on L293D IC int motor2Pin2 = 9; // pin 15 on L293D IC int motor2EnablePin = 11; // pin 9 on L293D IC int Speed = 100; void setup() { // sets the pins as outputs: pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor1EnablePin, OUTPUT); pinMode(motor2Pin1, OUTPUT); pinMode(motor2Pin2, OUTPUT); pinMode(motor2EnablePin, OUTPUT); // sets enable1Pin and enable2Pin high so that motor can turn on: //digitalWrite(Motor1EnablePin, HIGH); //digitalWrite(Motor2EnablePin, HIGH); // initialize serial communication at 9600 bits per second: Serial.begin(9600); } void loop() { //write your code here } void forword(){ // run two motor in forward direction digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, HIGH); analogWrite(motor1EnablePin, Speed); analogWrite(motor2EnablePin, Speed); //Serial.println("Go Forward!"); } void backword(){ // run two motor in reverse direction digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); digitalWrite(motor2Pin1, HIGH); digitalWrite(motor2Pin2, LOW); analogWrite(motor1EnablePin, Speed); analogWrite(motor2EnablePin, Speed); //Serial.println("Go Reverse!"); } void turnRight(){ // motor 1 off, motor 2 forward digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, HIGH); analogWrite(motor1EnablePin, Speed); analogWrite(motor2EnablePin, Speed); //Serial.println("Turn Right"); } void turnLeft(){ // motor 2 off, motor 1 forward digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); analogWrite(motor1EnablePin, Speed); analogWrite(motor2EnablePin, Speed); //Serial.println("Turn Left"); } void Stop(){ two motor off digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); analogWrite(motor1EnablePin, Speed); analogWrite(motor2EnablePin, Speed); //Serial.println("Stop"); }
七、减速电机(直流齿轮马达)
减速电机(齿轮直流电机) 可以定义为直流电机的延伸,减速直流电机有一个连接到电机的齿轮组件。电机的转速是以每分钟轴的转速计算的,称为 RPM。齿轮总成有助于增加扭矩和减少速度。使用齿轮组合可以使速度降低到任何理想的数字。齿轮减速的概念是减少转轴的速度,但增加其扭矩,这被称为齿轮减速。直流电机在一定的电压范围内工作。输入电压越高,马达的转速就越高。例如,如果电机工作在6-12V 的范围内,那么6V时为最低转速,12v时为最高。在电压方面,我们可以把方程式设为: RPM = K1 * v,其中,K1 = 感应电压常数 ,v = 外加电压。
齿轮的工作是非常有趣的。这可以用角动量守恒定律原理来解释。半径较小的齿轮比半径较大的齿轮获得更多的 RPM。然而,较大的齿轮会给较小的齿轮带来更多的扭矩,反之亦然。输入齿轮(传输能量的齿轮)与输出齿轮之间的角速度比给出了齿轮比。当多个齿轮连接在一起时,也遵循能量守恒。另一个齿轮的旋转方向总是与其相邻的齿轮的旋转方向相反。在任何直流电机中,转速和扭矩成反比。因此,齿轮有更多的扭矩将提供一个较低的转速和逆向。在齿轮直流电动机中,采用了脉宽调制的概念。
例如,一个无负载的直流电动机可以每分钟12000转,提供0.1公斤-厘米的扭矩。增加225:1的齿轮减速比例降低速度和增加扭矩: 12000 rpm/225 = 53.3 rpm 和0.1 x 225 = 22.5 kg-cm。马达现在将能够移动更大的重量。
减速电机可以使用直流电机控制同样的方式来控制。
应用场景:
机器人小车
无线工具
优点:
减速,增大扭矩
限制:
低成本塑料齿轮传动系统与低压电机一起使用时,这个问题尤其突出。额外的阻力可以使这些齿轮系在低速时停滞不前。
八、直流无刷电动机
无刷直流电动机有很多名称: 无刷永磁体,永磁体交流电动机,永磁体同步电动机等。这种混淆的产生是因为直流无刷电动机不直接从直流电压源操作。然而,正如我们将看到的,基本的操作原理类似于直流电动机。
无刷直流电动机有一个带永磁体的转子和一个带绕组的定子。它本质上是一个由里向外翻转的直流电动机。电刷和换向器已被淘汰,绕组连接到控制电子。控制电子器件取代了换向器的功能,为适当的绕组提供能量。如动画所示,绕组以绕定子旋转的方式通电。带电的定子绕组引导转子磁铁,开关就像转子与定子对齐。没有火花,这是无刷直流电动机的一个优点。
直流电动机的电刷有几个局限性: 电刷寿命、电刷残留物、最大速度和电噪声。无刷直流电机具有更清洁、更快、更高效、噪音更小和更可靠的潜力。然而,无刷直流电动机需要电子控制。直流无刷电动机的结构非常类似于交流电机,使其成为真正的同步马达,但缺点是,它比同等的“刷”电机设计更昂贵。
外转子无刷电机与内转子无刷电机
有两种类型的无刷直流电机,外转子无刷电机与内转子无刷电机,永磁内转子无刷电机磁铁在内部,外转子在外部。马达转得越快,效率就越高,内转子电机转动非常快,比外转子电机效果高得多。因此常常电机和设备之间需要有一个减速变速装置。
操作理论
无刷电机的机械原理非常简单。唯一移动的部分是转子,其中包含的磁铁。事情变得复杂的地方是编排通电绕组的顺序。每个绕组的极性由电流方向控制。动画演示了控制器将遵循的一个简单模式。交流电改变极性,使每个绕组产生“推拉”效应。诀窍是保持这种模式与转子的速度同步。有两种(广泛使用的)方法可以实现这一点。大多数模型控制器测量产生的电压(反 EMI)在未通电的绕组。这种方法在高速运行时是非常可靠的。随着电机转速的降低,产生的电压变得难以测量,从而引起更多的误差。较新的电子控制器和许多工业控制器利用霍尔效应传感器,以测量磁铁的位置。这是控制电脑风扇的主要方法。
控制
无刷直流电机的控制与普通的有刷直流电机有很大的不同,它采用了一些方法来检测转子的角位置(或磁极) ,以产生控制半导体开关设备所需的反馈信号。最常见的位置/杆传感器是“霍尔效应传感器” ,但一些电机也使用光学传感器。利用霍尔效应传感器,通过电机控制驱动电路切换电磁铁的极性。然后电机可以很容易地同步到数字时钟信号,提供精确的速度控制。无刷直流电动机可以由一个外置永磁体转子和一个内置电磁铁定子或者一个内置永磁体转子和一个外置电磁铁定子构成。
在图4(a)中,标记为“001”的绿色绕组被激励为北极,标记为“010”的蓝色绕组被激励为南极。由于这种激励,南极的转子与绿色绕组和北极对齐红色绕组标记“100”。为了移动转子,“红”和“蓝”绕组按图4(b)所示方向通电。这使得红色绕组变成北极,蓝色绕组变成南极。这种定子磁场的移动产生扭矩,因为发展的斥力(红绕组-北-北对准)和吸引力(蓝绕组-北-南对准) ,移动转子在顺时针方向。
速度控制
直流无刷电动机实际上是三相交流电动机。为了控制速度,采用了电子速度控制或 ESC。无刷 ESC 系统基本上创建了一个三相交流输出的有限电压从板载直流电源输入,以运行无刷电机通过发送一系列的交流信号产生的 ESC 的电路,利用一个非常低的阻抗旋转。无刷电机,根据其物理结构被称为跑外或跑内,已经成为非常流行的“电子飞行”无线电控制航空模型爱好者,因为它们的效率,功率,寿命和重量比较传统的刷马达。然而,无刷交流电机控制器要比刷电机控制器复杂得多。
正确的相位随着电动机的旋转而变化,ESC 会考虑到这一点: 通常,电动机的反电动势是用来检测这种旋转的,但也存在使用磁性(霍尔效应)或光学探测器的变化。计算机可编程速度控制一般有用户指定的选项,允许设置低电压截止限制,时间,加速,制动和旋转方向。反向电动机的方向也可以通过切换任何两个从 ESC 到电动机的三个导线。
优点:
直流无刷电机的优势相比有刷是更高的效率,高可靠性,低电噪音,良好的速度控制和更重要的是,没有刷子或换向器磨损生产更高的速度。然而,它们的缺点是更昂贵和更复杂的控制。
Arduino 控制
无刷电机设计来遥控飞机和车辆,通常需要一个单独的控制器。这些通常是无传感器类型和使用标准伺服类型脉冲信号的速度控制。无刷直流电动机的控制非常简单。大多数静电干扰器需要一个50Hz 的频率,即20ms 的周期,速度取决于你提供的占空比。1毫秒将减少其速度到最低限度,甚至停止它(这取决于 ESC 模型) ,而一个2毫秒的脉冲将运行到最高速度。通过改变两者之间的值控制速度的变化。通常情况下,esc 需要的电压高于 Arduino 从他的5V 引脚提供的电压: 通常他们需要2个 LiPo 电池(大约8V)。为了达到这个目的,所有的电路都必须通过直接连接到 ESC 的外部电源供电,而不是通过将由 ESC 的 BEC 电路供电的 Arduino 供电。为了使这种情况发生,它足以连接红色和黑色的控制连接器到5V 和 GDN 的 Arduino 板。其余的电路非常简单: 从 Arduino 的引脚9我们有 ESC 的信号,进入引脚0,电位器的电压读数进来。
有时 ESC 需要校准,对于 ESC,校准手段设置的最大和最小速度的电机相对于最大和最小宽度的 PWM 信号发送的 Arduino。由 ESC 读取的 PWM 信号与伺服信号类型相同,这意味着来自 Adruino 的伺服库可用于校准和控制 ESC。ESC 根据高低信号的比率来设定电机的转速。校正涉及编程的 ESC,以了解 PWM 波对应的停止和最高速度的电机。
大多数伺服电机和 esc 的默认信号范围是在20毫秒的重复周期内1000到2000微秒之间的高信号宽度(假设是一个50赫兹的 PWM 信号)。对于四直升机,然而,我们希望尽可能广泛的范围,以允许更大的增量控制电机。为此,我们校准了 esc 读取信号宽度,从700微秒到2000微秒,700是停止速度,2000是最大速度。有些 ESC 无法读取低于700微秒的信号。
校准 esc 非常简单。进入编程模式,最大伺服信号(2000微秒)发送到 ESC,ESC 启动并等待两秒钟,然后发送最小伺服信号(700微秒)。一旦 ESC 发出一系列确认哔哔声(发送到发动机的特殊波形信号发出哔哔声) ,ESC 就会被校准(详情请参阅 ESC 特定数据表)。
// For calibrating you may use the following code snipet #include <Servo.h> #define MAX_SIGNAL 2000 #define MIN_SIGNAL 700 #define MOTOR_PIN 9 Servo motor; void setup() { Serial.begin(9600); Serial.println("Program begin..."); Serial.println("This program will calibrate the ESC."); motor.attach(MOTOR_PIN); Serial.println("Now writing maximum output."); Serial.println("Turn on power source, then wait 2 seconds and press any key."); motor.writeMicroseconds(MAX_SIGNAL); // Wait for input while (!Serial.available()); Serial.read(); // Send min output Serial.println("Sending minimum output"); motor.writeMicroseconds(MIN_SIGNAL); } void loop() { } // For controlling you may use the following code #include <Servo.h> // include servo library Servo esc; int throttlePin = 0; void setup() { esc.attach(9); } void loop() { int throttle = analogRead(throttlePin); // read from pot throttle = map(throttle, 0, 1023, 0, 179); esc.write(throttle); // throttle value define the speed of esc }
它只需要阅读的“油门” ,映射从0-1023到0-179(模拟读数到伺服“度”) ,然后通过伺服库发送到 ESC 。即使在它的这么简单,但它非常有用,当你想校准一个新的 ESC 与 Arduino 的伺服库一起工作。
应用场景:
无人机
无线控制车辆
磁盘驱动器
风扇
工业伺服系统
混合动力车辆
高端齿轮马达
优点:
安静
高效
限制:
需要单独的控制器来操作