目录
本文参考了从零开始怎样让步进电机转起来(上)_哔哩哔哩_bilibili
电路
材料清单
从某宝购买:
42步进电机,附送6pin转4pin杜邦线
电机驱动,盒子形状的,与电机同一个店家
杜邦线若干,面包板一块
arduino uno,及相应的usb数据线
上位机一台
可调直流电源一台,最大输出电路不少于2A
组装电路
1 将驱动器的S1 S2 S3 设为On On Off; S4 S5 S6 设为On Off Off
2 杜邦线的6pin端插入步进电机;
驱动器的A+端连接杜邦线4pin端的红线;
驱动器的A-端连接杜邦线4pin端的蓝线;
驱动器的B+端连接杜邦线4pin端的绿线;
驱动器的B-端连接杜邦线4pin端的黑线
3 选择面包板的边缘的一条线作为公共地。将arduino的GND插入公共地。驱动器的EN-, DIR-, PUL-三个电极也插入这个公共地。
关于接地,这里有一处处理不正确,后续改正了:驱动器的GND、直流电源的负极也要连入公共地,不能让两者(驱动器的GND、直流电源的负极)绕过公共地直连,否则电机不能转动。
4 EN+通过200Ohm电阻接入arduino 7; DIR+通过200Ohm电阻接入arduino 6; PUL+通过100Ohm电阻接入arduino 5。 这里是否要接电阻还有疑问,见文末的讨论。
5 arduino接入上位机
6 直流电源的正负两极输出分别接入驱动器的Vcc和GND。随后接通直流电源。
7 烧写arduino程序。
软件
采用arduino IDE 1.8.10
这里INTERVAL的含义是脉冲的宽度,单位us。
这里INTERVAL至少是300,假如是200us,则电机不能转动。
#define INTERVAL 300
#define DELAY 200
void setup() {
// put your setup code here, to run once:
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(6, HIGH);
for(int k = 0; k < 200; k++)
{
digitalWrite(5, HIGH);
delayMicroseconds(INTERVAL);
digitalWrite(5, LOW);
delayMicroseconds(INTERVAL);
}
delay(DELAY);
digitalWrite(6, LOW);
for(int k = 0; k < 200; k++)
{
digitalWrite(5, HIGH);
delayMicroseconds(INTERVAL);
digitalWrite(5, LOW);
delayMicroseconds(INTERVAL);
}
delay(DELAY);
}
效果
arduino控制42步进电机
存在的问题
电阻的问题
在本实验中,arduino 的pin 5,6,7与PUL+,DIR+,EN+通过电阻相连,如下:
这样是否使得电机对脉冲的响应变慢?是否可以改为如下?
电机响应速度问题
在上一篇博客arduino实现42步进电机运动控制(一)-CSDN博客里,我采用1/8细分的方式步进。脉冲的宽度为100us.我嫌这样步进太慢,所以在本篇博客里使用完整步进。但是发现INTERVAL也随之增加为300us,否则会丢步。所以电机转完一周的速度并没有线性的提升8倍。
最大供电电流
实测发现,增加INTERVAL的值,直流电源的输出电流随之增加。所以我特意把直流电源的最大输出电流设为5amp,确保电源可以承担负载。