电机速度曲线规划2:S形速度曲线设计与实现
??電機驅動是很常見的應用,在很多系統(tǒng)中我們都會碰到需要改變電機的速度以實現(xiàn)相應的控制功能,這就涉及到電機速度曲線規(guī)劃的問題。在這篇中我們就來簡單討論一下電機的S型曲線規(guī)劃的問題。
1、基本原理
??S型速度曲線控制算法是工業(yè)控制領域另一種常用的加減速控制策略,S型曲線很好的克服了T型曲線加速度不連續(xù)的問題。
??S型曲線實際就是實現(xiàn)一個加速度的T型變化過程,具體來說就是加速度增加、加速度恒定、將速度減小的過程。在整個速度調節(jié)規(guī)程中,加速度是連續(xù)變化的,而反映到速度的變化就是一條平滑的S型曲線。如下圖所示:
??這是比較常見的S曲線的形式,其函數(shù)表達式如下:
??這一函數(shù)是這類函數(shù)的一個特例,其并不具有普遍性。在我們應用中,我們可能會需要根據(jù)應用的要求對S型曲線在橫軸和縱軸兩個方向平移或拉伸。所以這一函數(shù)更為普遍的描述如下:
??在這一表達式中,A表示在縱軸方向的平移,B表示在縱軸方向的拉伸,a表示在橫軸方向的拉伸,b表示在橫軸方向的平移。具體反映到函數(shù)圖形上就是如下圖所示:
??那么究竟如何使用這一S曲線函數(shù)來對電機進行調速呢?我們考慮到,所謂電機調速實際就是電機速度與運行時間之間存在一定的函數(shù)關系。很顯然,縱軸就是電機速度,橫軸就是運行時間。于是我們就可以得到電機的S型速度曲線的函數(shù)關系如下:
??可能大家會發(fā)現(xiàn),這個速度曲線的函數(shù)似乎與前面的數(shù)學函數(shù)有些許差別。這是為了更好的適應調速的區(qū)別。在數(shù)學上,數(shù)軸都是對稱的,但在速度調節(jié)過程中,速度和時間都不可能存在負數(shù)的情況,所以我們需要對其進行平移。但是平移之后,S曲線的圖形就不對稱了,所以我們以整個調速過程的調速時間的中間點為軸就是對稱的了,所以就有了上述的函數(shù)表達式。
2、設計與實現(xiàn)
??我們已經簡單描述了S型速度規(guī)劃曲線的數(shù)學原理及應用表達式。接下來我們來考慮怎么實現(xiàn)它。
??考慮到在同一個驅動器中可能因為應用場景的需要存在多條的速度規(guī)劃曲線。所以我們以基于對象的思路來考慮它,這樣我們在更換不同的曲線就只需要更換不同的曲線實力就可以了。所以我們先來分析一下曲線對象的屬性和操作。
??鑒于前面的分析,我們認為作為一個調速曲線對象至少要記錄:開始調速時的初始速度、當前速度、目標速度、加速度、最大速度、最小速度、調速時間、調速時間跨度、曲線類型以及S曲線拉伸度等,我們將這些記為對象的屬性。據(jù)此我們可以定義電機速度曲線的對象類型為:
/* 定義電機速度曲線對象 */ typedef struct CurveObject {float startSpeed; //開始調速時的初始速度float currentSpeed; //當前速度float targetSpeed; //目標速度float stepSpeed; //加速度float speedMax; //最大速度float speedMin; //最小速度uint32_t aTimes; //調速時間uint32_t maxTimes; //調速跨度SpeedCurveType curveMode; //曲線類型float flexible; //S曲線拉伸度 }CurveObjectType;??我們已經定義了一個速度曲線對象類型,接下來我們就來分析如何實現(xiàn)一個S型調速曲線。我們已經描述過,速度其實就是時間的函數(shù),根據(jù)我們前面分析的速度時間的函數(shù)表達式,我們實現(xiàn)如下:
void (*pCalCurve[])(CurveObjectType *curve)={CalCurveNone,CalCurveTRAP,CalCurveSPTA};/* 電機曲線加減速操作-------------------------------------------------------- */ void MotorVelocityCurve(CurveObjectType *curve) {float temp=0;if(curve->targetSpeed>curve->speedMax){curve->targetSpeed=curve->speedMax;}if(curve->targetSpeed<curve->speedMin){curve->targetSpeed=curve->speedMin;}if((fabs(curve->currentSpeed-curve->startSpeed)<=curve->stepSpeed)&&(curve->maxTimes==0)){if(curve->startSpeed<curve->speedMin){curve->startSpeed=curve->speedMin;}temp=fabs(curve->targetSpeed-curve->startSpeed);temp=temp/curve->stepSpeed;curve->maxTimes=(uint32_t)(temp)+1;curve->aTimes=0;}if(curve->aTimes<curve->maxTimes){pCalCurve[curve->curveMode](curve);curve->aTimes++;}else{curve->currentSpeed=curve->targetSpeed;curve->maxTimes=0;curve->aTimes=0;} }/*S型曲線速度計算*/ static void CalCurveSPTA(CurveObjectType *spta) {float power=0.0;float speed=0.0;power=(2*((float)spta->aTimes)-((float)spta->maxTimes))/((float)spta->maxTimes);power=(0.0-spta->flexible)*power;speed=1+expf(power);speed=(spta->targetSpeed-spta->startSpeed)/speed;spta->currentSpeed=speed+spta->startSpeed;if(spta->currentSpeed>spta->speedMax){spta->currentSpeed=spta->speedMax;}if(spta->currentSpeed<spta->speedMin){spta->currentSpeed=spta->speedMin;} }??在這個實現(xiàn)中,我們出于更普遍的實用性考慮,將各種曲線的相同操作集成在一起,然后將它們差異的部分通過曲線類型屬性以回調函數(shù)的方式集成。
3、應用與驗證
??我們實現(xiàn)了S型電機速度規(guī)劃曲線的基本設計與實現(xiàn)。接下來,我們就是用這一調速曲線來實現(xiàn)一個電機調速的實例。我們定義速度規(guī)劃曲線時,是及與對象的思想來實現(xiàn)的,所以我們先聲明一條曲線對象實例。
??CurveObjectType curve; //電機調速曲線
??在聲明了這一曲線對象后,我們需要對其初始化賦值才能正確的使用。大多數(shù)的屬性直接根據(jù)應用對象的要求給予初始值就可以了。需要注意的是曲線類型這一屬性,這將決定使用什么樣的速度規(guī)劃曲線。該屬性為SpeedCurveType枚舉,該枚舉定義如下:
/* 定義電機速度曲線類型枚舉 */ typedef enum SpeedCurve {CURVE_NONE=0, //直啟CURVE_TRAP=1, //梯形曲線CURVE_SPTA=2 //S型曲線 }SpeedCurveType;??在這里我們需要將曲線類型初始化為T形速度規(guī)劃曲線。具體操作如下:
??curve.curveMode=CURVE_SPTA;
??初始化完成之后就可以使用曲線對象來實現(xiàn)電機速度的調節(jié)了。使用也很簡單,只要按一定的時間周期調用我們前面實現(xiàn)的MotorVelocityCurve函數(shù)就可以實現(xiàn)整個調速過程。具體如下:
??MotorVelocityCurve(&curve);
??在每次調速開始之前都需要設置取下的開始速度和目標速度,這樣函數(shù)就會按照設定的起始速度和目標速度實現(xiàn)速度調整。
4、小結
??S型速度曲線將整個運動過程劃分為7個階段,即加加速度段、勻加速度段、減加速度段、勻速段、加減速度段、勻減速度段和減減速度段,不同階段速度銜接處加速度是連續(xù)的,且加速度的變化率可控,克服了梯形速度曲線中存在的加速度突變的不利影響,這是S型曲線的一大優(yōu)勢。
??但是相比于T型速度曲線,S型曲線的計算量要大很多,實現(xiàn)起來也比T型曲線更為復雜。不過這些在現(xiàn)在的處理系統(tǒng)中都不再是問題。在使用過程中需要關注參數(shù)設定,特別是拉伸系數(shù),必須根據(jù)應用場合需要仔細調整。如果太小,中間調速過程會變平坦,起始和結束階段則會相對變化較快;如果太大,其實和結束過程會變得比較平坦,但中間部分會變化較快。具體就要看應用需求了。
歡迎關注:
總結
以上是生活随笔為你收集整理的电机速度曲线规划2:S形速度曲线设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 滤波器开发之四:基于算术平均的中值滤波器
- 下一篇: Python序列类型常用函数练习:enu