摘要:根据前两节内容,已完成所有计算工作,本节内容介绍具体单片机程序流程及代码
一、程序流程图
根据前两节文章内容可知,T型加减速的关键内容是运动类型的判断以及定时器初值的计算,在输出运动参数后即可判断出运动类型,再根据运动类型在主循环程序中计算定时器初值,在定时器中断中判断各运动阶段是否完成,最终实现T型加减速过程,程序流程图如下所示
二、误差分析
在动态计算的过程中,由于51单片机没有硬件乘、除法器,下述定时器初值的递推计算耗时最多,为尽量提升性能,将此步计算放入了主循环中,以节省定时器中断计算量
在12Mhz,12T模式下,STC89C52RC单片机实测控制最高转速约为200RPM,最大的瓶颈在于51单片机的主频速度实太慢,此处可以勾选STC单片机特有的6T双倍速模式,电机的转速上限会有明显的提升
三、关键程序代码
void cal_init()//预计算
{
K1=sqrt(a*X);
tn=4056000/K1;//计算t1
cn=65536-tn; //计算c1
TH0=cn/256;//装定时寄存器初值
TL0=cn%256;
angle_step=angle*X/18; //计算总步数
K2=10*w*w/a;
K3=10*X*w*w/(36*a);
}
void cal_cn()//计算cn
{
if(ready_flag)
{
ready_flag=0;
if(flag==2)
{
tn=tn-2*tn/(4*n+1);
}
else if(flag==4)
{
tn=tn+2*tn/(4*n-1);
}
cn=65536-tn;
}
}
void cal_motion()//计算运动模式
{
if(angle_step==1) flag=1; //转一步
else //转多步
{
if(angle>K2) //有匀速过程
{
motion_flag=1;
angle2_step=K3;
angle3_step=angle_step-2*K3;
angle4_step=K3;
}
else //无匀速过程
{
motion_flag=0;
angle2_step=angle_step/2;
angle4_step=angle_step-angle2_step;
}
}
}
void main()
{
device_init();
TR0=1;//开步进电机
while(1)
{
cal_cn();
}
}
void time0_int() interrupt 1
{
TH0=cn/256;//装定时寄存器初值
TL0=cn%256;
PUL=1;_nop_();_nop_();nop_();nop_();PUL=0;//上升沿产生脉冲
switch (flag)
{
case 1: //转1步
TR0=0;
break;
case 2: //加速阶段
n++;
if(n==angle2_step) //加速结束
{
if(motion_flag) //有匀速
{
flag=3;
n=0;
}
else //无匀速
{
flag=4;
n=angle4_step;
}
}break;
case 3: //匀速阶段
n++;
if(n==angle3_step)
{
flag=4;
n=angle4_step;
}break;
case 4: //减速阶段
n--;
if(n==0)
{
TR0=0; //关步进电机
}break;
default:
break;
}
ready_flag=1;
}
四、总结
上述代码实现了步进电机采用T型加减速的方式转动5圈,输入参数有驱动器细分值,转动角度,加速度、最大角速度。其中转动角度的单位是0.1°,例如输入100,实际代表转动10°。此种控制方式相对于S曲线加减速灵活性更高,可以实现加减速大小的实时调节,灵活性较好,同时可以大幅节省data资源
五、附件
完整代码工程文件请见微信小程序: