问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

直流电机最全解析:Arduino控制直流电机入门指南

创作时间:
作者:
@小白创作中心

直流电机最全解析:Arduino控制直流电机入门指南

引用
CSDN
1.
https://blog.csdn.net/qq_66771136/article/details/144733247

本文详细介绍了直流电机的参数、驱动方法以及使用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);
}  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号