步进电机--S 曲线的C算法

本文详细介绍了S曲线生成算法的具体实现过程,包括最大加加速度、最大加速度、启动速度等关键参数的计算方法,并提供了具体的C语言实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Created with Raphaël 2.1.0Foo1Foo1Foo2Foo2Foo3Foo3Foo4Foo4Foo5Foo5To boundaryTo controlTo entityTo database

S 曲线生成 函数

static void Calc_S_Curve(S_MOTOR *pmotor,u8 model)
{
/* 
S型 曲线生成 公式

1.变量说明
Jmax: 最大加加速度。
Amax:最大的加速度。
Fstart:启动速度
T:阶段时间(三个阶段时间相等)

2.基本换算公式
Jmax=Amax/T
Faa=Fstart+0.5*Jmax*t*t
Fua=Faa+Amax*t
Fra=Fmax-0.5*Jmax*(T-t)*(T-t) 

2.已知 Fstart,T,Fmax 计算其他分量

Fra(min)=Fua(max)
Fmax-0.5*Jmax*T*T=Amax*T+Fstart+0.5*Jmax*T*T
Fmax-0.5*Amax*T=Amax*T+Fstart+0.5*Amax*T

Amax=(Fmax-Fstart)/(2T)
JMAX=Amax/T=(Fmax-Fstart)/(2T*T)

*/

float f;
u32 i;
float   STEP_FACTOR;
float Amax;
float T=pmotor->s.T;
float Jmax;
float Fstart =pmotor->s.Fstart;
float Fmax   =pmotor->s.Fmax;
float val;


STEP_FACTOR=DEFAULT_STEP_FACTOR;    


/* 已知 Fstart,T,Fmax 计算其他分量 */

if(model==3)//3/3
{

}
else if(model=2)//2/3
{
T=T*2/3;
Fmax=Fmax*2/3;
}
else//1/3
{
 T=T*1/3;
 Fmax=Fmax*1/3;
}


Amax=(Fmax-Fstart)/(2*T);
Jmax=Amax/T;
pmotor->s.Amax=Amax;
pmotor->s.Jmax=Jmax;    




   /*  加加速度阶段 */
    for(i=0;i<DIVERGENCE_CNT;i++)
    {
        f=Fstart+0.5*Jmax*(i*T/DIVERGENCE_CNT)*(i*T/DIVERGENCE_CNT);
        pmotor->s.atime[i]=FREQ_2_TIME/f;
        pmotor->s.astep[i]=f*(T/DIVERGENCE_CNT)/STEP_FACTOR;
    }

   /* 恒速加速阶段 */
    Fstart=f;
      for(i=0;i<DIVERGENCE_CNT;i++)
    {
        f=Fstart+Amax*(i*T/DIVERGENCE_CNT);
        pmotor->s.atime[i+DIVERGENCE_CNT]=FREQ_2_TIME/f;
        pmotor->s.astep[i+DIVERGENCE_CNT]=f*(T/DIVERGENCE_CNT)/STEP_FACTOR;
    }
    /* 减加速阶段 */
     for(i=0;i<DIVERGENCE_CNT;i++)
    {
        f=Fmax-0.5*Jmax*(T-i*T/DIVERGENCE_CNT)*(T-i*T/DIVERGENCE_CNT);
        pmotor->s.atime[i+DIVERGENCE_CNT*2]=FREQ_2_TIME/f;
        pmotor->s.astep[i+DIVERGENCE_CNT*2]=f*(T/DIVERGENCE_CNT)/STEP_FACTOR;
    }

    //计算 S曲线形成需要的最少步数,上升和下降 完全对称
    pmotor->s.s_steps=0;
    for(i=0;i<(DIVERGENCE_CNT*3);i++)
    {
    pmotor->s.s_steps+=pmotor->s.astep[i];
    }

}

引用块内容

标题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值