资源简介

基于STM32做的运动控制器代码,支持圆弧直线插补 给有需要的人参考。

资源截图

代码片段和文件信息




#include“motion.h“

signed long X_Current;//位置脉冲当前值
signed long Y_Current;//位置脉冲当前值


u32 RR;//半径的平方
u32 XY_Inc_Remain;//插补总增量剩余
u32 X_Inc_Target;//X轴目标增量
u32 Y_Inc_Target;//Y轴目标增量
u32 X_Relative;//X轴当前相对值
u32 Y_Relative;//Y轴当前相对值


u8 MOV_Command;//运动命令种类 LINE~0 SR1~1 SR2~2 SR3~3 SR4~4 NR1~5 NR2~6 NR3~7 NR4~8
u8 XY_Flag;//
u8 G90G91_Flag;//绝对坐标/相对坐标标志


void SPEED(u16 speed);
void LINE(signed long xsigned long y);//直线插补指令
void SR1(void);//第一象限顺圆圆弧
void SR2(void);//第二象限顺圆圆弧
void SR3(void);//第三象限顺圆圆弧
void SR4(void);//第四象限顺圆圆弧
void NR1(void);//第一象限逆圆圆弧
void NR2(void);//第二象限逆圆圆弧
void NR3(void);//第三象限逆圆圆弧
void NR4(void);//第四象限逆圆圆弧


/*
0xff81 SR1
0xff82 SR2
0xff83 SR3
0xff84 SR4
0xff85 NR1
0xff86 NR2
0xff87 NR3
0xff88 NR4

0xff89 LINEA
0xff8A LINEI
0xff8B DELAY
 
*/




void wait()
{
while(XY_Inc_Remain)
{
;
}
}


/*
*/
//定时器2初始化函数
void SPEED(u16 speed)
{
if(speed<8)
{
TIM3_PSC=576-1;
TIM3_ARR=(62500/speed)-1; 
}
else//speed>=8
{
if(speed<16)//8<=speed<16//72
{
TIM3_PSC=72-1;
TIM3_ARR=(500000/speed)-1; 
}
else//speed>=16
{
if(speed<32)//16<=speed<32//36
{
TIM3_PSC=36-1;
TIM3_ARR=(1000000/speed)-1; 
}
else//speed>=32
{
if(speed<64)//32<=speed<64//18
{
TIM3_PSC=18-1;
TIM3_ARR=(2000000/speed)-1; 
}
else//speed>=64
{
TIM3_PSC=9-1;
TIM3_ARR=(4000000/speed)-1; 
}
}
}
}
}







/*
函数名称:G01/LINE
函数功能:直线插补
输入参数:
signed long x
signed long y
返回值:无
*/
void G01(signed long xsigned long y)//直线插补指令
{
if(x >= X_Current)
{
X_Inc_Target = x - X_Current;
GPIOD_BRR=1<<1;//x_DIR = 1;
}
else//x < x_current
{
X_Inc_Target = X_Current - x;
GPIOD_BSRR=1<<1;//x_DIR = 0;
}
if(y >= Y_Current)
{
Y_Inc_Target = y - Y_Current;
GPIOD_BRR=1<<3;//y_DIR = 1;
}
else//y < y_current
{
Y_Inc_Target = Y_Current - y;
GPIOD_BSRR=1<<3;//y_DIR = 0;
}
XY_Inc_Remain = X_Inc_Target + Y_Inc_Target; 
X_Relative = 0;
Y_Relative = 0;

if(X_Inc_Target > Y_Inc_Target)
{
XY_Flag=1;
GPIOD_BRR=1<<0;//x_PUL=0;
}
else//x_rel <= y_rel
{
XY_Flag=0;
GPIOD_BRR=1<<2;//y_PUL=0;
}
MOV_Command=0;//运动命令种类 LINE~0 SR1~1 SR2~2 SR3~3 SR4~4 NR1~5 NR2~6 NR3~7 NR4~8
TIM3_CNT=0;
TIM3_CR1|=1<<0;              //启动定时器TIMER3计数//T2CON=0x04;//启动脉冲输出
wait();
}




void SR_NR(void)
{
if(Y_Relative>X_Relative)
{
XY_Flag=1;
GPIOD_BRR=1<<0;//x_PUL=0;
}
else
{
XY_Flag=0;
GPIOD_BRR=1<<2;//y_PUL=0;
}
TIM3_CNT=0;
TIM3_CR1|=1<<0;              //启动定时器TIMER3计数//T2CON=0x04;//启动脉冲输出
wait();
}



void SR1(void)//第一象限顺圆圆弧
{
GPIOD_BRR=1<<1;//x_DIR = 1;
GPIOD_BSRR=1<<3;//y_DIR = 0;
MOV_Command=1;//命令种类 LINE~0 SR1~1 SR2~2 SR3~3 SR4~4 NR1~5 NR2~6 NR3~7 NR4~8
SR_NR();
}


void SR2(void)//第二象限顺圆圆弧
{
GPIOD_BRR=1<<1;//x_DIR = 1;
GPIOD_BRR=1<<3;//y_DIR = 1;
MOV_Command=2;//命令种类 L

评论

共有 条评论