摘要:根据前两节内容,已完成所有计算工作,本节内容介绍具体单片机程序流程及代码
一、程序流程图
根据前两节文章内容可知,T型加减速的关键内容是运动类型的判断以及定时器初值的计算,在输出运动参数后即可判断出运动类型,再根据运动类型在主循环程序中计算定时器初值,在定时器中断中判断各运动阶段是否完成,最终实现T型加减速过程,程序流程图如下所示
二、误差分析
在动态计算的过程中,由于51单片机没有硬件乘、除法器,下述定时器初值的递推计算耗时最多,为尽量提升性能,将此步计算放入了主循环中,以节省定时器中断计算量
在12Mhz,12T模式下,STC89C52RC单片机实测控制最高转速约为200RPM,最大的瓶颈在于51单片机的主频速度实太慢,此处可以勾选STC单片机特有的6T双倍速模式,电机的转速上限会有明显的提升
三、关键程序代码
void cal_init()//预计算
{K1=sqrt(a*X);tn=4056000/K1;//计算t1cn=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资源
五、附件
完整代码工程文件请见微信小程序: