資源簡介
基于STM32做的運(yùn)動控制器代碼,支持圓弧直線插補(bǔ) 給有需要的人參考。
代碼片段和文件信息
#include“motion.h“
signed?long?X_Current;//位置脈沖當(dāng)前值
signed?long?Y_Current;//位置脈沖當(dāng)前值
u32?RR;//半徑的平方
u32?XY_Inc_Remain;//插補(bǔ)總增量剩余
u32?X_Inc_Target;//X軸目標(biāo)增量
u32?Y_Inc_Target;//Y軸目標(biāo)增量
u32?X_Relative;//X軸當(dāng)前相對值
u32?Y_Relative;//Y軸當(dāng)前相對值
u8?MOV_Command;//運(yùn)動命令種類?LINE~0?SR1~1?SR2~2?SR3~3?SR4~4?NR1~5?NR2~6?NR3~7?NR4~8
u8?XY_Flag;//
u8?G90G91_Flag;//絕對坐標(biāo)/相對坐標(biāo)標(biāo)志
void?SPEED(u16?speed);
void?LINE(signed?long?xsigned?long?y);//直線插補(bǔ)指令
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初始化函數(shù)
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;?
}
}
}
}
}
/*
函數(shù)名稱:G01/LINE
函數(shù)功能:直線插補(bǔ)
輸入?yún)?shù):
signed?long?x
signed?long?y
返回值:無
*/
void?G01(signed?long?xsigned?long?y)//直線插補(bǔ)指令
{
if(x?>=?X_Current)
{
X_Inc_Target?=?x?-?X_Current;
GPIOD_BRR=1<<1;//x_DIR?=?1;
}
else//x? {
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_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;//運(yùn)動命令種類?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計(jì)數(shù)//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計(jì)數(shù)//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
評論
共有 條評論