本帖最后由 大懒猫 于 2023-12-26 20:36 编辑

网上订的电机拿到手了,迫不及待接到测试电路上进行测试。使用ESP8266开发板,在Arduino IDE下编程测试,励磁模式:DMODE0=ON,DMODE1=ON,DMODE2=OFF,即Step=1模式,脉冲周期4ms。实际测试中发现,2ms模式,电机不转,按理说,远未达到100kHz的上限啊。
一、电机参数
图片1.png
电机规格 : 42 步进电机
电机厚度 : 26.5 MM
电机轴径 : 5 MM
输出轴长度 : 20 MM
电机线长 :大约 300 MM(线是原装的)
电机重量 :大约 149.5 克
电机类型 :二相四线(需要外加步进驱动器才能运转)
(红线 :A+    黄线 :A-      蓝线 :B+     桔红线 :B-)
电机内阻值 :大约 55.3 欧
12V 短路电流 :0.215 A
二、接线情况
2.jpg
三、代码
// 双极步进电机驱动板处理程序
// 使用东芝: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();
}