数据采样法插补C语言程序

合集下载

8-数据采样插补

8-数据采样插补

上式反应了A点与B点的位置关系,只要坐标满足上式,则
A点与B点必在同一圆弧上。由于式中和都是未知数,难以求 解,这里采用近似算法。取α≈45°,即
f cos f co f sin f sin 45 (Yi ) (Yi ) 2 2

采样周期的选择
采用数据采样插补算法,首先需要解决的问题是选择合适 的插补周期。对于位置采样控制系统,确定插补周期时,主 要考虑如何满足采样定理(香农定理),以保证采集到的实际 位移数据不失真。CNC系统位置环的典型带宽为20Hz左右。 根据采样定理,采样频率应该等于或大于信号最高频率的2倍。 取信号最高频率的5倍作为采样频率,即100Hz。因此典型的 采样周期(或插补周期)取为10ms左右。美国A-B公司生产的 一些CNC系统,其插补周期和采样周期均取10.24ms,日本 FANUC公司生产的一些CNC系统,其采样周期取4ms,插补 周期取8ms(采样周期的2倍)。对于后一种情况,插补程序每 8ms调用一次,为下一个周期算出各坐标轴的增量值;而位 置反馈采样程序每4ms调用一次,将插补程序算好的坐标位 置增量值除以2后再与坐标位置采样值进行比较。
FTs X e2 Ye2 FTs X e2 Ye2 Ye
Xe
2. 数据采样圆弧插补
圆弧插补的基本思想是在满足精度要求的前提下,用弦进 给代替弧进给,即用直线逼近圆弧。 图1-15所示为一逆圆弧,圆心在坐标原点,起点A(Xe, Ye),终点(Xe,Ye)。圆弧插补的要求是在已知刀具移动速度F 的条件下,计算出圆弧段上的若干个插补点,并使相邻两个插 补点之间的弦长满足下式:
令K=FT/R
Xi K(Yi - 1 - KXi - 1/2) Yi K(Xi - 1 - KYi - 1/2)

c语言 采集数据 精度 算法 -回复

c语言 采集数据 精度 算法 -回复

c语言采集数据精度算法-回复在计算机科学领域中,采集数据并进行精确的算法分析是非常重要的。

而C语言作为一种高效且广泛应用的编程语言,为我们提供了丰富的工具和函数库来实现这样的数据采集和精度算法。

本文将介绍如何使用C语言来采集数据,并通过一些常见的算法来提高数据的精度。

首先,数据采集是指通过各种传感器、仪器或者采样软件来测量或记录现实世界中的各种物理量。

在C语言中,我们可以使用各种输入输出函数来读取和写入数据。

例如,我们可以使用scanf函数来获取用户输入的数据,并使用printf函数将结果输出到屏幕上。

然而,由于测量仪器或者传感器的精度有限,我们获取到的数据并不总是完全准确的。

因此,为了提高数据的精度,我们需要使用一些算法来进行数据处理和分析。

首先,我们可以使用滤波算法来去除数据中的噪声。

滤波算法可以通过消除或降低原始数据中的高频成分来平滑数据。

C语言中有很多滤波算法的实现,例如无限脉冲响应滤波器(IIR)和有限脉冲响应滤波器(FIR)。

可以根据具体的应用选择合适的滤波算法来降低噪声对数据精度的影响。

除了滤波算法,我们还可以使用插值算法来提高数据的精度。

插值算法可以通过已知数据点之间的关系来预测未知位置上的数据值。

C语言提供了很多插值算法的库函数,比如线性插值和二次插值。

这些算法可以帮助我们在有限的数据点上推算出更精确的结果。

此外,我们还可以使用数值逼近算法来对实际数据进行拟合。

数值逼近算法可以根据已知的离散数据点来推导出一个数学模型,并根据这个模型来预测未知数据的值。

C语言提供了许多数值逼近的函数库,例如多项式逼近和最小二乘法。

使用这些算法可以帮助我们更准确地拟合实际数据,并提高数据的精度。

此外,在进行数据采集和精度算法的过程中,我们还需要考虑一些其他的因素。

比如,数据的采样率和信号处理器的性能都会对数据精度产生影响。

采样率越高,我们获取的数据就越精确,但同时也会增加数据处理的复杂性和计算成本。

第3章-插补原理

第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
*

9.数据采样法插补原理

9.数据采样法插补原理
9.数据采样法插补原理
数据采样插补又称为时间分割法,与基准脉冲插补法不同,数据采样 插补法得出的不是进给脉冲,而是用二进制表示的进给量。这种方法是根 据程编进给速度F,将给定轮廓曲线按插补周期T(某一单位时间间隔)分 割为插补进给段(轮廓步长),即用一系列首尾相连的微小线段来逼近给 定曲线。每经过一个插补周期就进行一次插补计算,算出下一个插补点, 即算出插补周期内各坐标轴的进给量,如等,得出下一个插补点的指令位 置。
插补周期越长,插补计算误差越大,插补周期应尽量选得小一些。CNC 系统在进行轮廓插补控制时,除完成插补计算外,数控装置还必须处理一 些其它任务,如显示、监控、位置采样及控制等。
数据采样插补一般分为粗、精插补两步完成。第一步是粗插补,由它 在给定曲线的起、终点之间插入若干个微小直线段。 这些微小直线段由精 插补进一步进行数据的密化工作,即进行对直线的脉冲增量插补。
有缘学习更多+谓ygd3076或关注桃报:奉献不连续信号,对时间上连 续的信号进行采样,就是通过一个采样开关K(这个开关K每隔 一定的周期TC闭合一次)后,在采样开关的输出端形成一连串 的脉冲信号。这种把时间上连续的信号转变成时间上离散的脉 冲系列的过程称为采样过程,周期T叫采样周期。
) 2
R 1
1
/ 2 2
2!
/ 22
4!
图5-29 圆弧插补
2 R
8
X
对于直线插补,不会造成轨迹误差。在圆弧插补中,会带来轨迹误差。
机电工程学院
设T为插补周期,F为进给速度,则轮廓步长为
l TF
用轮廓步长代替弦长,有
l TF RR
,得
er
(TF ) 2 8R
可见,圆弧插补过程中,用弦线逼近圆弧时,插补误差er与程编

数据采样插补

数据采样插补

数据采样插补一、概述数据采样插补多用于进给速度要求较高的闭环掌握系统。

它与前面我们介绍的插补方法的最大不同就是前者计算机一般不包含在伺服掌握环内,计算机插补的结果是输出进给脉冲,伺服系统依据进给脉冲进给。

每进给一步(一个脉冲当量),计算机都要进行一次插补运算。

进给速度受计算机插补速度的限制,很难满意现代数控机床高速度的要求。

而后者计算机一般包含在伺服掌握环内。

数据采样插补用小段直线来靠近给定轨迹,插补输出的是下一个插补周期内各轴要运动的距离,不需要每走一个脉冲当量就插补一次,可达到很高的进给速度。

1. 数据采样插补的基本原理粗插补:采纳时间分割思想,依据进给速度F和插补周期T,将廓型曲线分割成一段段的轮廓步长L,L=FT,然后计算出每个插补周期的坐标增量。

精插补:依据位置反馈采样周期的大小,由伺服系统的硬件完成。

2. 插补周期和检测采样周期插补周期大于插补运算时间与完成其它实时任务时间之和,现代数控系统一般为2~4ms,有的已达到零点几毫秒。

插补周期应是位置反馈检测采样周期的整数倍。

3.插补精度分析直线插补时,轮廓步长L与被加工直线重合,没有插补误差。

圆弧插补时,轮廓步长L作为弦线或割线对圆弧进行靠近,存在半径误差。

二、数据采样法直线插补1.插补计算过程(1)插补预备主要是计算轮廓步长l=FT及其相应的坐标增量。

(2)插补计算实时计算出各插补周期中的插补点(动点)坐标值。

2.有用的插补算法(1)直线函数法插补预备:插补计算:2)进给速率数法(扩展DDA法)插补预备: 引入步长系数K则插补计算:三、数据采样法圆弧插补1. 直线函数法(弦线法)如图5-13所示,要加工圆心在原点O(0,0)、半径为R的第一象限顺圆弧,在顺圆弧上的B点是继A点之后的插补瞬时点,两点的坐标分别为A(Xi,Yi)、B(Xi+1,Yi+1),现求在一个插补周期T内X 轴和Y轴的进给量△X、△Y。

图中的弦AB是圆弧插补时每个插补周期内的进给步长l,AP是A点的圆弧切线,M是弦的中点。

数控加工中两种插补原理及对应算法

数控加工中两种插补原理及对应算法

数控加工中两种插补原理及对应算法数控机床上进行加工的各种工件,大部分由直线和圆弧构成。

因此,大多数数控装置都具有直线和圆弧的插补功能。

对于非圆弧曲线轮廓轨迹,可以用微小的直线段或圆弧段来拟合。

插补的任务就是要按照进给速度的要求,在轮廓起点和终点之间计算出若干中间控制点的坐标值。

由于每个中间点计算的时间直接影响数控装置的控制速度,而插补中间点的计算精度又影响整个数控系统的精度,所以插补算法对整个数控系统的性能至关重要,也就是说数控装置控制软件的核心是插补。

插补的方法和原理很多,根据数控系统输出到伺服驱动装置的信号的不同,插补方法可归纳为脉冲增量插补和数据采样插补两种类型。

一、脉冲增量插补这类插补算法是以脉冲形式输出,每次插补运算一次,最多给每一轴一个进给脉冲。

把每次插补运算产生的指令脉冲输出到伺服系统,以驱动工作台运动。

一个脉冲产生的进给轴移动量叫脉冲当量,用δ表示。

脉冲当量是脉冲分配计算的基本单位,根据加工的精度选择,普通机床取δ=0.01mm,较为精密的机床取δ=1μm或0.1μm。

插补误差不得大于一个脉冲当量。

这种方法控制精度和进给速度低,主要运用于以步进电动机为驱动装置的开环控制系统中。

二、数据采样插补数据采样插补又称时间标量插补或数字增量插补。

这类插补算法的特点是数控装置产生的不是单个脉冲,而是数字量。

插补运算分两步完成。

第一步为粗插补,它是在给定起点和终点的曲线之间插入若干个点,即用若干条微小直线段来拟合给定曲线,每一微小直线段的长度△L都相等,且与给定进给速度有关。

粗插补时每一微小直线段的长度△L与进给速度F和插补T周期有关,即△L=FT。

实训报告(数据采样插补)

实训报告(数据采样插补)

数字化实训报告一数据采样差补简介所谓数据采样插补法,或称为时间分割法。

它尤其适合于闭环和半闭环以直流或交流电机为执行机构的位置采样控制系统。

这种方法是把加工一段直线或圆弧的整段时间细分为许多相等的时间间隔,称为单位时间间隔(或插补周期)。

每经过一个单位时间间隔就进行一次插补计算,算出在这一时间间隔内各坐标轴的进给量,边计算,边加工,直至加工终点。

与基准脉冲插补法不同,采用数据采样法插补时,在加工某一直线段或圆弧段的加工指令中必须给出加工进给速度F,先通过速度计算,将进给速度分割成单位时间间隔的插补进给量L(或称为轮廓步长),又称为一次插补进给量。

这类算法的核心问题是如何计算各坐标轴的增长数∆x和∆y(而不是单个脉冲),有了前一插补周期末的动点位置值和本次插补周期内的坐标增长段,就很容易计算出本插补周期末的动点命令位置坐标值。

对于直线插补来讲,插补所形成的轮廓步长子线段(即增长段)与给定的直线重合,不会造成轨迹误差。

而在圆弧插补中,因要用切线或弦线来逼近圆弧,因而不可避免地会带来轮廓误差。

其中切线近似具有较大的轮廓误差而不大采用,常用的是弦线逼近法。

有时,数据采样插补是分两步完成的,即粗插补和精插补。

第一步为粗插补,它是在给定起点和终点的曲线之间插入若干个点,即用若干条微小直线段来逼近给定曲线,粗插补在每个插补计算周期中计算一次。

第二步为精插补,它是在粗插补计算出的每一条微小直线段上再做“数据点的密化”工作,这一步相当于对直线的脉冲增量插补。

二直线插补直线插补的情况如右图所示。

要求刀具在XY 平面中作所示的直线运动。

在这一程序段中,每一小段的长度为L=KFT(K进给倍率,F进给速度,T插补周期)。

只要求出∆x和∆y即可。

tanα=X E Y Ecosα=1√1+(tanα)2∆X=L∗cosα∆Y=∆X∗tanα三顺圆圆弧插补3.1公式推导圆弧插补的情况如下。

顺圆弧AB为待加工曲线,可以依据几何知识推导出关系式:∆Y ∆X =X I+0.5∗L∗COSαY I−0.5∗L∗SINα无法求解出∆x和∆y,取α=45°.如此会引起的误差就是下一点可能不在圆弧上面,所以修正关系式为:∆X′=L*COS45X I2+Y I2=(X I+∆X)2+(Y I−∆Y)2AB3.2流程图3.3程序CLOSE&1#1->2500X#2->2500YOPEN PROG 28CLEARINC;增量模式P0=1;每个周期的步长P1=100;半径P2=0;x0P3=100;y0P4=100;x1P5=0;y1P11=0.7071;sin45,cos45P6=SQRT((P4-P2)*(P4-P2)+(P5-P3)*(P5-P3));始末点距离P7=INT(2*(ASIN(P6/2/P1))*P1/P0)+1;步数WHILE(P7>0);由步数控制循环P8=ATAN((P2+0.5*P0*P12)/(P3-0.5*P12*P0));计算新的角度P9=P0*COS(P8);dxP10=-(P2+0.5*P9)*P9/(P3-0.5*P9);dyP2=P2+P9;新的x0P3=P3+P10;新的y0X(P9);电机动作Y(P10)P7=P7-1;步数减一ENDWHILECLOSE四逆圆圆弧插补4.1公式推导圆弧插补的情况如下。

数据采样插补

数据采样插补

在CNC系统中较广泛采用的另一种插补计算方法即所谓数据采样插补法,或称为时间分割法。

它尤其适合于闭环和半闭环以直流或交流电机为执行机构的位置采样控制系统。

这种方法是把加工一段直线或圆弧的整段时间细分为许多相等的时间间隔,称为单位时间间隔(或插补周期)。

每经过一个单位时间间隔就进行一次插补计算,算出在这一时间间隔内各坐标轴的进给量,边计算,边加工,直至加工终点。

与基准脉冲插补法不同,采用数据采样法插补时,在加工某一直线段或圆弧段的加工指令中必须给出加工进给速度v,先通过速度计算,将进给速度分割成单位时间间隔的插补进给量(或称为轮廓步长),又称为一次插补进给量。

例如,在FANUC 7M系统中,取插补周期为8 ms,若v的单位取mm/min,f的单位取mμ/8 ms,则一次插补进给量可用下列数值方程计算:10008260100015vf v⨯⨯==⨯按上式计算出一次插补进给量f后,根据刀具运动轨迹与各坐标轴的几何关系,就可求出各轴在一个插补周期内的插补进给量,按时间间隔(如8 ms)以增量形式给各轴送出一个一个插补增量,通过驱动部分使机床完成预定轨迹的加工。

由上述分析可知,这类算法的核心问题是如何计算各坐标轴的增长数x∆或y∆(而不是单个脉冲),有了前一插补周期末的动点位置值和本次插补周期内的坐标增长段,就很容易计算出本插补周期末的动点命令位置坐标值。

对于直线插补来讲,插补所形成的轮廓步长子线段(即增长段)与给定的直线重合,不会造成轨迹误差。

而在圆弧插补中,因要用切线或弦线来逼近圆弧,因而不可避免地会带来轮廓误差。

其中切线近似具有较大的轮廓误差而不大采用,常用的是弦线逼近法。

有时,数据采样插补是分两步完成的,即粗插补和精插补。

第一步为粗插补,它是在给定起点和终点的曲线之间插入若干个点,即用若干条微小直线段来逼近给定曲线,粗插补在每个插补计算周期中计算一次。

第二步为精插补,它是在粗插补计算出的每一条微小直线段上再做“数据点的密化”工作,这一步相当于对直线的脉冲增量插补。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
double fDeltaL,fL;
double K;
int bXIsBigger;
double GEnd,NEnd;
double GStepVal;//NStepVal;
double AxisGVal,AxisNVal;
double fStVel;
double fDistToEnd;
fStVel=FVal/300000; //插补速度,单位为mm/st
DSM_Line(30,50,1000,10);//输入要插补直线的参数
fclose(fp);
return 0;
}
AxisGVal=AxisNVal=0;
fDeltaL=FVal*Ts/(60*1000); //一个插补周期内的合成增量,单位为毫米
fL=sqrt(XEnd*XEnd+YEnd*YEnd);
K=fDeltaL/fL;
//确定引导坐标和非引导坐标
if (fabs(XEnd>=fabs(YEnd)))
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;
}
}
}
/********************************************************************/
/*函数名: DSM_Line*/
/*功能:数据采样法直线插补*/
/*参数:double XEnd, double YEnd插补终点mm*/
{
bXIsBigger=1;
GEnd=XEnd;
NEnd=YEnd;
}
else
{
bXIsBigger=0;
GEnd=YEnd;
NEnd=XEnd;
}
GStepVal=GEnd*K;
fDistToEnd=(AxisGVal-GEnd)*(AxisGVal-GEnd)+(AxisNVal-NEnd)*(AxisNVal-NEnd);
es=FT/2;
a=2*asin(FT/2/radius);//每个插补周期所超过的弦线对应的圆心角
xCur=xSt,yCur=ySt;
InsertPoint(xCur,yCur);
if(bIsCW==0)//逆圆插补
{
while(judge==1||full_circle==1)//终点判断
{
xCur1=xCur*cos(a)-yCur*sin(a);//三角函数圆弧插补的迭代公式
#include<stdlib.h>
#include<stdio.h>
/********************************************************************/
/*函数名: InsertPoint*/
/*功能:控制机床各轴进给并将进给结果写入文件中*/
printf("please input filename:\n");
scanf("%s",fn);
if((fp=fopen(fn,"w"))==NULL)
{
printf("can't open file\n");
exit(0);
}
//DSM_Circle(40,0,40,0,40,1000,10,1);//输入要插补圆弧的参数
/*参数:double x, double y插补点单位:毫米*/
/*说明:与机床硬件关联,每产生一个点调用一次*/
/********************************************************************/
void InsertPoint(double xCur,double yCur)
{
double FT,a,xCur,yCur,xCur1;
double es,xdir,ydcle=0,judge=1;
int ndir;
if(xSt==xEnd&ySt==yEnd)
full_circle=1;//整圆判断
FT=FVal*Ts/60/1000.0;
}
fDistToEnd=(AxisGVal-GEnd)*(AxisGVal-GEnd)+(AxisNVal-NEnd)*(AxisNVal-NEnd);
}
}
/********************************************************************/
/*函数名: DSM_Circle*/
//该函数在VC++6.0下编译测试通过,可实现直线、圆弧、完整圆的数据采样法插补;并可将插补函数计算出的数//据点写入xxx.txt文件中
//若有任何疑问,欢迎邮件联系,dingjiang90@
//版权所有,侵权必究。转载时请注明来自大连理工机械工程学院Deanjiang
#include<math.h>
/* bool bIsCW圆弧插补方向0或1*/
/********************************************************************/
void DSM_Circle(double xSt, double ySt, double xEnd, double yEnd,double radius, double FVal, int Ts, int bIsCW)
full_circle=0;
xdir=xCur-xEnd;
ydir=yCur-yEnd;
ndir=Judge_Quadrant(xdir,ydir);
switch(ndir)
{
case 1:judge=xdir>=es||ydir>=es;break;
case 2:judge=(-xdir)>=es||ydir>=es;break;
}
}
}
else//顺圆插补
{
while(judge==1||full_circle==1)//终点判断
{
xCur1=xCur*cos(a)+yCur*sin(a);//三角函数圆弧插补的迭代公式
yCur=yCur*cos(a)-xCur*sin(a);
xCur=xCur1;
InsertPoint(xCur,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 xmm*/
/*double ymm
*/
/********************************************************************/
/*功能:数据采样法圆弧插补*/
/*参数:double XStart, double YStart插补起点mm*/
/*double XEnd, double YEnd插补终点mm*/
/*double FVal插补速度mm/min*/
/* unsigned short Ts插补周期ms*/
/*double radius圆弧半径mm*/
case 3:judge=(-xdir)>=es||(-ydir)>=es;break;
case 4:judge=xdir>=es||(-ydir)>=es;break;
}
}
}
}
FILE *fp;//文件指针
int main()
{
double ft=1000.0*10/60/1000;
char fn[10];
while (fDistToEnd>(fDeltaL*fDeltaL/4))
{
AxisGVal+=GStepVal;
AxisNVal=AxisGVal*NEnd/GEnd;
if (bXIsBigger)
{
InsertPoint(AxisGVal,AxisNVal);
}
else
{
InsertPoint(AxisNVal,AxisGVal);
/*double FVal插补速度mm/min*/
/* unsigned short Ts插补周期ms*/
/********************************************************************/
void DSM_Line(double XEnd, double YEnd, double FVal, unsigned short Ts)
相关文档
最新文档