基于单片机控制的电火花打孔机

分享一下前段时间制作的单片机+步进电机控制的电火花打孔机,下面是源程序。电路设计当时不注意保存,现找不到了,但控制思路是利用高速比较器lm319(lm339速度达不到要求)检测火花输出端电压,以判断开路、短路及正常工作状态,将信号反馈给单片机的开路检测端和短路检测端,从而控制步进电机的精确进给。希望能给电火花打孔爱好者一点帮助。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code smg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar c,n,t,m,tt=2,dd=2,fm=10;
uint a,b=24000,r,s,q;
sbit SN=P2^0; /*****电机受控信号**************************************/
sbit JGLSZ=P2^1; /*****加工量设置指示**************************************/
sbit MCSZ=P2^2; /*****脉冲设置指示**************************************/
sbit BJ=P2^3; /************报警蜂鸣*******************************/
sbit GW=P2^6; /*****数码管个位**************************************/
sbit SW=P2^7; /*****数码管十位**************************************/
sbit QR=P3^0; /*****设置确认键**************************************/
sbit YX=P3^4; /*****确认运行键**************************************/
sbit KLJC=P1^0;/*****开路检测位**************************************/
sbit DLJC=P1^1;/*****短路检测位**************************************/
sbit SXW=P1^2; /*****上限位,用于开机自动回原位设置**************************************/
sbit FX=P1^3; /*****方向给定输出端**************************************/
sbit JGL=P1^4; /*****进给脉冲输出端**************************************/
sbit SZ=P1^5; /*****工作进给量设定**************************************/
sbit HHMC=P1^6;/*****电火花脉冲输出端**************************************/
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约0.13ms
/*
/********************************************************/
void delay(t)
{
uchar k;
while(t--)
{
for(k=0; k<15; k++)
{HHMC=0; }
}
}
/********************************************************/
/*
/* 报警蜂鸣
/*
/********************************************************/
void mfbj()
{
while(fm--)
{
BJ=1;
delay(1);
BJ=0;
delay(1);
}
}
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约0.008ms
/*
/********************************************************/
void delay2(m)
{
uchar j;
while(m--)
{
for(j=0; j<1; j++)
{;}
}
}

/********************************************************/
/*
/*
/* 数码管显示
/*
/********************************************************/
void disp(n)
{
HHMC=0;
while(n--)
{
SW=1;
P0=smg[a/10];
delay(5);
SW=0;
GW=1;
P0=smg[a%10];
delay(5);
GW=0;

}
}
/********************************************************/
/*
/*
/* 加工量设置程序
/*
/********************************************************/
void shezh()
{
JGLSZ=1;/**********加工量设置指示灯开*******************/
HHMC=0; /***********设置时高压脉冲关闭******************************/
SN=0;
while(1)

{ if (YX==0)
break;
{ if(SZ==0)
delay(500);

if(SZ==0)a++;
if(SZ==0)mfbj();
if(a==61)
a=0;

if(QR==0)b=a*400;
if(QR==0)q=b;/**********工作短路回退的过程中防止回退过度*******************/
if(QR==0)mfbj();
disp(1);

}
}
mfbj();
JGLSZ=0; /**********加工量设置指示灯关*******************/
}
/********************************************************/
/*
/*
/* 脉冲百分比设置程序
/*
/********************************************************/
void shezh1()
{
a=0;
MCSZ=1; /*************脉冲设置指示灯开*********************/
HHMC=0;
SN=0;
while(1)

{ if (YX==0)
break;
{ if(SZ==0)
delay(500);

if(SZ==0)a++;
if(SZ==0)mfbj();
if(a==11)
a=0;
if(QR==0)mfbj();
{
if (a==1){tt=1;dd=5;} /*************频率4.93kh,占空比26%*********************/
else if(a==2){tt=1;dd=4;} /*************频率5.65kh,占空比30%*********************/
else if(a==3){tt=1;dd=3;} /*************频率6.63kh,占空比35%*********************/
else if(a==4){tt=1;dd=2;} /*************频率8kh,占空比43%*********************/
else if(a==5){tt=2;dd=3;} /*************频率5.65kh,占空比48%*********************/
else if(a==6){tt=2;dd=2;} /*************频率6.63kh,占空比53%*********************/
else if(a==7){tt=3;dd=2;} /*************频率4.93kh,占空比60%*********************/
else if(a==8){tt=2;dd=1;} /*************频率8kh,占空比63.5%*********************/
else if(a==9){tt=3;dd=1;} /*************频率6.63kh,占空比70%*********************/
else if(a==10){tt=4;dd=1;} /*************频率5.65kh,占空比75%*********************/

}

disp(1);

}
}
mfbj();
MCSZ=0;/*************脉冲设置指示灯关*********************/

}
/********************************************************/
/*
/*
/* 对刀置零
/*
/********************************************************/
void ddzl()
{
SN=1;

while(1)
{
if(DLJC==0||b==0)break; /******如果短路检测等于0或达到行程极限则停止*****/
if(b==0)
FX=0;
JGL=0;
delay2(1);
JGL=1;
delay2(1);
--b;
a=b/400;
HHMC=1; /*************高压测试脉冲开*********************/
}
HHMC=0; /*************高压测试脉冲关*********************/
a=0;
disp(1);
mfbj();
delay(1000) ; /*************对刀结束3声报警********************/
mfbj();
delay(1000) ;
mfbj();
delay(1000) ;
}
/********************************************************/
/*
/*
/* 复位回零
/*
/********************************************************/
void fwhl()
{
SN=1;
HHMC=0;
while(1) /*有条件不确定循环,使电机反转,上限位开关(SXW)接通则退出*/
{
if(SXW==0)break;
FX=1;
JGL=0;
delay2(1);
JGL=1;
delay2(1);
a=b/400;
}
delay(1000); /*************复位结束2声报警********************/
mfbj();
delay(1000) ;
mfbj();

}
/********************************************************/
/*
/*
/* 循环进给 ,每加工1mm,快速回退1次
/*
/********************************************************/
void yhjg()
{
SN=1;
HHMC=0;
while(1)
{
if(r==s+1200||SXW==0)break;/***快速回退量等于加工量另加3mm(400个脉冲1mm)************/
HHMC=0;
FX=1;
JGL=0;
delay2(1);
JGL=1;
delay2(1);
r++;
}
disp(1) ;
while(r--) /***快速进给量等于回退量************/
{
HHMC=0;
FX=0;
JGL=0;
delay2(1);
JGL=1;
delay2(1);
}
}
/********************************************************/
/*
/*
/* 正常工作
/* KLJC开路时为1,正常工作时为0;50v左右翻转,DLJC正常工作时为1,短路时为0,
/*翻转电压为30v左右。
/*要另加比较器探测。
/********************************************************/
void gongz()
{
while(1)
{
if(b==0||SXW==0||b==q)break;/******达到行程极限或上限位或短路回退到极限时则停止*****/
HHMC=1;
SN=1;
if(KLJC==1&&DLJC==1) /***开路检测开路和短路检测正常时单步进给*****/
{
HHMC=0;
FX=0;
JGL=0;
delay2(1);
JGL=1;
delay2(1);
--b;
++s; /******回退量,回退进给中使用*************/
if(s%400==0)
{HHMC=0;
yhjg();}
}
else if(KLJC==0&&DLJC==1) /***开路检测正常和短路检测正常时电机停止,给火花脉冲*****/
{
while(1)
{
if(KLJC==1||DLJC==0)break;
HHMC=1;
delay2(tt); /***变量tt和dd为脉冲宽度设置而设*****/
HHMC=0;
delay2(dd);
HHMC=~HHMC;
}
}
else if(DLJC==0) /***短路检测短路时单步回退*****/
{
FX=1;
JGL=0;
delay2(1);
JGL=1;
delay2(1);
++b;
--s; /***变量s为循环进给而设*****/
}
a=s/400;
disp(1);
}
}
/********************************************************/
/*
/*
/* 主程序入口
/*
/********************************************************/
void main()
{
P2=0; /**************输出口置0******************/
mfbj();mfbj();mfbj();mfbj();mfbj();
HHMC=0;
fwhl(); /**********上电自动回退到最上限**************************/
SN=0;
while(1)
{
if(SZ==0) break;
disp(1); /**********启用显示器*****************************/
}
ddzl(); /***********用设置键调用对刀程序***********************************/
SN=0;

shezh(); /**********设置加工深度***************************/
delay(1500);
shezh1(); /**********设置脉冲占空比**********************************/
while(b--)
{
gongz();
} /*********正常加工状态**********************************/

 

 

 


 
 
 
 

[修改于 7 个月前 - 2019-03-30 00:24:05]

来自 快乐DIY
 
1
2019-3-19 19:16:27
1楼

看起来,如果火花熄灭了,就要减小间隙直到短路,然后缓慢拉开一点。这个减小间隙的过程如何防止电极对工件造成冲撞呢?

折叠评论
加载评论中,请稍候...
折叠评论
2019-3-20 09:00:38
2楼
引用:虎哥 发表于1 楼的内容:
看起来,如果火花熄灭了,就要减小间隙直到短路,然后缓慢拉开一点。这个减小间隙的过程如何防止电极对工件.....

起弧是不是能借鉴一下氩弧焊机的起弧方式,话说原理我不是很懂

电极用钍钨合金针,间隙调整到引弧范围内再打开开关

[修改于 7 个月前 - 2019-03-20 09:03:00]

折叠评论
加载评论中,请稍候...
折叠评论
zhushiqing(作者)
3楼

不需要减至短路状态就可正常放电了,实际上检测装置检测的是3个状态:开路状态(满电压80v左右,向工件进给);正常放电状态(30-80v之间,进给停止,正常放电);短路状态(30v以下,回退)。只是火花放电太复杂,无法避免短路出现。至于你说的对工件冲击那是不用当心的,因为进给电机还不到短路时就停止进给了。

折叠评论
加载评论中,请稍候...
折叠评论
2019-3-21 00:50:53
4楼
引用:zhushiqing 发表于3 楼的内容:
不需要减至短路状态就可正常放电了,实际上检测装置检测的是3个状态:开路状态(满电压80v左右,向工件.....

谢谢指教。

折叠评论
加载评论中,请稍候...
折叠评论
zhushiqing(作者)
5楼


 

 

 

 

 

 

 

[修改于 7 个月前 - 2019-03-30 00:22:58]

折叠评论
加载评论中,请稍候...
折叠评论
zhushiqing(作者)
6楼

发贴时忘了传火花打孔的相关效果图片了,现在传上

+1  科创币    暮光之羽   2019-03-21   赞扬
折叠评论
加载评论中,请稍候...
折叠评论
2019-3-22 11:31:28
2019-3-22 11:31:28
7楼

老板   拍一下电容   

折叠评论
1
加载评论中,请稍候...
折叠评论
2019-3-23 21:13:35
2019-3-23 21:13:35
8楼

做完善点出套件。

折叠评论
1
加载评论中,请稍候...
折叠评论
2019-3-24 20:47:08
zhushiqing(作者)
9楼

本机因是高频火花机,不用rc振荡,所以电容不是关键,图上用的电容是5uf的电磁炉电容。

折叠评论
加载评论中,请稍候...
折叠评论
zhushiqing(作者)
10楼

刚开始确有找工厂代工成品的想法,但我们这找加工厂商不好找,也就搁置了,就当自己的一兴趣制作算了

折叠评论
加载评论中,请稍候...
折叠评论
2019-3-29 09:11:02
2019-3-29 09:11:02
11楼

相当牛叉 给刀具开V靠谱 俺也做一个耍耍

折叠评论
加载评论中,请稍候...
折叠评论
12楼

楼主的电火花打火效果比我的好很多,想看看功率输出部分是怎么做的。

折叠评论
加载评论中,请稍候...
折叠评论
13楼

楼主用的是普通的自来水吗?

之前我也试过火花打孔,但是如果用自来水的话,貌似是因为自来水电导率太高,只有电解的气泡,没有火花……后来换了瓶装的娃哈哈纯净水才能正常打火……然后水的成本太高以至于根本不敢考虑给大件打孔

楼主是咋解决这个问题的?

折叠评论
加载评论中,请稍候...
折叠评论
2019-3-30 09:35:46
14楼
引用:三水合番 发表于13 楼的内容:
楼主用的是普通的自来水吗?之前我也试过火花打孔,但是如果用自来水的话,貌似是因为自来水电导率太高,只.....

那就氪金大法,氪个RO鸡搞水顺面饮用水的问题也一并解决了😁

折叠评论
加载评论中,请稍候...
折叠评论
2019-4-7 17:25:34
2019-4-7 17:25:34
zhushiqing(作者)
15楼

本火花机用的是自来水,至于要用纯净水才能工作的说法,是因为你的短路电压值设定过高,本机中用的功率部分供电电压是72v3a充电器(空载电压85v左右),我的短路检测电压设置在30v左右。正常火花放电电压区间在30v至70v之间,关键是70v这一电压值的设定决定了火花间隙,如果设定过高,如84v,电极刚靠近,电压就因电解降至84以下而停止进给,而这时停止进给,输出火花脉冲,因间隙还比较大,就会出现电解冒泡就停止进给而无火花的情况。

折叠评论
加载评论中,请稍候...
折叠评论
zhushiqing(作者)
16楼

功率部份其实很简单,就是单片机输出的脉冲信号通过图腾柱直接驱动一只大功率mos(我用的是47n60c3),大致原理力如下:

折叠评论
加载评论中,请稍候...
折叠评论
2019-4-20 10:51:44
2019-4-20 10:51:44
17楼

电极进给的速度是固定的,还是可调的,如是固定的,速度取多少较好?

折叠评论
加载评论中,请稍候...
折叠评论
2019-4-23 10:34:30
2019-4-23 10:34:30
zhushiqing(作者)
18楼

电极进给速度随机的,只要检测到开路就进给一步,每步理论值是0.02mm。

折叠评论
加载评论中,请稍候...
折叠评论
19楼

建议楼主把套件打包列清单,出教程,让我们这些没技术的人也可以做一个,然后每个使用教程的同志捐助你一定金额

折叠评论
加载评论中,请稍候...
折叠评论
2019-5-5 13:51:45
2019-5-5 13:51:45
20楼

元件太多了头疼


折叠评论
加载评论中,请稍候...
折叠评论
2019-6-2 13:13:16
2019-6-2 13:13:16
21楼

楼主,你发的功率驱动部分电路图太小了,看不清楚,麻烦可以发个大点的吗?

折叠评论
1
加载评论中,请稍候...
折叠评论
2019-6-3 23:57:24
2019-6-3 23:57:24
22楼

我也想做一个

折叠评论
加载评论中,请稍候...
折叠评论
2019-6-21 21:10:26
2019-6-21 21:10:26
23楼

大神,有没有套件或者详细的原件列表或者教程?

折叠评论
1
加载评论中,请稍候...
折叠评论
2019-7-4 15:07:19
2019-7-4 15:07:19
24楼

看着火花不错  也想做一台玩玩  楼主能不能发份原件  

折叠评论
加载评论中,请稍候...
折叠评论
2019-7-29 11:45:10
2019-7-29 11:45:10
25楼

楼主,能给张功率板的正面照片吗?   谢谢!

折叠评论
加载评论中,请稍候...
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png