• 电机控制 | 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 }

     

     

     

     

     

  • 相关阅读:
    Kruskal重构树学习笔记
    亚洲和欧洲的分界线是谁划分的?
    代码目录 (App_Code 目录)及namespace的理解
    Events解惑——来自MSDN
    HttpContext.Current.Response和Response有什么区别?
    Ramdisk 内存盘的使用
    MVC模式 介绍
    关于Windows Workflow Foundation 调试时的经验小解(不断添加)
    关于类成员变量的声明和实例化的时机
    软件名称备份
  • 原文地址:https://www.cnblogs.com/Tuple-Joe/p/13533324.html
Copyright © 2020-2023  润新知