数字积分法插补C语言程序
第三四象限数字积分法插补计算报告
第三四象限直线插补计算1. 引言随着微电子技术,计算机技术的发展,数控机床的性能不断完善,其应用范围也不断增大。
而数控技术作为数控机床的关键技术,越来越得到更多高校的重视。
2.数字积分法直线插补原理设将要加工的直线XOY 平面内第一象限直线OE ,如图.一所示,直线起点在坐标原点,终点为E (Xe ,Ye )。
同样,假设坐标值均为以脉冲当量为单位的整数。
图.一若此时刀具在两坐标轴上的进给速度分量分别是Vx ,Vy ,则刀具在X 轴,Y 轴方向上位移增量分别是△X = Vx △t 式一a△ Y = Vy △t 式一b由图.一 所示的几何关系可得V/OE=Vx/Xe=Vy/Ye=K (常数) 式二将式二中的Vx ,Vy 分别代入式一 可得:△X = KXe △t 式三a△ Y = KYe △t 式三b可见刀具由原点O 走向E 的过程,可以看作式每经过一个单位时间间隔△t ,就分别以增量[KXe],[ KYe]同时在两个坐标轴累加的结果。
也可以这样认为,数字积分法插补实际上就是利用速度分量,进行数字积分来确定刀具在各坐标轴上位置的过程,即XO当取△ti=“1”(一个单位时间间隔)则X = nKXe 式五aY = nKYe 式五b设经过n 次累加后,刀具正好到达终点E(Xe,Ye),则要求式五中常量满足 下式nK=1 式六n 是累加次数必须取整数,所有K 取小数。
为了保证每次分配给坐标轴的进给脉冲不超过一个单位,则△ X=KXe<1 式七a△ Y=KYe<1 式七b上式中Xe ,Ye 的最大允许值受系统中相应寄存器容量的限制。
现假设寄存器 为N 位则容量为2N ,对应存储的最大允许数字量为(2N - 1)将其带入式七得 K<=1/(2N - 1) 式八现不妨取 K =1/2N 式九显然它满足式七,式八的约束条件,再将K 值代入式六可得累加次数为 n =2N 式十如果将n ,K,值代入式五则动点坐标为X = nKXe =Xe 式十一aY = nKYe =Ye 式十一b根据以上分析,在进行直线插补时,先开辟两个被积函数寄存器Jvx ,Jvy 分别存放终点坐标值Xe ,Ye ,还有两个余数寄存器Jrx ,Jry 。
数字积分法直线插补第二象限全部代码.doc
PictureloPicturelo数字积分法直线插补第二象限全部代码私人潜艇 Command 1 Click() xe = CInt (Textl)你们二 CInt(Text2)行(5400、5470)-(5500, 5500) 行(5400、5530)-(5500, 5500)如果xe 二那么就等于0 Picturelo字体颜色二vbBlack PictureloDrawWidth = 2 Picturelo线(5500)-(500) Picturelo行(5500)-(5500, 5500) Picturelo线(500)-(600) Picturelo行(500)-(80, 600) PictureloCurrentX = 10 Picturelo 当前y 坐标二5300Picturelo 当前y 坐标二5200Picturelo 打印"x”Picturelo CurrentX = 100Picturelo 当前y 坐标二100Pictured 打印"Y”i=l 到xePictured 行(50+i 500, 5500)-(50+500, 5450)接下来,我对于j=lPicturelo 行(50, 5500-j 500)-(100, 5500-j 500)下一个我Picturelo字体颜色二vbr业务Picturelo DrawWidth = 2Pictured 行(50, 5500) - (50+500 Int (Textl) ,5500-500 Int (Text2))如果是xe小于等于0,则是0Picturelo DrawWidth = 2Pictured 行(5500、5500)-(5500 年,50) Pictured 行(5500 年,50)-(5530, 150) Pictured 行(5500 年,50) -(5470, 150) Pictured 线(5500、5500)-(5500) Pictured 行(5500)-(150, 5470) Pictured 行(5500)-(150, 5530) Picturelo CurrentX = 5600Picturelo 当前y 坐标二5400 Pictured 打印”(0,0)”Picturel o CurrentX = 100Picturelo 当前y 坐标二5200Picturel o打印”- x”Picturelo 打印"Y”因为i=l到-xePictured 行(5500-500, 5500)-(5500-500, 5450)接下来,我对于j=lPicturelo 行(5500, 5500-j 500)-(5500, 5500-j 500)下一个我Picturelo 字体颜色二vbBlackPicturelo DrawWidth = 2Pictured 行(5500, 5500)-(5500+500 Int(Textl), 5500-500 Int (Text2))如果是xe小于等于0,那么叶小于等于0Pictured 行(5500 年,50)-(5500, 5500)Picturelo 行(5500、5500)-(5530,5400)Picturelo 线(50, 50)-(150 年,20) Pictured 线(50,50)-(150、80)Picturelo CurrentX = 5600Picturelo 当前y 坐标二40Pictured 打印”(0,0)”Picturelo CurrentX = 100Picturelo 当前y 坐标二100Picturelo 打印”- x”Picturelo CurrentX = 5600Picturelo 当前y 坐标二5400Picturelo 打印”- y”因为i=l到-xePictured 行(5500-500, 50)-(5500-500, 100) 接下来,我j=l到一叶Pictured 行(5500, 50+j 500)-(5, 50+j 500)下一个我Picturelo 字体颜色二vbBlackPictured DrawWidth 二 2Pictured 线(550050)-(5500+500 Int(Textl), 50-500 Int(Text2)) 如果是0,那么叶小于等于0Picturelo 字体颜色二vbBlackPicturelo DrawWidth = 2Pictured 行(50, 50)-(5500 年,50)Pictured 行(5500 年,50)-(5400, 80)Picturelo 线(5500 年,50)-(5400 年,20) Pictured 线(50, 50)-(5500)Picturelo 线(5500)-(5400)Picturelo 行(5500)-(80, 5400) Picturelo 当前y 坐标二40Pictured 打印”(0,0)”Picturelo CurrentX = 5700Picturelo 当前y 坐标二100 Picturelo 打印"x”Picturelo CurrentX = 80Picturelo 当前y 坐标二5400 Picturelo 打印”- y”i=l 到xePictured 行(50+500, 50)-(50+500, 100) 接下来,我Picturel. Printj=l至U-叶Pictured 行(50 50+j 500)-(100, 50+j 500)下一个我Picturelo DrawWidth = 2Picturelo 行(50, 50)-(50+500 Int (Textl), 50-500 Int (Text2)) 如果终止子私人潜艇Command2_C 1 ick ()n 二Int (Text5)&二0易建联二0xe 二CInt(Textl)你们二CInt (Text2)jvx 二xejvy二你们jrx 二0 jry 二0如果xe=O,那么就等于0i=l 到 2 njrx=jrx+jvx如果jrx=2 njrx=jrx-2nk = 1xi=xi+1如果杰里如果jry=2 njry-2 nm = 1yi=yi+1如果Picturelo 字体颜色二vbGreen如果k=l和m=lPicturelo 线(50 + 500 *(xi - 1), 5500(500) (yi - 1)*)-(50 + 500 *(xi)500 -(易建联)* 500)如果k= 1和m=0Pictured 行(50+500 (xi-l), 5500-(yi) 500)-(50+500 (xi),5500-(yi)500)如果k=0和m=lPicturel。
第3章-插补原理
Y积分器
计t数 器JVX为(XeJ)E,JR均X 为溢三出位Jvy(Ye) JRy 溢出
终点计 数器
JE
备注
二0进制1存01 放器00。0
011 000
000
初始状态
1
101 101
011 011
001 第一次迭代
2
101 010
1
011 110
010
X溢出
3
101 111
011 001
1
011
Y溢出
∑=8-1=7
4
F<0
+Y
F4=F3+xe=-2+6=4
∑=7-1=6
5
F>0
+X
F5=F4-ye=4-4=0
∑=6-1=5
6
F=0
+X
F6=F5-ye=0-4=-4
∑=5-1=4
7
F<0
+Y
F7=F6+xe=-4+6=2
∑=4-1=3
8
F>0
+X
F8=F7-ye=2-4=-2
∑=3-1=2
9
F<0
4
101 100
1
011 100
100
X溢出
5
101 001
1
011 111
101
X溢出
6
101 110
011 010
1
110
Y溢出
7
101 011
1
011 101
111
件加工的要求,现在的数控系统已很少采用这类算法 了。
4
*
数字积分法插补C语言程序
#include<stdio.h>#include<math.h>#include<stdlib.h>/********************************************************************/ /* 函数名: InsertPoint *//* 功能:控制机床各轴进给并将进给结果写入文件中 *//* 参数:double x, double y 插补点单位:毫米 *//* 说明:与机床硬件关联,每产生一个点调用一次 *//********************************************************************/ void InsertPoint(double xCur,double yCur){extern FILE *fp;char ch=10;printf("xCur=%f,yCur=%f\n",xCur,yCur);fprintf(fp,"%f,%f",xCur,yCur);fputc(ch,fp);}/********************************************************************/ /* 函数名: Judge_Quadrant *//* 功能:判断参数坐标的所在象限并返回相应象限值 *//* 参数:double x mm *//* double y mm *//********************************************************************/ unsigned short Judge_Quadrant(double x, double y){unsigned short nDir;if (x>=0){ //象限判断if (y>=0){nDir=1;return 1;}else{nDir=4;return 4;}}else{if (y>=0){nDir=2;return 2;}else{nDir=3;return 3;}}}/********************************************************************/ /* 函数名: DDA_Line */ /* 功能:数字积分法直线插补 *//* 参数:double XEnd, double YEnd 插补终点 mm *//* int step 步长 mm *//* unsigned short n 寄存器位数 *//********************************************************************/ void DDA_Line(unsigned short n, int step, double XEnd, double YEnd){long XRes,YRes; //寄存器溢出后余数long xEnd,yEnd; //插补终点值long XCur=0,YCur=0; //当前位置int IPCount=0;//累加值int nQuadrant;//象限int Q; //累加器容量int bInterpXEnable,bInterpYEnable;XRes=YRes=0;bInterpXEnable=bInterpYEnable=0;xEnd=labs(XEnd);yEnd=labs(YEnd);Q=(fabs(YEnd)+fabs(XEnd))/step;nQuadrant=Judge_Quadrant(XEnd,YEnd);//计算插补象限switch(nQuadrant){case 1:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 2:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) { InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 3:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 4:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;}}/********************************************************************//* 函数名: DDA_Line *//* 功能:数字积分法圆弧插补 *//* 参数:double XEnd, double YEnd 插补终点 mm *//* int step 步长 mm *//* unsigned short n 寄存器位数 *//********************************************************************/void DDA_Circle(unsigned short n, int step, double XStart, double YStart, double XEnd, double Y End, double radius, int bIsCW){double xCur=XStart,yCur=YStart;long xRes=0,yRes=0;int ndir,Q;int judge=1;int full_circle=0;int xEnable,yEnable;xEnable=yEnable=0;Q=radius;//溢出基值,也可取为pow(2,n)InsertPoint(xCur,yCur);if(XStart==XEnd&YStart==YEnd)full_circle=1;//判断是否要画整圆while(judge==1||full_circle==1)//检测终点{xRes+=fabs(xCur);yRes+=fabs(yCur);if(xRes>=Q&fabs(yCur)<=radius){xRes=xRes%Q;yEnable=1;}if(yRes>=Q&fabs(xCur)<=radius){yRes=yRes%Q;xEnable=1;}if(bIsCW==0)//逆圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 2:yCur-=step;break;case 3:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围case 4:yCur+=step;break;}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){ case 1:xCur-=step;break;case 2:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 3:xCur+=step;break;case 4:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围}}}else//顺圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:yCur-=step;break;case 2:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 3:yCur+=step;break;case 4:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围case 2:xCur+=step;break;case 3:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 4:xCur-=step;break;}}}judge=(fabs(xCur-XEnd)>=step||fabs(yCur-YEnd)>=step);if(xEnable||yEnable)//判断并进行进给运动{InsertPoint(xCur,yCur);xEnable=yEnable=0;full_circle=0;}}}FILE *fp;int main(){char fn[10];printf("please input filename:\n");scanf("%s",fn);if((fp=fopen(fn,"w"))==NULL) { printf("can't open file\n"); exit(0);}DDA_Circle(4,1,50,0,40,-30,50,1);//输入要插补的圆弧的参数// DDA_Line(4,1,50,-20);//输入要插补的圆弧的参数fclose(fp);return 0;}。
数字积分法(DDA)插补直线参考程序
数字积分法(DDA)插补直线参考程序Sub 插补X()标志X = 0If 余数X >= Q Then余数X = 余数X Mod Qx动点= x动点+ 1: 标志X = 1 End IfEnd SubSub 插补Y()标志Y = 0If 余数Y >= Q Then余数Y = 余数Y Mod Qy动点= y动点+ 1: 标志Y = 1End IfEnd SubSub 插补Z()标志Z = 0If 余数Z >= Q Then余数Z = 余数Z Mod Qz动点= z动点+ 1: 标志Z = 1 End IfEnd SubSub 插补公共()余数X = 余数X + x终点余数Y = 余数Y + y终点余数Z = 余数Z + z终点插补X插补Y插补Z插补记录= 插补记录+ 1End SubSub 插补()Dim c As Integer插补记录= 0: 余数X = 0: 余数Y = 0: 余数Z = 0: 划轮廓线PSet (z原点, x原点), vbRedSelect Case 象限标志Case 1: '第一象限插补Do Until 插补记录= Q插补公共Line -Step(z步长×标志Z, x步长×标志X), vbRedLoopCase 2: '第二象限插补c = x终点: x终点= z终点: z终点= -cc = x步长: x步长= z步长: z步长= -cDo Until 插补记录= Q插补公共Line -Step(x步长×标志X, z步长×标志Z), vbRed LoopCase 3: '第三象限插补x终点= -x终点: z终点= -z终点x步长= -x步长: z步长= -z步长Do Until 插补记录= Q插补公共Line -Step(z步长×标志Z, x步长×标志X), vbRed LoopCase 4: '第四象限插补c = x终点: x终点= -z终点: z终点= cc = x步长: x步长= -z步长: z步长= cDo Until 插补记录= Q插补公共Line -Step(x步长×标志X, z步长×标志Z), vbRed LoopEnd SelectEnd Sub。
数字积分法
插补计算过程如下:
累加 次数 (Δt) X积分器 Y积分器 终点 JVx JRx 溢出 JVy JRy 溢出 计数器 JE ΔX ΔY
备注 初始状态 第一次累加
0 1
010 000 010 010
2 3 4 5 6 7 8
010 100 010 110 010 000 1 010 010 010 100 110 100 1 010 110 110 010 1
2
3 4 5
000 000 001 001 001 001 010 010 010 100 011
101 101 010
101 101 111 101 101 100 101 101 001
1 100
1 1
100 ΔX,ΔY无溢出 011 ΔY溢出修正Yi 010
ΔY溢出修正Yi
插补计算过程如下:
Vy X
Y= ∑ (K Ye)Δt
i=1
O
Vx
由此可以得到直线插补的数字积分插补器:
J Vx(K Xe)(被积函数寄存器)
+ Δt J Rx(累加器) J Ry(累加器) + X轴溢出脉冲 ΔX ΔY
Y轴溢出脉冲
J Vy(K Ye)(被积函数寄存器)
设经过m次累加,X、Y坐标分别达到终点,则有: m X= i=1 ∑ (K Xe)Δt =KmXe =Xe Y= ∑ (K Ye)Δt = KmYe = Ye i=1 Y
(一)数字积分的基本原理 如图:从时刻t=0到t,函数Y=f(t)曲线所包围的面积可表 示为:S=∫ 0 f(t)dt Y t 若将0~t的时间划分成时间 Y=f(t) 间隔为Δt的有限区间,当Δt 足够小时,可得公式: Yo n-1 0 S=∫ tf(t)dt = ∑ Yi Δt
数控插补 补充
提高插补精度的措施 对于DDA圆弧插补,径向误差可能大于一个脉 冲当量,因数字积分器溢出脉冲的频率与被积 函数寄存器中的数值成正比,在坐标轴附近进 行累加时,一个积分器的被积函数值接近零, 而另一个积分器的被积函数接近于最大值,累 加时后者连续溢出,前者几乎没有,两个积分 器的溢出脉冲频率相差很大,致使插补轨迹偏 离给定圆弧距离较大,使圆弧误差增大。 减少误差的方法有:减小脉冲当量,误差减少, 但寄存器容量增大,累加次数增加。而且要获 得同样的进给速度,需要提高插补速度。
(3-32)
由此可以推出(xi,yi)与x、y 的关系式
1 1 X X i l cos Y 2 2 1 1 X Yi Y Yi l sin 2 2 Xi
(3-33)
式(3-33)反映了圆弧上任意相邻两插补点坐标之间 的关系,只要求得 X 和 Y ,就可以计算出新的插补点 B( X i 1 , Yi 1 ) X X X
累加 次数 (Δ t)
X 积分器
Y 积分器
JVX
JRX
ΔX
JEX JVY
JRY
ΔY
JEY
0 1 2 3 4
5 5 5 5 5 4
4 5+4=8+1 5+1=6 5+6=8+3 5+3=8+0
5 1 4 4 1 1 3 2
0
4 0 0+4=4 1 1 1+4=5 1 1+5=6 2 2 2+6=8+0 3
(3)
还可采用余数寄存器预置数法,即在DDA插补之前, 累加器又称余数寄存器JRX,JRY的初值不置零,而是预 置2n/2,若用二进制表示,其最高有效位置“1”,其它 各位置零,若再累加100…000,余数寄存器就可以产 生第一个溢出脉冲,使积分器提前溢出。这种处理方 式称为“半加载”,在被积函数值较小,不能很快产 生溢出脉冲的情况下,可使脉冲提前溢出,改变了溢 出脉冲的时间分布,达到减少插补误差的目的。 例3-5 加工第一象限顺圆AB,如图3-27,起点A(0, 5),终点B(0,5)选用寄存器位数n=3,经过 “半 加载”处理后,试用DDA法进行插补计算。 其插补运算过程见表3-5。
5.数字积分法直线插补
床进给,其效果是一样的。在被寄函数寄存器里可只存Xe, 而省略k。
例如,Xe=100101在一个6位寄存器中存放,若k=1/26, kXe=0.100101也存放在6位寄存器中,数字是一样的,若进
行一次累加,都有溢出,余数数字也相同,只是小数点位置
终点坐标值,每经过一个时间间隔t,将被积函数值向各自的累加器中
累加,当累加结果超出寄存器容量时,就溢出一个脉冲,若寄存器位 数为n,经过2n次累加后,每个坐标轴的溢出脉冲总数就等于该坐标的 被积函数值,从而控制刀具到达终点。
机电工程学院
=k
刀具在X,Y方向移动的微小增量分别为:
X = Vxt = kXet Y = Vyt = kYet
机电工程学院
动点从原点出发走向终点的过程,可以看作是各坐标轴每经过
一个单位时间间隔t,分别以增量kXe及kYe同时累加的结果。
m
m
X = X i = kX eti
i =1
i=1
m
m
Y = Yi = kYeti
有缘学习更多+谓ygd3076或关注桃报:奉献教育(店铺)
如果存放Xe,Ye寄存器的位数是n,对应最大允许数字量
为 2n 1(各位均为1),所以Xe,Ye最大寄存数值为 2n 1
则: k (2n 1,不妨取
k
=
1 2n
代入得:
2
n 2n
1
1
累加次数为: m = 1 = 2n
5. 数字积分法直线插补
如右图所示第一象
限直线OE,起点为坐标 Y
原点O,终点坐标为E (Xe,Ye),直线OE的
长度L为:
Vy V E(Xe,Ye) Vx
数控课程设计(数字积分法第二象限直线插补程序)
数字积分法第二象限直线插补程序设计数字积分法是利用数字积分的方法,计算刀具沿各坐标轴的位移,使得刀具沿着所加工的轮廓曲线运动利用数字积分原理构成的插补装置称为数字积分器,又称数字微分分析器(Digital Differential Analyzer),简称DDA。
数字积分器插补的最大优点在于容易实现多坐标轴的联动插补、能够描述空间直线及平面各种函数曲线等。
因此,数字积分法插补在轮廓数控系统中得到广泛的应用。
具体设计内容如以下:……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………目录一、课程设计目的 (1)二、课程设计题目描述和要求 (1)三、课程设计报告内容 (1)数字积分法直线插补的基本原理 (2)从几何角度来看积分运算 (2)数字积分法在轮廓插补中的具体应用(数字积分法直线插补)3 插补终点判别的具体实现 (4)插补器的组成 (5)数字积分法稳速控制 (5)提高插补精度的措施 (6)减少误差的方法 (6)数字积分法直线插补框图 (7)数字积分法直线(第二象限)插补程序流程图 (7)四结论 (8)五结束语 (8)参考书目 (10)附录数字积分法直线插补程序清单(第二象限) (11)一、课程设计目的1)了解连续轨迹控制数控系统的组成原理。
编程实现数值积分的几种--方法 c语言
编程实现数值积分的几种--方法c语言数值计算2010-11-05 09:52:43 阅读385 评论1 字号:大中小订阅复化梯形公式在区间不大时, 用梯形公式、辛卜生公式计算定积分是简单实用的, 但当区间较大时, 用梯形公式、辛卜生公式计算定积分达不到精确度要求 . 为了提高计算的精确度,我们将[a,b] 区间n等分,在每个小区间上应用梯形公式、辛卜生公式计算定积分,然后将其结果相加,这样就得到了复化梯形公式和复化辛卜生公式。
1. 复化梯形公式将积分区间等分, 设, 则节点为对每个小区间上应用梯形公式, 然后将其结果相加,则得(3.14)称(3.14) 式为复化梯形公式 .当在[a,b] 上有连续的二阶导数时,则复化梯形公式(3.14) 的余项推导如下:因为所以在区间[a,b] 上公式(3.14) 的误差为又因为在区间[a,b] 上连续,由连续函数的性质知,在区间[a,b] 上存在一点,于是( 3.15 )复化梯形公式,复化抛物线公式和Romberg求积法的算法程序:以下程序均定义误差限为1*10^-5;1)复化梯形公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double h,t0,t,g;n=1; //赋初值h=(double)(b-a)/2;t=h*(f(a)+f(b));do{t0=t;g=0;for (i=1;i<=n;i++)g+=f((a+(2*i-1)*h));t=(t0/2)+(h*g); //复化梯形公式n*=2;h/=2;}while (fabs(t-t0)>e); //自定义误差限e printf("%.8lf",t); //输出积分的近似值return 0;}2)复化抛物线公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double f1,f2,f3,h,s0,s;f1=f(a)+f(b); //赋初值f2=f(((double)(b+a)/2));f3=0;s=((double)(b-a)/6)*(f1+4*f2);n=2;h=(double)(b-a)/4;do //复化抛物线算法{f2+=f3;s0=s;f3=0;for (i=1;i<=n;i++)f3+=f((a+(2*i-1)*h));s=(h/3)*(f1+2*f2+4*f3);n*=2;h/=2;}while (fabs(s-s0)>e); //自定义误差限printf("%.8lf",s);return 0;}3)Romberg求积法:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)double t[100][100];int main(){int n,k,i,m;double h,g,p;h=(double)(b-a)/2;t[0][0]=h*(f(a)+f(b));k=1;n=1;do //Romberg算法{g=0;for (i=1;i<=n;i++)g+=f((a+((2*i-1)*h)));t[k][0]=(t[k-1][0]/2)+(h*g);for (m=1;m<=k;m++){p=pow(4,(double)(m));t[k-m][m]=(p*t[k-m+1][m-1]-t[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while (fabs(t[0][m]-t[0][m-1])>e); //自定义误差限eprintf("%.8lf",t[0][m]);return 0;}给定精度,定义误差限为1*10^-5,分别求出步长的先验估计值:用复化梯形公式计算,要求h<0. 007746。
数字积分法三、四象限顺圆插补VB源程序
程序清单Private Sub 建立坐标系_Click()Picture1.ForeColor = vbBlackPicture1.DrawWidth = 2Picture1.Line (500, 1000)-(8500, 1000) '画直线坐标轴Picture1.Line (4500, 1000)-(4500, 5000)Picture1.CurrentX = 230 '当前位置Picture1.CurrentY = 900Picture1.Print "-X" '坐标轴标注Picture1.CurrentX = 4300Picture1.CurrentY = 800Picture1.Print "(0,0)"Picture1.CurrentX = 8650Picture1.CurrentY = 900Picture1.Print "X"Picture1.CurrentX = 4400Picture1.CurrentY = 5100Picture1.Print "-Y"Picture1.Line (500, 1000)-(600, 950) '箭头Picture1.Line (500, 1000)-(600, 1050)Picture1.Line (8500, 1000)-(8400, 950)Picture1.Line (8500, 1000)-(8400, 1050)Picture1.Line (4500, 5000)-(4450, 4900)Picture1.Line (4500, 5000)-(4550, 4900)End SubPrivate Sub 画圆弧_Click()Dim a, b, c, d, n, m As IntegerDim r As Singlea = V al(Text1.Text)b = V al(Text2.Text)c = V al(Text3.Text)d = V al(Text4.Text)n = a * a + b * bm = c * c + d * dr = Sqr(n)Picture1.ForeColor = vbRedPicture1.DrawWidth = 4If Option1.V alue = True ThenConst PI = 3.1415926535Picture1.Circle (4500, 1000), 300 * r, , PI, -3 * -PI / 2End IfIf Option2.V alue = True ThenPicture1.Circle (4500, 1000), 300 * r, , -3 * -PI / 2, 0 * PIEnd IfEnd SubPrivate Sub 清除_Click()Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Option1.V alue = FalseOption2.V alue = FalsePicture1.ClsForm1.ClsEnd SubPrivate Sub 插补计算_Click()If Not (Option1.V alue = True Or Option2.V alue = True) Thenans = MsgBox("出错了,请选择象限", 48, "提示信息")End IfDim a, b, c, d, ni, mi, ai, bi, ci, k, f, g, m, n, l, i, xs, yx, xe, ye, jvx, jvy, xi, yi As Integer Dim r As Singlea = V al(Text1.Text)b = V al(Text2.Text)c = V al(Text3.Text)d = V al(Text4.Text)ni = a * a + b * bmi = c * c + d * dr = Sqr(ni)Form1.Clsci = 2f = 1g = 1k = 0 '正X进给标志1 正向-1负向m = 0 '负Y进给标志 1 正向-1负向n = 0 '累加次数i = CInt(Text5) '寄存器位数赋给il = 2 ^ ixs = CInt(Text1)ys = CInt(Text2)xe = CInt(Text3)ye = CInt(Text4)jvx = Abs(CInt(Text2))jvy = Abs(CInt(Text1))jrx = 0jry = 0xi = Abs(CInt(Text3) - CInt(Text1)) 'X方向总步yi = Abs(CInt(Text4) - CInt(Text2)) 'Y方向总步长ai = xsbi = ysPicture1.ForeColor = vbGreenPicture1.DrawWidth = 3Form1.CurrentX = 200Form1.CurrentY = 200Print " " & " X积分器" & " Y积分器" Form1.CurrentX = 100Form1.CurrentY = 400Print "累加次数n" & " jvx " & "Jrx=Jrx+Jvx" & " △X " & "J∑x" & " Jvy" & " Jry=Jry+Jvy" & " △Y " & " J∑y "Form1.CurrentX = 100Form1.CurrentY = 600Print " 开始" & "" & jvx & " " & jrx & "" & k & " " & xi & " " & jvy & " " & jry & " " & m & " " & yiwz: k = 0 'X方向进给标志1 X正向进给-1负向进给m = 0 'Y方向进给标志 1 Y正向进给-1负向进给If xi > 0 Then 'X方向判断jrx = jrx + jvxIf jrx >= l Then '判断寄存器是否溢出jrx = jrx - l '溢出修正If jrx >= l Then '寄存器位数判断GoTo ww5End Ifk = -1 '负X方向进给xi = xi - 1 'X方向总步长减1End IfEnd IfIf yi > 0 Then 'Y方向判断jry = jry + jvyIf jry >= l Then '判断寄存器是否溢出jry = jry - l '溢出修正If jry >= l Then '寄存器位数判断GoTo ww5End IfIf Option1.V alue = True Then '第三象限m = 1 '正Y方向进给ElseIf Option2.V alue = True Then '第四象限m = -1 '负Y方向进给End Ifyi = yi - 1 'Y方向总步长减1End IfEnd Ifn = n + 1 '累加次数加1Form1.CurrentX = 100Form1.CurrentY = 600 + n * 200If xi = 0 Or yi = 0 ThenIf xi = 0 And yi <> 0 And f = 0 ThenPrint " " & n & " " & jvx & " " & "停止" & " " & "" & " " & "" & " " & jvy & " " & jry & " " & m & " " & yi GoTo wz2End IfIf xi = 0 And yi <> 0 And f < 0 ThenPrint " " & n & " " & jvx & " " & " " & " " & "" & " " & "" & " " & jvy & " " & jry & " " & m & " " & yi GoTo wz2End IfIf xi <> 0 And yi = 0 And g = 0 ThenPrint " " & n & "" & jvx & " " & jrx & "" & k & "" & xi & " " & jvy & " " & "停止"GoTo wz2End IfIf xi <> 0 And yi = 0 And g < 0 ThenPrint " " & n & "" & jvx & " " & jrx & "" & k & "" & xi & " " & jvyGoTo wz2End IfIf xi = 0 And yi = 0 And f = 1 And g < 0 ThenPrint " " & n & "" & jvx & " " & jry & " " & k & "" & xi & " " & jvyGoTo wz2End IfIf xi = 0 And yi = 0 And f < 0 And g = 1 ThenPrint " " & n & " " & jvx & " " & " " & " " & "" & " " & "" & " " & jvy & " " & jry & " " & m & " " & yiGoTo wz2End IfIf xi = 0 And yi = 0 And f = 0 And g = 0 ThenPrint " " & n & " " & jvx & " " & "停止" & " " & "" & " " & "" & " " & jvy & " " & "停止"End IfIf xi = 0 And yi = 0 And f = 0 And g < 0 ThenPrint " " & n & "" & jvx & "" & "停止" & " " & k & " " & xi & " " & jvy & ""GoTo wz2End IfIf xi = 0 And yi = 0 And f < 0 And g = 0 ThenPrint " " & n & " " & jvx & " " & " " & " " & "" & " " & "" & " " & jvy & " " & "停止"GoTo wz2End IfEnd IfPrint " " & n & " " & jvx & "" & jrx & "" & k & " " & xi & " " & jvy & " " & jry & " " & m & " " & yiwz2: If xi = 0 Thenf = f - 1End IfIf yi = 0 Theng = g - 1End IfIf xi = 0 And yi = 0 Thenci = ci - 1If ci = 0 ThenGoTo wz3End IfEnd IfIf Option1.V alue = True ThenIf k = -1 Then '负X方向进给jvy = jvy + 1End IfIf m = 1 Then '正Y方向进给jvx = jvx - 1End IfEnd IfIf Option2.V alue = True ThenIf k = -1 Then '负X方向进给jvy = jvy - 1End IfIf m = -1 Then '负Y方向进给jvx = jvx + 1End IfEnd IfPicture1.Line (4500 + 300 * ai, 1000 - bi * 300)-(4500 + 300 * (ai + k), 1000 - (bi + m) * 300)bi = bi + mGoTo wzww3: Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text1.SetFocusww5: Form1.Clsans = MsgBox("出错了,寄存器位数偏小,请输入", 48, "提示信息")Text5.Text = ""Text5.SetFocusww4:wz3:End Sub。
逐点比较法数字积分法等插补原理
Fm+1=Fm+2xm+1
(2)四个象限的圆弧插补
其它象限的圆弧插补可与第一象限的情况相比较而得出,因 为其它象限的所有圆弧总是与第一象限中的逆圆弧或顺圆弧互 为对称。
所谓二次曲线插补是指在给定的两个基点之间 用一条近似曲线来逼近,也就是实际的中间点连线 是一条近似于曲线的折线弧。常用的二次曲线有圆 弧、抛物线和双曲线等。
⑷ 将插补运算过程中定出的各中间点,以脉冲信号的形式去 控
制x和y方向上的步进电机,带动刀具或绘图笔,从而加工或绘
制出符合要求的零件轮廓。
每个脉冲驱动步进电机走一步(即刀具或绘图笔在x或y方向上 移动一个位置),称为步长。常用Δx和Δy来表示,通常取 Δx=Δy。
下面推导简化的偏差计算的递推公式:
①设加工点正处于m(xm,ym)点,当Fm≥0时,应沿-x方向进给 一步至(m+1)点,其坐标值为 : xm+1=xm-1
ym+1=ym 新的加工点的偏差为
2xm+1
Fm+1=xm+12+ym+12-R2=(xm-1)2+ym2-R2=Fm-
②设加工点正处于m(xm,ym)点,当Fm<0时,应沿+y方向进 给一步至(m+1)点,其坐标值为: xm+1=xm
数字程序控制主要应用于机床的 自动控制,如用于铣床、车床、加工 中心、线切割机以及焊接机、气割机 等的自动控制系统中。
数字程序控制系统组成
第三节 数字积分法插补
第三节 数字积分法插补一、数字积分法的基本原理数字积分法又称数字微分分析法(Digital Differential Analyzer )。
这种插补方法可以实现一次、二次、甚至高次曲线的插补,也可以实现多坐标联动控制。
只要输入不多的几个数据,就能加工出圆弧等形状较为复杂的轮廓曲线。
作直线插补时,脉冲分配也较均匀。
从几何概念上来说,函数)(t f y =的积分运算就是求函数曲线所包围的面积S (图3-10所示)。
图3-10 函数)(t f y =的积分S=⎰tydt 0(3-9)此面积可以看作是许多长方形小面积之和,长方形的宽为自变量t ∆,高为纵坐标i y 。
则 S=⎰tydt 0=t y ni i ∆∑=0(3-10)这种近似积分法称为矩形积分法,该公式又称为矩形公式。
数学运算时,如果取t ∆=1,即一个脉冲当量,可以简化为:S=∑=ni iy(3-11)由此,函数的积分运算变成了变量求和运算。
如果所选取的脉冲当量足够小,则用求和运算来代替积分运算所引起的误差一般不会超过容许的数值。
二、DDA 直线插补 1.DDA 直线插补原理图3-11 直线插补设xy 平面内直线OA ,起点(0,0),终点为(e x ,e y ),如图3-11所示。
若以匀速V 沿OA 位移,则V 可分为动点在x 轴和y 轴方向的两个速度x V 、y V ,根据前述积分原理计算公式,在x 轴和y 轴方向上微小位移增量x ∆、y ∆应为⎩⎨⎧∆=∆∆=∆t V y tV x y x (3-12) 对于直线函数来说,x V 、y V ,V 和L 满足下式⎪⎪⎩⎪⎪⎨⎧==L y VV Lx V V e y e x 从而有⎩⎨⎧==e yex ky V kx V (3-13) 其中:LVk =因此坐标轴的位移增量为⎩⎨⎧∆=∆∆=∆tky y tkx x e e (3-14) 各坐标轴的位移量为⎪⎪⎩⎪⎪⎨⎧∆==∆==⎰∑⎰∑==tn i e e t n i e e ty k dt ky y t x k dt kx x 0101(3-15) 所以,动点从原点走向终点的过程,可以看作是各坐标轴每经过一个单位时间间隔t ∆,分别以增量e kx 、e ky 同时累加的过程。
二、数字积分法插补
O ∆t
t T
若∆t取最小基本单位“1”,则上式可简化为: n-1 S=∑ Yi
i=0
(累加求和公式或矩形公式)
这种累加求和运算,即积分运算可用数字积分器来实现, 被积函数寄存器 ∆t 存放Y值
+ ∆Y
累加器(余数寄存器)
若求曲线与坐标轴所包围的面积,求解过程如下: 被积函数寄存器用以存放Y值,每当∆t 出现一次,被积函 数寄存器中的Y值就与累加器中的数值相加一次,并将 累加结果存于累加器中,如果累加器的容量为一个单 位面积,则在累加过程中,每超过一个单位面积,累 加器就有溢出。当累加次数达到累加器的容量时,所 产生的溢出总数就是要求的总面积,即积分值。 被积函数寄存器 ∆t 存放Y值
110 110 110 110 110 110 110 110
000 110 100 1 010 1 000 1 110 100 1 010 1 1
000 初始状态 111 第一次累加 110 JRy有进位, ∆Y溢出 101 JRy有进位, ∆Y溢出 100 ∆X,∆Y同时溢出 011 ∆X,∆Y同时无溢出 ∆Y溢出 010 ∆Y溢出 001 000
1
010 001
无溢出 1 000 ∆X∆Y同时溢出
,Y到终点停止迭代
∆X溢出修正Xi
插补计算过程如下:
累加 次数 (∆t) Y终 X积分器 X终 Y积分器 JVx JRy 溢出 点计 Jvy JRx 溢出 点计 数器 (Yi) ∆X 数器 (Xi) ∆Y
备注
∆X溢出修正Xi
12 101 001 1 001 010 001 13 101 110 001 001 14 101 011 1 000 001 000
二、数字积分法插补
数控课程设计(数字积分法第二象限逆圆插补)
数字积分法第二象限逆圆插补程序设计1.课程设计的目的(1) 了解连续轨迹控制数控系统的组成原理。
(2) 掌握数字积分插补的基本原理。
(3) 掌握数字积分插补的软件实现方法。
2、课程设计的任务数字积分法又称数字微分分析法DDA(Digital Differential Analyzer)。
数字积分法具有运算速度快、脉冲分配均匀、易于实现多坐标联动及描绘平面各种函数曲线的特点,应用比较广泛。
其缺点是速度调节不便,插补精度需要采取一定措施才能满足要求。
由于计算机有较强的计算功能和灵活性,采用软件插补时,上述缺点易于克服。
本次课程设计具体要求如下:(1)数字积分法插补基本原理(2)数字积分法插补软件流程图(3)算法描述,编写算法程序清单3、课程设计报告内容3.1.设计方案的论证插补运算就是运用特定的算法对工件加工轨迹进行运算并根据运算结果向相应的坐标发出运动指令的过程。
插补运算可以采用数控系统硬件或数控系统软件来完成。
硬件插补器:速度快,但缺乏柔性,调整和修改都困难。
软件插补器:速度慢,但柔性高,调整和修改都很方便。
早期硬件数控系统:采用由数字逻辑电路组成的硬件插补器;CNC系统:采用软件插补器,或软件、硬件相结合的插补方式。
方案一:采用逐点比较法插补。
逐点比较法的基本原理是被控对象在按要求的轨迹运动时,每走一步都要与规定的轨迹进行比较,由此结果决定下一步移动的方向。
逐点比较法既可以作圆弧插补又可以作直线插补。
这种算法的特点是,运算直观,插补误差小于一个脉冲当量,输出脉冲均匀,而且输出脉冲速度变化小,调节方便,因此在两坐标数控机床中应用较为普遍。
方案二:数字积分法插补。
又称为微分分析法。
这种方法可实现一次、二次、甚至高次曲线的插补,也可以实现多坐标联动控制。
只要输入不多的几个数据,就能加工出圆弧等形状较为复杂的轮廓曲线。
作直线插补时,脉冲分配也较均匀。
方案三:数据采样插补。
数据采样插补实际上是一种粗插补过程,它所产生的微小线段仍然比较大,必须进一步对其密化(即精插补)。
数控机床DDA数字积分法插补第一象限直线,逐点比较法插补二三象限顺圆弧
数控机床DDA数字积分法插补第⼀象限直线,逐点⽐较法插补⼆三象限顺圆弧⽬录⼀、课程设计介绍1.1 任务说明 (3)1.2要求 (3)⼆、程序操作及算法流程图2.1 DDA法插补直线流程 (3)2.2逐点⽐较法插补逆时针圆弧流程 (4)三、⽤户使⽤说明3.1 程序开始运⾏时显⽰介⾯ (5)3.2 执⾏计算 (5)3.3 DDA法直线插补实例 (6)3.4 逐点⽐较法插补第⼆三象限逆时针圆弧 (7)四、主要算法及源程序4.1 程序设计概述 (8)4.2 主要算法的实现 (8)4.2.1 参数声明 (8)4.2.2复位操作 (9)4.2.3单步操作 (11)4.2.4 连续插补 (11)4.2.5 辅助操作 (13)五、本设计的特点 (13)六、课程设计的感想 (13)七、主要参考⽂献 (14)⼀、课程设计介绍1.1、任务说明:(1)直线插补:DL1, DDA 法第⼀象限直线插补。
(2)圆弧插补:PA23,逐点⽐较法⼆三象限顺圆弧插补。
1.2、要求:(1)具有数据输⼊界⾯,如:起点,终点,圆⼼,半径及插补步长。
(2)具有插补过程的动态显⽰功能,如:但单步插补,连续插补,插补步长可调。
本课程设计的题⽬要求是DDA数字积分法插补第⼀象限直线,逐点⽐较法插补⼆三象限顺圆弧。
由于本课设要求只为⼆三象限,故默认为劣弧插补。
此外,对于两种插补对象均可根据需要改变插补步长,以表现不同的插补效果。
在插补显⽰过程中,有两种插补显⽰⽅式,即⼿动单步插补和⾃动连续插补动态显⽰。
⼆、程序操作及算法流程图 2.1 DDA 法插补直线流程初始化sx sy ex ey 步长bc 寄存器vx1 vy1 累加器 rx1 ry1rx1=rx1+vx1 ry1=ry1+vy1ry1是否溢出rx1是否溢出是否到达终点结束 +x ⾛⼀个步长 +y ⾛⼀个步长NY NYNY开始DDA 插补第⼀象限的直线流程图2.2逐点⽐较法插补逆时针圆弧流程逐点⽐较法插补⼆三象限逆圆弧参数说明:sx 、sy 为起点坐标ex 、ey 为终点坐标开始初始化sx ex sy sy bc 弧半径平⽅rY21>=0r>=0r>=0向—y ⾛⼀步向x ⾛⼀步向—y ⾛⼀步向—x ⾛⼀步是否到达终点结束yyynnnn yn为进给总次数cx、cy为圆⼼坐标bc为步长m为寄存器位数s_1表⽰按下直线选项,s_2表⽰按下圆弧按钮三、⽤户使⽤说明——软件运⾏说明及结果显⽰3.1 程序开始运⾏时显⽰介⾯3.2 执⾏计算在右侧⾯板中有参数输⼊区,⽅式选择区以及执⾏按钮等操作。
第1章数字积分法插补(DDA)
可用两个积分器来完成平面直线的插补计算, 其被积函数寄存器的函数值分别为 和 。 对二进制数 ,在 N 位寄存器中存放 与存 放 的数字大小是相同的,仅仅只要认为 后者的小数点在最高位的前面。因此,进行数 字积分法的直线插补计算时,应分别对终点 和终点 进行累加,累加器每溢出一个脉冲, 则控制机床在相应的坐标轴上进给一个脉冲当 量。当累加 次后, x 轴和 y 轴所走的步 数正好等于各轴的终点坐标。
• 积分运算的原理图如图所示,它由一个被积函数寄 存器 ,一个累加器 ( 又称余数寄存器 ) 和一个 全加器 构成。每当出现一个 信号,便将被积函 数寄存器 中的 值与累加器中的值累加一次。若累加 器 的容量作为一个单位面积值,则在累加过程中累 加器 的累加和超过累加器 的容量时,累加器便溢出 一个脉冲,此脉冲即为一个单位面积值,累加结束 后,累加器 总的溢出脉冲数即为所求面积积分的近 似值。 • 其中积分运算原理图累加次数取决于寄存器的位数。
数字积分法插补速度影响的解释 • 当被加工直线较短,而寄存器和累加 器的位数较长时,就出现累加多次才 产生一个溢出脉冲的现象,此时进给 速度就会很慢,从而影响生产率。
二、数字积分法的直线插补
如图所ቤተ መጻሕፍቲ ባይዱ,设直线 oA 为第一象限的直线,起点为坐标原 点 o(0 , 0) ,终点坐标为 A ,该直线的方程式为:
将上式化为以时间 t 为参量的参数方程: 对上两式取微分得: 求上两式在 o 到 A 区间的定积分得 :
式中 和 分别对应起点和终点的时间。上式即为用 数字积分法求 x 和 y 在区间 的定积分,积分值 即为由 o 到 d 的坐标增量。因积分起点为坐标原点 O,所以此坐标增量即为终点坐标。 将上式用累加和代替积分式得: 若取 为一个脉冲时间间隔,即 =1,则: ,则kn=1,k=1/n。 选择 k 时应使每次增量均小于 1 ,以使在各坐标轴 每次分配进给脉冲时不超过一个脉冲 ( 即每次增量 只移动一个脉冲当量 )。
数字积分插补法直线插补
数控原理与系统课程设计课题名称:数字积分插补法直线插补专业:班级:姓名:指导老师:数控原理与系统课程设计任务书班级姓名学号课程设计的目的1)了解连续轨迹控制数控系统的组成原理。
2) 掌握数字积分插补的基本原理。
3)掌握数字积分插补的软件实现方法。
二、课程设计的任务数字积分法又称数字微分分析法DDA(Digital Differential Analyzer)。
数字积分法具有运算速度快、脉冲分配均匀、易于实现多坐标联动及描绘平面各种函数曲线的特点,应用比较广泛。
其缺点是速度调节不便,插补精度需要采取一定措施才能满足要求。
由于计算机有较强的计算功能和灵活性,采用软件插补时,上述缺点易于克服。
本次课程设计具体要求如下:1)数字积分插补法基本原理2)数字积分插补法插补软件流程图3)算法描述(逐点比较法算法在VB中的具体实现)4)编写算法程序清单5)软件运行仿真效果二、课程设计报告要求1)按课程设计任务5点要求为标题,编写课程设计报告,最后加一点:此次课程设计小结(包括设计过程中所碰到的问题、解决办法以及有关设计体会等)。
2)字数在3000字左右。
3)仿真软件一份。
三、学生分组学 生 姓 名数控原理与系统课程设计说明书一、数字积分法直线插补的基本原理数字积分法是利用数字积分的方法,计算刀具沿各坐标轴的位移,使得刀具沿着所加工的轮廓曲线运动利用数字积分原理构成的插补装置称为数字积分器,又称数字微分分析器(Digital Differential Analyzer ),简称DDA 。
数字积分器插补的最大优点在于容易实现多坐标轴的联动插补、能够描述空间直线及平面各种函数曲线等。
因此,数字积分法插补在轮廓数控系统中得到广泛的应用。
从几何角度来看,积分运算就是求出函数Y = f (t )曲线与横轴所围成的面积,从t =t 0到t n 时刻,函数Y= f (t )的积分值可表述为⎰⎰==n n tt t t dt )t (Ydt S 00f如果进一步将t ∈[t 0,t n ]的时间区划分为若干个等间隔Δt 的小区间,当Δt 足够小时,函数Y 的积分可用下式近似表示t Y Ydt S n i i tt n ∆∑⎰-=≈=1在几何上就是用一系列的小矩形面积之和来近似表示函数f (t )以下的积分面积。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//该函数在VC++6.0下编译测试通过,可实现直线、圆弧、完整圆的数字积分法插补;并可将插补函数计算出的数//据点写入xxx.txt文件中//若有任何疑问,欢迎邮件联系,***********************#include//版权所有,侵权必究。
转载时请注明来自大连理工机械工程学院Deanjiang#include<math.h>#include<stdlib.h>#include<stdio.h>/********************************************************************//* 函数名: InsertPoint *//* 功能:控制机床各轴进给并将进给结果写入文件中*//* 参数:double x, double y 插补点单位:毫米*//* 说明:与机床硬件关联,每产生一个点调用一次*//********************************************************************/void InsertPoint(double xCur,double yCur){extern FILE *fp;char ch=10;printf("xCur=%f,yCur=%f\n",xCur,yCur);fprintf(fp,"%f,%f",xCur,yCur);fputc(ch,fp);}/********************************************************************//* 函数名: Judge_Quadrant *//* 功能:判断参数坐标的所在象限并返回相应象限值*//* 参数:double x mm*//*double y mm*//********************************************************************/unsigned short Judge_Quadrant(double x, double y){unsigned short nDir;if (x>=0){ //象限判断if (y>=0){nDir=1;return 1;}else{nDir=4;return 4;}}else{if (y>=0){nDir=2;return 2;}else{nDir=3;return 3;}}}/********************************************************************/ /* 函数名: DDA_Line */ /* 功能:数字积分法直线插补*/ /* 参数:double XEnd, double YEnd插补终点mm*//*int step步长mm*//* unsigned short n寄存器位数*//********************************************************************/ void DDA_Line(unsigned short n, int step, double XEnd, double YEnd){long XRes,YRes; //寄存器溢出后余数long xEnd,yEnd; //插补终点值long XCur=0,YCur=0; //当前位置int IPCount=0;//累加值int nQuadrant;//象限int Q; //累加器容量int bInterpXEnable,bInterpYEnable;XRes=YRes=0;bInterpXEnable=bInterpYEnable=0;xEnd=labs(XEnd);yEnd=labs(YEnd);Q=(fabs(YEnd)+fabs(XEnd))/step;nQuadrant=Judge_Quadrant(XEnd,YEnd);//计算插补象限switch(nQuadrant){case 1:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 2:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 3:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 4:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;}}/********************************************************************//* 函数名: DDA_Line *//* 功能:数字积分法直线插补*//* 参数:double XEnd, double YEnd插补终点mm*//*int step步长mm*//* unsigned short n寄存器位数*//********************************************************************/void DDA_Circle(unsigned short n, int step, double XStart, double YStart, double XEnd, double YEnd, double radius, int bIsCW) {double xCur=XStart,yCur=YStart;long xRes=0,yRes=0;int ndir,Q;int judge=1;int full_circle=0;int xEnable,yEnable;xEnable=yEnable=0;Q=radius;//溢出基值,也可取为pow(2,n)InsertPoint(xCur,yCur);if(XStart==XEnd&YStart==YEnd)full_circle=1;//判断是否要画整圆while(judge==1||full_circle==1)//检测终点{xRes+=fabs(xCur);yRes+=fabs(yCur);if(xRes>=Q&fabs(yCur)<=radius){xRes=xRes%Q;yEnable=1;}if(yRes>=Q&fabs(xCur)<=radius){yRes=yRes%Q;xEnable=1;}if(bIsCW==0)//逆圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 2:yCur-=step;break;case 3:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围case 4:yCur+=step;break;}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:xCur-=step;break;case 2:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 3:xCur+=step;break;case 4:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围}}}else//顺圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:yCur-=step;break;case 2:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 3:yCur+=step;break;case 4:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围case 2:xCur+=step;break;case 3:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 4:xCur-=step;break;}}}judge=(fabs(xCur-XEnd)>=step||fabs(yCur-YEnd)>=step);if(xEnable||yEnable)//判断并进行进给运动{InsertPoint(xCur,yCur);xEnable=yEnable=0;full_circle=0;}}}FILE *fp;int main(){char fn[10];printf("please input filename:\n");scanf("%s",fn);if((fp=fopen(fn,"w"))==NULL){printf("can't open file\n");exit(0);}DDA_Circle(4,1,50,0,40,-30,50,1);//输入要插补的圆弧的参数//DDA_Line(4,1,50,-20);//输入要插补的圆弧的参数fclose(fp);return 0;}。