Arduino DRV8825驱动两相步进电机
原文链接:https://www.yourcee.com/newsinfo/2928457.html
DRV8825步进电机驱动
DRV8825是一款电机驱动芯片,为打印机,扫描仪和其他自动化设备应用提供了集成的电机驱动器解决方案,它具有两个H桥驱动器和一个微步进分度器,用于驱动双极步进电机。DRV8825能够从每个输出驱动高达2.5 A的电流。
DRV8825的特点
- 适合驱动8.2V~45V 2.5A一下的步进电机;
- 只有简单的步进和方向控制接口;
- 六个不同的步进模式: 全步、半步、1/4步、1/8步、1/16步、1/32步;
- 自带电位器可调节电流输出,从而获得更高的步进率
- 自动电流衰减模式检测/选择;
- 过热关闭电路,欠压锁定,交叉电流保护。
相对于4988的特点优势
- 驱动电流高达2.5A
- 支持最大32细分
- 4层PCB板,散热良好
- 芯片内阻更小,发热低,散热性好
DRV8825驱动步进电机注意事项
细分
M0 | M1 | M2 | |
---|---|---|---|
L | L | L | 全步 |
H | L | L | 半步 |
L | H | L | 1/4步 |
H | H | L | 1/8步 |
L | L | H | 1/16步 |
H | L | H | 1/32步 |
L | H | H | 1/32步 |
H | H | H | 1/32步 |
引脚说明
- vmot 和 GND MOT 为电动机提供电源接口,可输入8.2V 至 45V;
- M0、M1、M2细分逻辑电平输入引脚,可根据上表输入相应的逻辑电平调节电机的步进角;
- DIR,控制电机转动方向的引脚,在该引脚输入高电平,电机顺时针旋转;输入低电平,电机逆时针旋转
- STEP/STP控制电机转动的脉冲输入引脚,输入脉冲的频率越高,电机的旋转速度越快;
- SLP,该引脚控制驱动的睡眠模式,低电平有效,当把该引脚拉低时驱动器 进入睡眠模式;
- RST,复位引脚,低电平有效
- EN,使能引脚,低电平有效,当给该引脚输入低电平时驱动器使能,默认 情况下,此引脚被拉低,因此驱动器始终处于使能状态
- FAULT,用于过流保护或热关断,当禁用H桥FET时,该引脚输出低电平
- A1、A2、B1、B2为接电机的输出引脚
Arduino配合DRV8825驱动步进电机
本次实验实现步进电机在“全步”模式下一步一步清楚的顺时针走一圈接着逆时针走一圈。
接线
Arduino UNO | DRV8825驱动 | 步进电机 | 电源 |
---|---|---|---|
D2 | DIR | ||
D3 | STP | ||
D4 | SLP | ||
D5 | RST | ||
D6 | M2 | ||
D7 | M1 | ||
D8 | M0 | ||
GND | GND LOGIC | ||
1A | A+ | ||
2A | A- | ||
1B | B+ | ||
2B | B- | ||
VMOT | VCC | ||
GND MOT | GND |
表格里的电源可根据实际情况接入,8.2V 至 45V能驱动你的步进电机就行⊙︿⊙
(步进电机的几根线很乱原谅一下╮(╯_╰)╭ )
实验代码
#define DIR 2 //DIR 控制步进电机正反转
#define STP 3 //PWM输入,控制步进 *为了更好的控制PWM频率,下面会用到自定义PWM的方法,所以这个引脚不一定要连接在PWM引脚*
#define SLP 4 //睡眠
#define RST 5 //复位
#define M2 6 //细分调节
#define M1 7 //细分调节
#define M0 8 //细分调节
/*
M0 M1 M2 细分
L L L 全步 1.8度
H L L 半步
L H L 1/4步
H H L 1/8步
L L H 1/16步
H L H 1/32步
L H H 1/32步
H H H 1/32步
*/
void setup() {
// put your setup code here, to run once:
pinMode(DIR, OUTPUT);
pinMode(STP, OUTPUT);
pinMode(SLP, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M1, OUTPUT);
pinMode(M0, OUTPUT);
digitalWrite(SLP, HIGH); //唤醒驱动
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int i = 0; //用于计算步数
/*全步正转360度*/
while (i < 200)
{
digitalWrite(DIR, HIGH); //正转
digitalWrite(RST, HIGH);
//细分
digitalWrite(M2, LOW);
digitalWrite(M1, LOW);
digitalWrite(M0, LOW);
digitalWrite(STP, HIGH);
delayMicroseconds(100);
digitalWrite(STP, LOW);
delay(500); //若想要改变电机转动的速度 可以通过改变这个延时实现
i++;
Serial.println(i);
}
/*全步反转360度*/
while (i > 0)
{
digitalWrite(DIR, LOW); //反转
digitalWrite(RST, HIGH);
//细分
digitalWrite(M2, LOW);
digitalWrite(M1, LOW);
digitalWrite(M0, LOW);
digitalWrite(STP, HIGH);
delayMicroseconds(100);
digitalWrite(STP, LOW);
delay(500);
i--;
Serial.println(i);
}
}
两相步进电机,由于全步模式,所以每一步是1.8度,因此转360度为200步。
可通过查看串口打印“i”的值来验证打印到200时是否是一圈。
通过更改
digitalWrite(STP, LOW);
delay(500);
中的delay()参数来模拟增加或减小脉冲的频率从而改变步进电机的转动速度。