七段式程序代码实现
通过labview代码编辑实现了七段式调速程序设计,根据七段式分析:
通过学习各个博主的文章,最后根据各个博主的内容进行仿真实现了全部功能。
根据上图,通过labview进行仿真。
通过labview仿真波形可以得出7段式S曲线,该曲线能够能够实现。但是有很多博主未发现一个问题,很多7段式未解释清楚,我们要的是7段式而非5段式,4段式等。因此,我们需要考虑这个问题。推理过程我就不做熬述,我会给出相关博主的推导过程链接:
7段式S曲线推导过程
通过仿真可以确定以下几点关键技术:
(1)在脉冲输出点数少于7个点的时候就需要5段式、4段式、甚至是3段式、运速,这几个关键点需要靠大家自己去设计一个恒定值去调试设备。
(2)由于公式计算量比较大,产生的点数也比较多,因此,需要很大的存储量,因此,利用FIFO的算法还是比较合适。
(3)我附上的算法式STM32F4系列的算法,计算周期50us之内。不能够满足200kHz脉冲最高频率速度的要求,需要更好硬件计算,实时性上要求较高。
解决办法:一种是刚说的FIFO;另外一种是换成FPGA的方式生成PWM波,硬件性能可以提高很多,因此,我将更换方案改为国内生产的FPGA作为方案进行设计。
STM32F4七段式代码已经附上:
void CalF_PulseFunc(CalF_Pulse *FuncPto)
{
float TempAmaxORG = 0;
FuncPto->D = (float)FuncPto->SumstepS_per_r/FuncPto->SumstepPulses_per_r/1000.0;//计算出单脉冲行程 mm/pulse
//这里最好是计算出整数
FuncPto->Sumsteps=(FuncPto->q1-FuncPto->q0)/FuncPto->D;//计算出脉冲总数 N
//判断是否存在最大加速度
if(((FuncPto->RelAmax-FuncPto->v0)*FuncPto->RelJmax)< pow(FuncPto->RelAmax,2)) //计算出平方
{
//==============================================
//
//==============================================
if(FuncPto->v0 > FuncPto->RelVmax)
{
FuncPto->Ta =0;
FuncPto->Tj1 =0;
FuncPto->alima=0;
}
else
{
FuncPto->Tj1=sqrtf((FuncPto->RelVmax-FuncPto->v0)*FuncPto->RelJmax);
FuncPto->Ta= FuncPto->Tj1*2.0;
FuncPto->alima= FuncPto->Tj1*FuncPto->RelJmax;
}
}
else
{
FuncPto->Tj1=FuncPto->RelAmax/FuncPto->RelJmax;
FuncPto->Ta= FuncPto->Tj1+(FuncPto->RelVmax-FuncPto->v0)/FuncPto->RelAmax;
FuncPto->alima= FuncPto->RelAmax;
}
//
if(((FuncPto->RelAmax-FuncPto->v1)*FuncPto->RelJmax)< pow(FuncPto->RelAmax,2)) //计算出平方
{
//==============================================
//
//==============================================
if(FuncPto->v1 > FuncPto->RelVmax)
{
FuncPto->Td =0;
FuncPto->Tj2 =0;
FuncPto->alimd=0;
}
else
{
FuncPto->Tj2=sqrtf((FuncPto->RelVmax-FuncPto->v1)*FuncPto->RelJmax);
FuncPto->Td= FuncPto->Tj2*2.0;
FuncPto->alimd= FuncPto->Tj2*FuncPto->RelJmax;
}
}
else
{
FuncPto->Tj2=FuncPto->RelAmax/FuncPto->RelJmax;
FuncPto->Td= FuncPto->Tj2+(FuncPto->RelVmax-FuncPto->v1)/FuncPto->RelAmax;
FuncPto->alimd= FuncPto->RelAmax;
}
//判断是否存在匀速段
FuncPto->Tv = (FuncPto->q1-FuncPto->q0)/FuncPto->RelVmax - FuncPto->Ta/2*(1.0+FuncPto->v0/FuncPto->RelVmax)-FuncPto->Td/2*(1.0+FuncPto->v1/FuncPto->RelVmax);
FuncPto->T=FuncPto->Ta+FuncPto->Tv+FuncPto->Td;
if(FuncPto->Tv>=0) //存在匀速段
{
FuncPto->vlim = FuncPto->RelVmax;
}
else //不存在匀段
{
FuncPto->Tv = 0;//Tv = 0 ;
TempAmaxORG=FuncPto->RelAmax;
FuncPto->Delta =pow(FuncPto->RelAmax,4)/pow(FuncPto->RelJmax,2) +
2.0*(pow(FuncPto->v0,2.0)+pow(FuncPto->v1,2.0))+
FuncPto->RelAmax*(4.0*(FuncPto->q1