1. 程式人生 > >電機控制 | S曲線加減速

電機控制 | 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) )

  注:

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 }