⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 line.c

📁 DSP 2407平台下用C语言实现的数控直线插补源代码 很有用的
💻 C
字号:
#include "LF2407.h"
#include "math.h"
#include "stdio.h"
int N_x,N_y,Done_Flagx,Done_Flagy,Sx,Sy;
float Position_x,Position_y,x,y,K,mycos;

int Residue_x,Residue_y;//插补时的余数
int F=4000;
int t=2;//插补周期取为2ms
//禁止总中断子程序       
void inline disable() 
{
  asm(" setc INTM");
  asm(" setc SXM");
}
//使能总中断子程序
void 	inline 	enable() 
{
   asm(" clrc INTM");
}

void initial()
{
  asm(" setc SXM"); //抑制符号位扩展
  asm(" clrc OVM"); //清楚累加器溢出位
  asm(" clrc CNF"); //将B0配置为数据空间
  *SCSR1=0X83FF;    //×2模式,主频30MHz
  *WDCR=0X0E8;      //禁止看门狗
  
  *IMR=0X0004;       //禁止所有中断
  *IFR=0XFFFF;       //清除所有中断标志
  WSGR=0x00;         //禁止所有等待状态
}

int Hw_Line(float x,float y,float F)     
{
  float f;
  int delta_x,delta_y;
  while(Done_Flagx!=1 || Done_Flagy!=1)
 {   
  f=F*t/60;
  delta_x=f*mycos;
  delta_y=delta_x*K; 
  if(Done_Flagx==0)  //插补未完成
  { 
      N_x=(delta_x+Residue_x)*0.2;			//加上上一次的余数,然后除以5,得x方向发送的脉冲数
      Position_x=Position_x+N_x*0.005;		//当前位置,单位mm 
      Residue_x=(delta_x+Residue_x)%5;		//更新之后供下一次使用
      if((Position_x-x)*Sx>=0)           //如果已经超界了
        {
          delta_x=(x-Position_x+N_x*0.005)*1000;//相当于减去第i-1次的当前位置,um
          N_x=delta_x*0.2;  
          Position_x=x;
          Done_Flagx=1; 
          
        }
       
   }
  if(Done_Flagy==0)
  { 
      N_y=(delta_y+Residue_y)*0.1; //加上上一次的余数,然后除以5,得x方向发送的脉冲数 
      Position_y=Position_y+N_y*0.01;//当前位置,单位mm
      Residue_y=(delta_y+Residue_y)%10; //更新之后供下一次使用
      if((Position_y-y)*Sy>=0)           //如果已经超界了
        {
          delta_y=(y-Position_y+N_y*0.01)*1000;//相当于减去第i-1次的当前位置,um
          N_y=delta_y*0.1;   //最后一次输出的脉冲数,可能跟前几次的不同
         
          Position_y=y;  
           Done_Flagy=1;
         
          
        } 
       
      
   }
 }                                        
 *T2CNT=0X00;                      //计数值归零
 *EVAIFRB=*EVAIFRB & 0X0001;       //清除中断标志
 enable();
}
main()
{
  int flag=1;     //暂定为直线插补标志
  disable(); 
  initial();
  N_x=0;
  N_y=0;
  Position_x=0;
  Position_y=0; 
  Residue_x=0;
  Residue_y=0;
  x=0.562;
  y=0.374;     //假定这是目的坐标 
  *EVAIFRB=0XFFFF;    //清楚T2的所有中断标志
	*T2CON=0X9440;      //连续增计数模式,X/16 ,应该放在主程序中,根据插补的需要而将第6位置位或清零,使能/禁止定时器
	*T2CNT=0X0;
	*T2PER=0X249F;      //这个是一个常数,可以在程序中定义为const,5ms  
	*EVAIMRB=0X000f;   //使能T2的周期中断 ,

  enable();
  while(1)
  {
    if(flag==1)
    { 
      if((x-Position_x)>=0) 
        Sx=1;
      else
        Sx=-1; 
      if((y-Position_y)>=0)
        Sy=1;
      else
        Sy=-1;    
     Done_Flagx=0; 
     Done_Flagy=0; 
     K=(y-Position_y)/(x-Position_x);
     mycos=1/sqrt(1+K*K);//以上为离线计算的变量 
     
    }  
  }
}
void interrupt T2ISR()
{
   switch(*PIVR)
   {
    case 43 : Hw_Line(x,y,F);break; //若未到位置,则继续插补 
  
   }
}

void  interrupt  nothing() 
{
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -