直流电机最全解析:Arduino控制直流电机入门指南
直流电机最全解析:Arduino控制直流电机入门指南
本文详细介绍了直流电机的参数、驱动方法以及使用Arduino控制直流电机的代码实现。文章内容包括直流电机的基本参数解释、驱动板的使用方法(以L9110和L298N为例)、无PWM全速运行代码以及PWM控制电机的代码。文章结构清晰,内容详实,适合对直流电机控制感兴趣的初学者阅读。
1.直流电机的参数
我们先介绍选型直流电机所设计到的参数(不谈厂家虚标问题)。全面的了解直流电机的参数,才能让我们选择合适的电机以及相应的直流电机驱动器等。
参数 | 注释 |
---|---|
额定电压 | 电机正常运行时所需的工作电压 |
额定电流 | 电机在额定电压下的工作电流 |
额定功率 | 电机在额定条件下能够持续输出的最大功率 |
空载转速(RPM) | 电机在空载下的转速电机(厂家通常给的是空载转速)转速RPM(Revolutions Per Minute)表示电机每分钟转动的次数,即电机轴的旋转速率。1 RPM表示电机轴每分钟旋转一圈。 |
负载转速 | 电机在负载下的转速 |
扭矩 | 扭矩 = 力 × 力臂 5KG.cm就是 力臂是1cm的情况下能产生5KG的力 相当于一个1公斤的物体,作用在离旋转中心5厘米远的地方电机在额定负载下输出的转矩 KG.cm |
启动电流 | 电机启动时的初始电流 |
减速比(直流减速电机) | 减速比 = 输入转速 / 输出转速例如,如果输入转速为1500 RPM,输出转速为150 RPM,则减速比为10:1,意味着输出转速是输入转速的1/10 |
堵转电流 | 简单来说,就是电动机转子无法转动时流过电动机绕组的电流。(堵转电流大:通常是电动机额定电流的 5 到 7 倍,甚至更高 对电动机有损害:长期或频繁的堵转会对电动机造成过热损害,因此在设计和使用时,要避免长时间堵转。) |
2.直流电机的驱动
2.1电机的转动方向
驱动电机,简单来说就是电机的两根线一个给高 一个给低,电机都有一个电压范围,例如3-6V 如果给的电压高,转速就快,给的电压低,转速就慢. PWM控制电机转速就是基于这个原理.
下图中的1是高电平 (3-6V)
红 | 1(可PWM输出) | 0 | 1 | 0 |
---|---|---|---|---|
黑 | 0 | 1(可PWM输出) | 1 | 0 |
转向 | 正转 | 反转 | NO | NO |
直流电机的两条驱动线,一正一负即可驱动,可以直接用外接电源去测试测试一下,加深印象.
2.2驱动板的使用(需要注意的是 驱动板需要和单片机共地)
由于直流电机正常驱动时需要的电流过大,单片机是无法直接驱动的,这时候就需要电机驱动板来做介质,驱动板通过外接外部电源,单片机发送信号给驱动板,驱动板来驱动电机.
以下我以L9110和l298n这两个常用的驱动板做连线的介绍.
2.2.1L9110连线
电路板 | arduino | 外部电源 | 马达 |
---|---|---|---|
A-1(IN) | 9 | ||
A-2(IN) | 10 | ||
VCC | 5V | ||
GND | GND | GND | |
MOTOR-A-1(OUT) | 红 | ||
MOTOR-A-2(OUT) | 黑 |
马达的连线其实可以随意 ,你只要确定哪条是正转 哪条是反转即可,程序里面也可以修改.
2.2.2L298N连线
电路板 | arduino | 外部电源 | 马达 |
---|---|---|---|
IN1 | 9 | ||
IN2 | 10 | ||
12V供电 | 12V | ||
5V供电(这个可以给单片机供电) | VIN(如果供电,连接arduino的VIN) | ||
GND | GND | GND | |
OUT1(输出A) | 红 | ||
OUT2(输出A) | 黑 |
3.无PWM全速运行 代码
如果全速运行电机,就是给电机的红黑线 一个高电平一个低电平.以2.2.1L9110连线为例
电路板 | arduino |
---|---|
A-1(IN) | 9 |
A-2(IN) | 10 |
实现一秒正转一秒反转
#define IN1(a) digitalWrite(9,a)
#define IN2(a) digitalWrite(10,a)
void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}
void loop() {
motorForward();
delay(1000);
motorReverse();
delay(1000);
}
void motorForward()
{
IN1(1);
IN2(0);
}
void motorReverse()
{
IN1(0);
IN2(1);
}
void motorStop()
{
IN1(0);
IN2(0);
}
4.PWM控制电机 代码
L298n和L9110都支持PWM输入输出
4.1前进代码逻辑(这个是本人常用的,初学者也可以直接使用5.0代码)
这里我讲一个前进代码逻辑,方便理解整体代码,也为后续stm32控制直流电机打好基础.
我们PWM驱动电机的时候是讲电机的1路输出PWM 另外一路输出绝对的0 低电平,
就是说
void motorForward(int speed)
{
Timer1.pwm(9,speed);//先启动1路的PWM
pinMode(10,OUTPUT);//再将另外一路设置为普通的输出,然后输出低电平
IN2(0);//输出低电平
}
这样可以实现PWM的真反转自由切换, 如果两路PWM
#define IN1(a) digitalWrite(9,a)
#define IN2(a) digitalWrite(10,a)
#include <TimerOne.h>
void setup() {
Timer1.initialize(100);//周期100us
Serial.begin(115200);
}
void loop() {
motorForward(300);
delay(1000);
motorReverse(300);
delay(1000);
}
void motorForward(int speed)
{
Timer1.pwm(9,speed);//0-1023 控制占空比
pinMode(10,OUTPUT);
IN2(0);
}
void motorReverse(int speed)
{
Timer1.pwm(10,speed);//0-1023 控制占空比
pinMode(9,OUTPUT);
IN1(0);
}
void motorStop()
{
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
IN1(0);
IN2(0);
}
5.0 另一种控制代码 (两路全是PWM)
void motorForward(int speed)
{
Timer1.pwm(9,speed);//0-1023 控制占空比
Timer1.pwm(10, 0);
// pinMode(10,OUTPUT);
// IN2(0);
}
#define IN1(a) digitalWrite(9,a)
#define IN2(a) digitalWrite(10,a)
#include <TimerOne.h>
void setup() {
Timer1.initialize(100);//周期100us
Serial.begin(115200);
}
void loop() {
motorForward(600);
delay(1000);
motorReverse(600);
delay(1000);
}
void motorForward(int speed)
{
Timer1.pwm(9,speed);//0-1023 控制占空比
Timer1.pwm(10, 0);
// pinMode(10,OUTPUT);
// IN2(0);
}
void motorReverse(int speed)
{
Timer1.pwm(10,speed);//0-1023 控制占空比
Timer1.pwm(9, 0);
// pinMode(9,OUTPUT);
// IN1(0);
}
void motorStop()
{
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
IN1(0);
IN2(0);
}