步进电机插补算法stm32.docx
《步进电机插补算法stm32.docx》由会员分享,可在线阅读,更多相关《步进电机插补算法stm32.docx(20页珍藏版)》请在冰豆网上搜索。
![步进电机插补算法stm32.docx](https://file1.bdocx.com/fileroot1/2022-10/8/1ebd8a14-fc96-47dd-90be-38f3b214fa94/1ebd8a14-fc96-47dd-90be-38f3b214fa941.gif)
步进电机插补算法stm32
#include"stm32f10x.h"
#include"delay.h"
#include"misc.h"
#include
#include"stm32f10x_tim.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_usart.h"
#include
voidRCC_Configuration;
voidGPIO_Configuration;
voidNVIC_Configuration;
voidTIM_Configuration;
voidUSART_Configuration;
intfputc;
intfgetc;
floatMx=1.44f,My=2.88f;//起点
floatNx=10.0f,Ny=7.61f;//终点
floatX1,Y1;
floatX2,Y2;
floatX3,Y3;//三种方法走后的坐标
floatk;//斜率
floatb;//y=kx+b
floatX,Y;//实际运行的坐标
floatDelta1,Delta2,Delta3,Delta4;//三种方法的误差,4为不走最后一步的误差
floatDelta;//实际误差
//floatDeltaMax;//最大误差
charway;//选择的走法
inta;//TIM6中断次数
intnum=0;//总步数
inttx=1,ty=1;//用来判断中断是否发生
intnumx,numy;//计XY的步数
intcounter=0;//计数值
floattime;//时间
floatnxd,nyd;//开始减速坐标
floatnx,ny;//nx=Nx-0.0144f;
floatfenmu;//公式中分母
//intfrex[20]={2,10,30,60,100,150,220,300,390,500};
//intfrey[20]={2,10,30,60,100,150,220,300,390,500};
intfrex[20]={1098,2931,7585,18242,37754,62245,81757,92414,97068,98901};
intfrey[20]={1098,2931,7585,18242,37754,62245,81757,92414,97068,98901};
intprex[20]={0};
intprey[20]={0};
intmain
{
inti,j;
intnpwm=10;//加减速每段脉冲数
//算出预分频值
for
{
prex[i]=72000000/;
prey[i]=72000000/;
}
//配置,初始化
RCC_Configuration<>;
GPIO_Configuration<>;
USART_Configuration<>;
TIM_Configuration<>;
NVIC_Configuration<>;
Delay_Init<>;
TIM_Cmd;//catchXY
TIM_Cmd;//计时
//TIM_SetCounter;
//开始运行
{
//计算相关量
X=Mx;
Y=My;
k=/;
b=My-k*Mx;//y=kx+b
nxd=Nx-90*0.0144f;
nyd=Ny-90*0.0144f;
nx=Nx-0.0144f;
ny=Ny-0.0144f;
fenmu=sqrt;
for//加速阶段,分10段
{
while
{
X1=X+0.0144f;
Y1=Y;
X2=X;
Y2=Y+0.0144f;
X3=X+0.0144f;
Y3=Y+0.0144f;
Delta1=fabs/fenmu;
Delta2=fabs/fenmu;
Delta3=fabs/fenmu;//三种走法的误差
//选择最小误差走法
if
{way=1;Delta=Delta1;}
else
{way=2;Delta=Delta2;}
if
{way=3;Delta=Delta3;}
switch//实际走法,while<>为等待中断发生〔中断失能,以确保一步一脉冲
{
case1:
X=X+0.0144f;TIM_Cmd;while;tx=1;break;
case2:
Y=Y+0.0144f;TIM_Cmd;while;ty=1;break;
case3:
X=X+0.0144f;Y=Y+0.0144f;TIM_Cmd;TIM_Cmd;while;tx=1;ty=1;break;
}
num++;
j++;
}
TIM_PrescalerConfig;//改预分频,频率
TIM_PrescalerConfig;
j=0;
}
while//最高频率阶段
{
X1=X+0.0144f;
Y1=Y;
X2=X;
Y2=Y+0.0144f;
X3=X+0.0144f;
Y3=Y+0.0144f;
Delta1=fabs/fenmu;
Delta2=fabs/fenmu;
Delta3=fabs/fenmu;
if
{way=1;Delta=Delta1;}
else
{way=2;Delta=Delta2;}
if
{way=3;Delta=Delta3;}
switch
{
case1:
X=X+0.0144f;TIM_Cmd;while;tx=1;break;
case2:
Y=Y+0.0144f;TIM_Cmd;while;ty=1;break;
case3:
X=X+0.0144f;Y=Y+0.0144f;TIM_Cmd;TIM_Cmd;while;tx=1;ty=1;break;
}
num++;
//ifDeltaMax>
//DeltaMax=Delta;
}
for=0;i-->//减速阶段,分10段
{
TIM_PrescalerConfig;//改预分频,频率
TIM_PrescalerConfig;
while
{
X1=X+0.0144f;
Y1=Y;
X2=X;
Y2=Y+0.0144f;
X3=X+0.0144f;
Y3=Y+0.0144f;
Delta1=fabs/fenmu;
Delta2=fabs/fenmu;
Delta3=fabs/fenmu;//三种走法的误差
//选择最小误差走法
if
{way=1;Delta=Delta1;}
else
{way=2;Delta=Delta2;}
if
{way=3;Delta=Delta3;}
switch//实际走法,while<>为等待中断发生〔中断失能,以确保一步一脉冲
{
case1:
X=X+0.0144f;TIM_Cmd;while;tx=1;break;
case2:
Y=Y+0.0144f;TIM_Cmd;while;ty=1;break;
case3:
X=X+0.0144f;Y=Y+0.0144f;TIM_Cmd;TIM_Cmd;while;tx=1;ty=1;break;
}
num++;
j++;
}
j=0;
}
while//最低频率阶段
{
X1=X+0.0144f;
Y1=Y;
X2=X;
Y2=Y+0.0144f;
X3=X+0.0144f;
Y3=Y+0.0144f;
Delta1=fabs/fenmu;
Delta2=fabs/fenmu;
Delta3=fabs/fenmu;
if
{way=1;Delta=Delta1;}
else
{way=2;Delta=Delta2;}
if
{way=3;Delta=Delta3;}
switch
{
case1:
X=X+0.0144f;TIM_Cmd;while;tx=1;break;
case2:
Y=Y+0.0144f;TIM_Cmd;while;ty=1;break;
case3:
X=X+0.0144f;Y=Y+0.0144f;TIM_Cmd;TIM_Cmd;while;tx=1;ty=1;break;
}
num++;
//ifDeltaMax>
//DeltaMax=Delta;
}
//判断是否要走超出终点
{
X1=X+0.0144f;
Y1=Y;
X2=X;
Y2=Y+0.0144f;
X3=X+0.0144f;
Y3=Y+0.0144f;
Delta1=sqrt<*+*>;
Delta2=sqrt<*+*