这是个几年前流行的老话题了,因为有个断了的丝锥要打掉,所以我也做了一个。
第一版是用arduino nano在面包板上做的,用的L293D电机驱动扩展板和28BYJ-48减速电机,机械装置是光驱做的,电源是明伟改的27v可调电源,很容易就验证了方案是可行的,不过没法连续放电,效率太低,而且面包板很容易接触不良,出各种问题。27v电压也太低了,电压低的后果是放电间隙也相应减小,更难控制。
第二版用的arduino pro mini,和L298N板子焊在一起,控制部分用了3个开关,分别是升降和自动,还有3个可调电阻,用来控制进给速度,放电电流和快慢进给切换。为了能连续放电,用了94E霍尔侦测放电电流。电源也换成了48v充电器。目前还不能稳定连续放电,不是特别理想,基本是重复放电-短路循环,不过用美工刀片试了一下,10分钟不到就能打穿,应该可以用了。
网上好像还没有分享出来的单片机控制程序,这个其实重要的是控制思路,也没啥好藏着掖着的。
具体的连线可以看程序中的注释。
// 电火花加工,步进电机送料控制系统--自动版
// 使用Arduino pro mini + L298N + 28BYJ-48减速电机(电压5~12v,USB无法驱动)
// 20180828 从nano转到pro mini
// 电机引线顺序 blue(out1)-pink(out2)-yellow(out3)-orange(out4)
// 使用D8/9/10/11与Arduino相连
// pin4-向上, 3-自动开关,2-向下
// pinA0(14)-进给速度控制,A1(15)-火花放电参考电压/进给停止电压,A2(16)-快速进给停止电压/转慢速进给电压,A3(17)-霍尔电压代表工作状态
int pin0 = 8;
int pin1 = 9;
int pin2 = 10;
int pin3 = 11;
int swdown = 2; // 2-向下
int swauto = 3; // 3-自动进给开关
int swup = 4; // 4-向上
int pinspeed = 14; //A0/14-分压表示进给速度
int pinsparkvoltage = 15; //A1(15)-火花放电参考电压/进给停止电压
int pinmovevoltage = 16; //A2(16)-快速进给停止电压/转慢速进给电压
int pinhol = 17; // A3(17)-霍尔电压代表工作状态
bool running1 = false; //自动进给开关
bool running2 = false;
unsigned long time1; //进给速度控制中间变量
unsigned long time2;
unsigned long time3; //电机正常转动控制中间变量
unsigned long time4;
int safevoltage = 490; //短路电流对应电压
int _step = 0 ;
int stepperSpeed = 1500;//电机转速,XX us一步, larger than 1500um
int run(int stepa) {
switch (stepa) {
case 0:
digitalWrite(pin0, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, HIGH);
break;
case 1:
digitalWrite(pin0, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, HIGH);
break;
case 2:
digitalWrite(pin0, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, LOW);
break;
case 3:
digitalWrite(pin0, LOW);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, LOW);
break;
case 4:
digitalWrite(pin0, LOW);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
break;
case 5:
digitalWrite(pin0, HIGH);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
break;
case 6:
digitalWrite(pin0, HIGH);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
break;
case 7:
digitalWrite(pin0, HIGH);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, HIGH);
break;
default:
digitalWrite(pin0, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
delay(1000);
break;
}
}
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
pinMode(LED_BUILTIN, OUTPUT); //Pin13,LED
pinMode(pinspeed, INPUT); //A0/14-分压表示进给速度
pinMode(pinsparkvoltage, INPUT); //A1(15)-火花放电参考电压/进给停止电压
pinMode(pinmovevoltage, INPUT); //A2(16)-快速进给停止电压/转慢速进给电压
pinMode(pinhol, INPUT); // A3(17)-霍尔电压代表工作状态
pinMode(pin0, OUTPUT); //电机控制
pinMode(pin1, OUTPUT); //电机控制
pinMode(pin2, OUTPUT); //电机控制
pinMode(pin3, OUTPUT); //电机控制
pinMode(swdown, INPUT);
pinMode(swauto, INPUT);
pinMode(swup, INPUT);
time1 = millis();
time2 = millis();
time3 = micros();
time4 = micros();
}
void loop() {
/*
//参数输出
Serial.print("hol,");
Serial.print(analogRead(pinhol));
Serial.print(",");
Serial.print("pinmovevoltage,");
Serial.print(analogRead(pinmovevoltage));
Serial.print(",");
Serial.print("pinsparkvoltage,");
Serial.print(analogRead(pinsparkvoltage));
Serial.print(",");
Serial.print("safevoltage,");
Serial.print(safevoltage);
Serial.print(",");
Serial.print("pinspeed,");
Serial.println(analogRead(pinspeed));
*/
while (digitalRead(swauto) == HIGH) {
running2 = !running1;
}
running1 = running2;
if (running1 == true) { //自动模式
//快进
if (((analogRead(pinhol) < analogRead(pinmovevoltage)) && (analogRead(pinmovevoltage) < analogRead(pinsparkvoltage))) && (analogRead(pinsparkvoltage) < safevoltage)) {
time4 = micros() ;
if ((time4 - time3) > stepperSpeed) {
// digitalWrite(LED_BUILTIN, HIGH);
_step--;
// Serial.println(_step);
if (_step < 0) {
_step = 7;
}
run(_step);
time3 = micros() ;
// Serial.println("fast down!");
// digitalWrite(LED_BUILTIN, LOW);
}
}
//慢进
if ((analogRead(pinhol) < analogRead(pinsparkvoltage)) && (analogRead(pinhol) > analogRead(pinmovevoltage)) && (analogRead(pinmovevoltage) < analogRead(pinsparkvoltage)) && (analogRead(pinsparkvoltage) < safevoltage)) {
time2 = millis();
if ((time2 - time1) > analogRead(pinspeed)) { //根据pinspeed脚的电压,等待0~1023毫秒
digitalWrite(LED_BUILTIN, HIGH);
_step--;
// Serial.println(_step);
if (_step < 0) {
_step = 7;
}
run(_step);
time1 = millis();
// Serial.println("slow down!");
digitalWrite(LED_BUILTIN, LOW);
}
}
//火花放电
if ((analogRead(pinhol) > analogRead(pinsparkvoltage)) && (analogRead(pinhol) < safevoltage) && (analogRead(pinmovevoltage) < analogRead(pinsparkvoltage)) && (analogRead(pinsparkvoltage) < safevoltage)) {
Serial.println("spark!");
}
//短路,快退
while (analogRead(pinhol) > safevoltage) {
time4 = micros() ;
if ((time4 - time3) > stepperSpeed) {
// digitalWrite(LED_BUILTIN, HIGH);
_step++;
// Serial.println(_step);
if (_step > 7) {
_step = 0;
}
run(_step);
time3 = micros() ;
// Serial.println("fast up!");
// digitalWrite(LED_BUILTIN, LOW);
}
}
}
while (digitalRead(swup) == HIGH) {
time4 = micros() ;
if ((time4 - time3) > stepperSpeed) {
// digitalWrite(LED_BUILTIN, HIGH);
_step++;
// Serial.println(_step);
if (_step > 7) {
_step = 0;
}
run(_step);
time3 = micros() ;
// Serial.println("continue up!");
// digitalWrite(LED_BUILTIN, LOW);
}
} //swup开关按下时,持续向上
while (digitalRead(swdown) == HIGH) {
time4 = micros() ;
if ((time4 - time3) > stepperSpeed) {
// digitalWrite(LED_BUILTIN, HIGH);
_step--;
// Serial.println(_step);
if (_step < 0) {
_step = 7;
}
run(_step);
time3 = micros() ;
// Serial.println("continue down!");
// digitalWrite(LED_BUILTIN, LOW);
}
} //swdown开关按下时,持续向下
}