电机控制 | S曲线加减速

S型曲线加减速


 

 

1、  S型曲线

1.1 简介

  Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。Sigmoid函数也叫Logistic函数,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。该S型函数有以下优缺点:优点是平滑,而缺点则是计算量大

  Sigmoid函数由下列公式定义:

  Sigmoid函数在[-8,8]的计算数值以及图形如下:

 

  由以上数据与图形可见,S型曲线就是指图形中变化阶段的曲线呈现一个英文字母'S'型,该曲线无限趋向于0和1,即取值范围为(0,1)

 

1.2 曲线延伸

 

函数延伸

说明

取值范围

Y = A + 1 / ( 1 + exp( -x ) )

A分量在Y方向进行平移

( A , A+1 )

Y = B / ( 1 + exp( -x ) )

B分量在Y方向进行拉伸

( 0 , B )

Y = 1 / ( 1 + exp( -ax ) )

a分量在x方向进行平移

( 0 , 1 )

Y = 1 / ( 1 + exp( -x+b ) )

b分量在x方向进行拉伸

( 0 , 1 )

Y = A + B / ( 1 + exp( -ax + b ) )

同上

( A , A+B )

  为了更直观地观察A、B、a、b分量对函数的影响,我整理 了一下对应的曲线图,如下所示:


 

 

  由图可见,A、B分量影响的是曲线的取值范围,而a、b分量影响的则是曲线的平滑程度。

 

 

2、应用场景 – 电机加减速控制

2.1 简介

  电机加减速,顾名思义,即电机以加速方式启动,速度达到预设目标速度后保持一段时间匀速转动,随后又开始以减速方式转动直至电机以一个较低的速度停止转动。

  一方面,电机加减速可以避免电机急开急停,进而可能对电机造成一定损坏;另一方面,也可以防止电机在高驱动速度不能起步的情况,即高驱动速度会出现空转、丢步现象。因而,在电机需要达到一个较高的速度时,通常需要采用慢速加速驱动的方法,简而言之,就是需要有一个加速过程。

  例如:步进电机驱动负载可以按目标速度起动,若目标速度超过自身起动脉冲频率时,则该情况下不能起动。因而,只有当起动频率比电机起动脉冲频率低时才能正常起动,采取加速的方式使速度线性地增加到目标速度,这种方法则称为慢速加速驱动

 

2.2 T型与S型

  目前,在电机加减速控制上,普遍的加减速方法主要有T型加减速S型加减速,实现方法则有公式法查表法

  S型加减速相对于T型加减速更加平稳,对电机和传动系统的冲击更小,即S型加减速的优点是启动和停止都很平滑,不会有很大的冲击,但是也并非不存在缺点,缺点就是启动和停止的时间比较长

 

 

2.3 电机加减速控制

  如要将S型曲线应用到电机的加减速控制上,需要将方程在X、Y坐标系进行平移,同时对曲线进行拉升变化: Y = A + B / ( 1 + exp( -ax + b ) ) ,则根据该曲线方程的相关特征可知,A、B分量可用于控制电机速度(频率)的取值范围,而a、b分量可用于控制速度(频率)变化率。最终根据实际的需要,在加减速过程中采用以下的曲线方程为:

    Fcurrent = Fstart + (Fend-Fstart)/(1+exp( -Flexible(i - Num )/ Num) )

                    = Fstart + (Fend-Fstart)/(1+exp( -(Flexible/Num)*i + Flexible) )

  即此处相当于 A = FstartB = Fend-Fstarta = Flexible/Numb = Flexible ,取值范围为(Fstart,Fend),即加减速的起始速度(频率)以及目标速度(频率)。上述公式各变量说明如下:

Fcurrent

当前频率值

Fstart

起始频率值

Fend

目标频率值

 Flexible

S型曲线拉伸变化。Flexible代表S曲线的平滑程度,Flexible越大说明加速度越大,即曲线越陡,Flexible越小说明曲线越平滑,理想的S曲线Flexible取值为4 ~ 6。

Num

Num一般取值为 Length/2 大小,这样可以使得S曲线对称,Length为加减速点的总个数

i

循环计算过程中的索引,从0开始,到 Length结束

 

  以上公式既可当作加速曲线,也可当作减速曲线。因此,一般情况下,我们只需要计算加速曲线,在减速时作反向操作即可。电机从10kHz加速到100kHz的加速曲线以及从100kHz减速到10kHz的减速曲线示例如下所示:

 

 

2.4 示例代码

  在电机加减速控制上,电机频率越大,电机速度越快。因而,可以通过公式法求出每个加减速点的频率值,进而通过电机频率求出具体的脉冲周期,最后在间隔相同的时间内改变脉冲相关参数(分频、周期、占空比)即可达到加减速的效果。一般情况下,如步进电机、伺服电机等,分频与占空比通常固定数值即可,这样在加减速过程仅需改变输出周期值即可。同时,不同频率脉冲输出时也需要注意脉冲的连续性(即我们需要在当前脉冲完全输出之后才能改变电机频率),否则电机加减速过程就会出现丢步现象,在脉冲数严格要求的情况下造成累积误差。

 1 /**
 2  * @brief: 【公式法】S型加减速曲线计算,公式:Y=Fstart+(Fend-Fstart)/(1+exp(-flexible*(x-num)/num))
 3  * @param   [OUT]   Fre[]       输出频率值
 4  *          [OUT]   Period[]    输出周期值
 5  *          [IN]    Len         变速脉冲点
 6  *          [IN]    StartFre    开始频率
 7  *          [IN]    EndFre      结束频率
 8  *          [IN]    Flexible    曲线参数
 9  * @return: none
10  * @Date: 2020-08-12 10:32:03
11  */
12 void Calculate_S_Curve(float Fre[], u32 Period[],  float Len, float StartFre, float EndFre, float Flexible)
13 {
14     float melo;
15 
16     for(int i = 0; i < Len; i ++)
17     {
18         melo = Flexible * (i-Len/2) / (Len/2);
19         Fre[i] = StartFre + (EndFre - StartFre) / (1 + expf(-melo));
20         Period[i] = (u32)(TIM_CLK / TIM_FRESCALER / Fre[i]);       // TIM_CLK 定时器时钟   TIM_FRESCALER 定时器分频
21     }
22 }

 

 

 

 

 

posted on 2020-08-20 15:24  Tuple  阅读(13814)  评论(2编辑  收藏  举报

导航