网上订的电机拿到手了,迫不及待接到测试电路上进行测试。使用ESP8266开发板,在Arduino IDE下编程测试,励磁模式:DMODE0=ON,DMODE1=ON,DMODE2=OFF,即Step=1模式,脉冲周期4ms。实际测试中发现,2ms模式,电机不转,按理说,远未达到100kHz的上限啊。
一、电机参数
电机规格 : 42 步进电机
电机厚度 : 26.5 MM
电机轴径 : 5 MM
输出轴长度 : 20 MM
电机线长 :大约 300 MM(线是原装的)
电机重量 :大约 149.5 克
电机类型 :二相四线(需要外加步进驱动器才能运转)
(红线 :A+ 黄线 :A- 蓝线 :B+ 桔红线 :B-)
电机内阻值 :大约 55.3 欧
12V 短路电流 :0.215 A
二、接线情况
三、代码
// 双极步进电机驱动板处理程序
// 使用东芝:TB67S109A
#define MOTOR_EN 16
#define MOTOR_CLK 5
#define MOTOR_DIR 4
#define MOTOR_MO 0
#define MOTOR_ALE 2
// D0~D8对应的GPIO,可做IO使用。
uint8_t gpio_io[]={16, 5,4,0,2,14,12,13,15};
void setup() {
// uint8_t i=0;
// for(i=0;i<9;i++) {
// pinMode(gpio_io, OUTPUT); // 输出
// digitalWrite(gpio_io, HIGH); // 灭掉
// }
pinMode(MOTOR_EN, OUTPUT); // 输出
pinMode(MOTOR_CLK, OUTPUT); // 输出
pinMode(MOTOR_DIR, OUTPUT); // 输出
pinMode(MOTOR_MO, INPUT); // 输出
pinMode(MOTOR_ALE, INPUT); // 输出
digitalWrite(MOTOR_EN, LOW); // 禁止
}
// 顺时针旋转
void rotate_s() {
uint32_t i=0;
digitalWrite(MOTOR_DIR, LOW); // 方向
digitalWrite(MOTOR_CLK, LOW);
digitalWrite(MOTOR_EN, HIGH); // 允许
// 发出3200个脉冲
for (i=0; i<3200; i++) {
//delayMicroseconds(1800);
delay(2);
digitalWrite(MOTOR_CLK, HIGH);
//delayMicroseconds(1800);
delay(2);
digitalWrite(MOTOR_CLK, LOW);
}
digitalWrite(MOTOR_EN, LOW); // 禁止
}
// 逆时针旋转
void rotate_n() {
uint32_t i=0;
digitalWrite(MOTOR_DIR, HIGH); // 方向
digitalWrite(MOTOR_CLK, LOW);
digitalWrite(MOTOR_EN, HIGH); // 允许
// 发出3200个脉冲
for (i=0; i<3200; i++) {
//delayMicroseconds(1800);
delay(2);
digitalWrite(MOTOR_CLK, HIGH);
//delayMicroseconds(1800);
delay(2);
digitalWrite(MOTOR_CLK, LOW);
}
digitalWrite(MOTOR_EN, LOW); // 禁止
}
void loop() {
delay(2000);
rotate_s();
delay(2000);
rotate_n();
}
在这个处理逻辑下,电机可以实现每隔2秒进行反转。然后将脉冲周期改成delayMicroseconds(1800);方式处理时,工作就不正常了,始终保持一个方向转动。
然后把每次3200个脉冲,改成256个脉冲,测试正常。这是否说明,即使设置了转动方向DIR,但只要起步位置不合适的时候,并不能完成期待的转动方向呢?为了验证,又来回测试两遍后,现象就不再重现了。结果中间又出现不转的现象,换了电机也一样。百思不得其解。最后拆除了控制板和驱动板之间VCC的连接,只保留GND和那几个输入输出控制线,程序改为如下形式,测试了几便后,一直都很正常。
// 双极步进电机驱动板处理程序
// 使用东芝:TB67S109A
#define MOTOR_EN 16
#define MOTOR_CLK 5
#define MOTOR_DIR 4
#define MOTOR_MO 0
#define MOTOR_ALE 2
#define STEPS 132
#define CLOCK_US 1800
// D0~D8对应的GPIO,可做IO使用。
uint8_t gpio_io[]={16, 5,4,0,2,14,12,13,15};
void setup() {
pinMode(MOTOR_EN, OUTPUT); // 输出
pinMode(MOTOR_CLK, OUTPUT); // 输出
pinMode(MOTOR_DIR, OUTPUT); // 输出
pinMode(MOTOR_MO, INPUT); // 输入
pinMode(MOTOR_ALE, INPUT); // 输入
digitalWrite(MOTOR_CLK, LOW); // 输出
digitalWrite(MOTOR_EN, LOW); // 禁止
}
// 顺时针旋转
void rotate_s() {
uint32_t i=0;
digitalWrite(MOTOR_DIR, LOW); // 方向
digitalWrite(MOTOR_CLK, LOW);
digitalWrite(MOTOR_EN, HIGH); // 允许
// 发出STEPS个脉冲
for (i=0; i<STEPS; i++) {
delayMicroseconds(CLOCK_US);
digitalWrite(MOTOR_CLK, HIGH);
delayMicroseconds(CLOCK_US);
digitalWrite(MOTOR_CLK, LOW);
}
digitalWrite(MOTOR_EN, LOW); // 禁止
}
// 逆时针旋转
void rotate_n() {
uint32_t i=0;
digitalWrite(MOTOR_DIR, HIGH); // 方向
digitalWrite(MOTOR_CLK, LOW);
digitalWrite(MOTOR_EN, HIGH); // 允许
// 发出STEPS个脉冲
for (i=0; i<STEPS; i++) {
delayMicroseconds(CLOCK_US);
digitalWrite(MOTOR_CLK, HIGH);
delayMicroseconds(CLOCK_US);
digitalWrite(MOTOR_CLK, LOW);
}
digitalWrite(MOTOR_EN, LOW); // 禁止
}
void loop() {
delay(3000);
rotate_s();
delay(3000);
rotate_n();
}