加減速曲線

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) )

註:

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 }

 

 

 

 

 

Tags: