[  企业注册  登录  ]

上海贝菲自动化仪表有限公司

当前位置:首页

专业论文

DMC3000运动控制卡矢量速度及圆弧插补的常见问题

文件大小:格式:发布时间:2008-02-14浏览次数:
更多
【中文关键词】DMC3000运动控制卡矢量速度及圆弧插补的常见问题          
【摘要】本文介绍了DMC3000运动控制卡矢量速度及圆弧插补的常见问题
【全部正文】

 一、 直线/圆弧插补与矢量速度
  直线插补的矢量速度,本人在《如何正确计算及设置DMC1000插补的矢量速度》中有介绍,虽然DMC3000通过改进,解决了矢量速度的问题,但实际编程应用时,由于参与插补运动的多轴驱动轴脉冲当量不一致,使用户在设定速度时,不知如何选择恰当的脉冲当量进行计算和设定。此问题的解决亦可参照《如何正确计算及设置DMC1000插补的矢量速度》的思路及算法,从而可以解决矢量速度的计算问题。只是程序员务必考虑大数的平方溢出的问题,此问题在《四个编程问题,请稍加留意》一文中得到解决,请参考之。
  对于圆弧插补,从原则上必须是两轴脉冲当量一致,否则作出的圆弧为椭圆。解决它的矢量速度其计算方式较复杂,大量的计算会耽误较多的CPU运算时间,为此,大连理工的曾工提出一简单可行的方法,增加一系数参数供外部设置,具有较好的灵活性,我们在此建议也这样作。
  在此,非常感谢曾工的积极参与和支持。
  二、 圆弧插补的两个问题
  这两上问题都是由于脉冲当量的计算引起的误差造成的,一般用户在编程应用时,都设有一个脉冲当量的设置,以方便把用户惯习单位转成脉冲单位,常见的诸如:毫米单位通过每毫米脉冲数转成脉冲,如下所示:
  long CCtrlCard::M2P( int nAxis, double fMM ) //毫米转脉冲
  {
  return long( fMM * m_axis[ nAxis ].fUnitPM );
  // fUnitPM为指定轴的脉冲当量(每毫米脉冲数)
  }
  如此以来,对于封装类所有成员函数的参数都可以由毫米作为单位,像tag_ARC、tag_SPEED(圆弧/速度)结构,都可以用毫米作单位。
  但是,由于计算精度的问题,由浮点数计算完成后再取整,往往会产生误差,此误差对于圆弧插补的情况会出现意想不到的情况,待会儿一一列出,但对于浮点取整的误差可简单处理之:
  long CCtrlCard::M2P( int nAxis, double fMM ) //毫米转脉冲
  {
  return long( fMM * m_axis[ nAxis ].fUnitPM +(fMM>0?0.5:-0.5));
  }
  通过以上方法,对于下面所示情况就有明显改善了:
  double pk = 1.99999-1.00000;//误差几乎接近一个脉冲了
  int( pk ) = 0;//直接取整,会导致脉冲缺失
  int( pk + (pk > 0?0.5:-0.5 ) ) = int( pk+0.5) = 1;//取得最小的误差
  以上取整方法我们暂命名为0.5取整法(呵呵,临时想的,临时用麻)
  1、 360度整圆情况
  圆弧往一个方向可以作整圆,换一个方向一下子就运动结束了,则现像正是由于圆弧起点和终点不重合而引起的,若以上0.5取整法不能解决,请用下面的方法解决。
  void CCtrlCard::Arc( short nAxis1, short nAxis2,//圆弧插补
  const tag_ARC &arc, const tag_SPEED &speed,
  double dt)
  {
  short axisArray[]={ nAxis1, nAxis2 };
  long ex = d3000_get_command_pos( axisArray[0] );//取得当前位置
  long ey = d3000_get_command_pos( axisArray[1] );
  if( (arc.dir&0x02) )//若为整圆,在arc.dir的第1位上置1,if( 整圆 ) arc.dir |= 0x02;
  ;
  else{//非整圆
  ex = M2P(nAxis1, arc.ex);
  ey = M2P(nAxis2, arc.ey);
  }
  d3000_start_ta_arc( axisArray,
  M2P(nAxis1, arc.ox),
  M2P(nAxis2, arc.oy),
  ex,
  ey,
  (arc.dir&0x01),//只保留第0位作方向判断
  M2P(nAxis1, speed.start),
  M2P(nAxis1, speed.speed),
  speed.accel,
  speed.accel);
  return ;
  }
  ARC和SPEED结构在《一个DMC3000控制卡类的完全源代码》一文中有声明。
  2、 非整圆情况下
  由于起点到圆心的距离R1与终点到圆心的距离R2不相等(哪怕只相差一个脉冲),此圆弧插补行为不可预定(可能会不运动,可能会连续走)。此问题若用0.5取整法不可解决,则用下面方法解决:
  //计算起点到圆心的半径
  double R1 = sqrt( (startX-orginX) * (startX-orginX)+(startY-orginY)*(startY-orginY) );
  //注意这样的运算易引起溢出,在此仅为演示,解决方法已有介绍
  double pi = atan2( endY-orginY, endX-orginX );//计算终点到圆心的斜率
  endX = orginX + R1 * cos( pi );//计算得到新的终点位置
  endY = orginY + R1 * cos( pi );
  //计算新的终点位置不会与原点的相差太多,不用担心,因为我们的目标就是控制1个脉冲误差。当然,以上的计算是建立在脉冲为单位的基础上,不要以毫米数为单位,否则就没有效果了(呵呵)。
  补充一个小问题,若脉冲模式设定不正确,圆弧插补将会在每个90度位置发生很明显的轨迹平移。
  

 

相关论文

暂无评论信息



相关论文

打印本页

联系方式

—上海贝菲自动化仪表有限公司
地址:上海市浦东南路2157号11A
邮编:200127
电话:086-21-50393708 5039370
传真:086-21-50393710
网址:http://www.shbeifei.com
*留言类型: 采购咨询 售后咨询
*联系人:
*联系电话:
*电子邮箱:
*单位名称:
*留言内容: