资源简介
基于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
- 上一篇:易语言超级列表框全选和删除选项
- 下一篇:FPGA的直方图均衡化Verilog代码
相关资源
- MODBUS从机基于STM32
- 基于STM32实现的模拟I2C
- STM32电机闭环代码.7z
- 欧姆龙CP1H三轴位置控制模板内含直线
- 基于STM32的1MHz、1KHz和1Hz同步方波产生
- STM32库函数DS1302驱动文件
- STM32 DS1302驱动
- STM32 DS18b20
- 基于STM32F103C8T6的手持MP3完整PCB工程文
- STM32L4超低功耗特性概述
- STM32智能家居完整项目代码
- 用STM32的内置Flash做一个超小U盘
- stm32基于轮询方式的串口收发程序
- STM32F030C8T6串口例程
- RFID RC522 stm32f103c8t6 读写demo
- STM32 单位时间内输入方波个数统计函
- 可控硅调节220光程序和原理图.zip
- STM32_ad7705程序
- stm32 控制语音芯片 ISD1760
- STM32F103VCT6设计
- stm32f103c+电机驱动和测速+can+rs485等原
- stm32 uart1 发送接收数据
- 完美解决proteus仿真stm32
- 基于STM32的示波器原理图
- 基于STM32F103的指纹识别程序
- STM32_TCS34725数字颜色传感器
- 基于STM32的MP3播放器设计与实现(提供
- ADS131代码
- codesys运动控制源程序
- STM32F103C8T6脚位分布
评论
共有 条评论