|
基于STM32步進電機s型加減速控制
0.png (97.03 KB, 下載次數: 163)
下載附件
2018-8-14 02:48 上傳
一個物體從起點運動到終點,要經歷加速,勻速,減速的過程,把整個過程中速度隨時間變化關系畫出來,就是速度曲線.
S型加減速就是指速度曲線中加減速階段的曲線呈現一個英文字母'S'型.
S型加減速相對于梯形加減速更加平穩,對電機和傳動系統的沖擊更小.
S型加減速的曲線并沒有限定是什么曲線,所以可以是指數曲線,可以是正弦曲線.這里分析的S型加減速是基于加速度勻速變化的曲線.
S型加減速的優點就是啟動和停止都很平滑,不會有很大的沖擊,但缺點就是啟動和停止的時間比較長.
具體的加減速的速度曲線看背景圖….
右圖就是S型加速曲線和對應的加速度曲線示意圖
在加速過程中,前半部分由于加速度是勻速遞增的,
這段曲線我們稱為加加速段曲線(后面稱它為IncAccel),后半部分是加速度勻速遞減的,稱為減加速段(DeAccel).
加加速段是加速度關于時間的斜率為正的直線,減
加速則是加速度關于時間的斜率為負的直線.
加速度從0開始變化,到了最大值開始減小,最后為0,
由于加速度的斜率是相同的,所以加加速度和減加速度
所用的時間是一樣.這兩段曲線是關于加速度最大值的對應的速度中心對稱的.
0.png (60.57 KB, 下載次數: 169)
下載附件
2018-8-14 02:48 上傳
0.png (106.9 KB, 下載次數: 153)
下載附件
2018-8-14 02:48 上傳
0.png (153.08 KB, 下載次數: 162)
下載附件
2018-8-14 02:49 上傳
0.png (46.72 KB, 下載次數: 178)
下載附件
2018-8-14 02:49 上傳
單片機源程序如下:
- #include "Speed.h"
- //函數名稱: CalculateSpeedTab
- //函數功能:計算加減速表
- //參數參數:Speed 速度結構體
- // V0; //初速度,單位:step/s
- // Vt; //末速度,單位:step/s
- // S; //路程,單位:step
- // t; //加速時間,單位:s
- // time; //加速次數 單位:次
- // *SpeedTab; //加速速度表,速度單位:step/s
- // SecSpeedPoint; //減速點 單位:step
- //返回輸出:速度結構體
- static Speed_t CalculateSpeedTab(Speed_t Speed)
- {
- int i;
- double aa; //加加速
- int DeltaV; //速度變化量
- int tempVt;
- //如果速度記錄表的指針為空,說明沒有分配內存
- RT_ASSERT(Speed->SpeedTab != RT_NULL);
- //各參數是否超范圍
- RT_ASSERT(IS_SPEED(Speed->V0, Speed->Vt));
- RT_ASSERT(IS_SPACE(Speed->S));
- RT_ASSERT(IS_ADDTIMING(Speed->t));
- RT_ASSERT(IS_ADDTIME(Speed->time));
- //根據加速法則計算末速度
- tempVt = LASTVELOCITY(Speed->S / SPEEDPRINCIPLE, Speed->V0, Speed->t);
- Speed->Vt = (tempVt > Speed->Vt) ? Speed->Vt : tempVt;
- Speed->SecSpeedPoint = ACCELERATESPACE(Speed->V0, Speed->Vt, Speed->t); //計算減速點位置,剩余路程為該值時開始減速
- aa = (double)((Speed->Vt - Speed->V0) / 2) //加速度變化拐點時的速度值 a| /|\
- * 2 //知道直角三角形面積,逆推三角型高度時將面積*2 | / | \面積為DeltaV
- / (Speed->time / 2) //除以底邊 | / | \
- / (Speed->time / 2); //再除以底邊,得到斜率,即加加速 |/___|___\__time
- //開始速度計算
- for(i = 0; i < ((Speed->time / 2) + 1); i++)
- {
- DeltaV = (aa * i * i) / 2; //V = V0 + a * t / 2; a = aa * t;
- *(Speed->SpeedTab + i) = Speed->V0 + DeltaV; //當前點的速度
- *(Speed->SpeedTab + Speed->time - i) = Speed->Vt - DeltaV; //對稱點的速度
- }
- return Speed;
- }
- //函數名稱:TestSpeed
- //函數功能:測試速度表計算函數
- //函數參數:V0 初速度,單位:轉/min
- // Vt 末速度,單位:轉/min
- // S 路程,單位:mm
- // time 加速次數
- //函數返回:無
- void TestSpeed(int V0, int Vt, int S, int time)
- {
- int i;
- Speed_t Speed = (Speed_t)rt_malloc(sizeof(struct SPEED));
- Speed->V0 = STEPSPEED(V0); //起速
- Speed->Vt = STEPSPEED(Vt); //末速
- Speed->S = TOTALSTEP(S); //路程
- Speed->t = 0.2; //加速時間設為0.2秒
- Speed->time = time; //加速次數
- Speed->SpeedTab = (int *)rt_malloc(sizeof(int) * (Speed->time + 1)); //根據加速次數申請表格內存,加1,以防用的時候超界
- CalculateSpeedTab(Speed); //開始計算
- for(i = 0; i < Speed->time; i++)
- {
- rt_kprintf("SpeedTab[%d] = %d, Acceleration = %d\n"
- , i
- , *(Speed->SpeedTab + i)
- , *(Speed->SpeedTab + i + 1) - *(Speed->SpeedTab + i));
- }
- rt_kprintf("SpeedTab[%d] = %d\n", i, *(Speed->SpeedTab + i));
- rt_free(Speed->SpeedTab);
- rt_free(Speed);
- }
- FINSH_FUNCTION_EXPORT(TestSpeed, Test Speed table calculate);
復制代碼
頭文件:
- #ifndef __SPEED_H__
- #define __SPEED_H__
- #include "rtthread.h"
- #include "finsh.h"
- /* 三分之一加減速法則:
- 加速路程不超過三分之一總路程,
- 這樣做的目的是給減速留有足夠的時間去檢測減速點,
- 進而實現平穩的將速度減到初速度,
- 如果在處理速度夠快的情況下,
- 可以選擇二分之一加減速
- */
- //加減速法則,2分之一法則或3分之一法則
- #define SPEEDPRINCIPLE 3
- //電機最大轉速,單位轉/min
- #define MOTOMAXSPEED 1500
- //電機每轉對應的傳動距離,單位:mm
- #define MOTOROUNDLENGTH 36
- //電機最大初速度,初速度超過該值會對電機造成傷害,單位轉/min
- #define MOTOMAXSTART 200
- //驅動器細分數
- #define DRIVERSFRACTION 1
- //電機細分數
- #define MOTOFRACTION 200
- //根據初速度,末速度,以及時間,計算加速路程
- #define ACCELERATESPACE(V0,Vt,t) (((V0) + (Vt)) * (t) / 2)
- //根據加速路程,初速度,以及時間,計算末速度
- #define LASTVELOCITY(S,V0,t) (2 * (S) / (t) - (V0))
- //根據電機轉速(轉/min),計算電機步速度(step/s)
- #define STEPSPEED(RV) ((RV) * MOTOFRACTION * DRIVERSFRACTION / 60)
- //根據長度計算電機所需走的步數,S的單位為mm
- #define TOTALSTEP(S) S * MOTOFRACTION * DRIVERSFRACTION / MOTOROUNDLENGTH
- struct SPEED
- {
- int V0; //初速度,單位:step/s
- int Vt; //末速度,單位:step/s
- long long S; //路程,單位:step
- double t; //加速時間,單位:s
- int time; //加速次數 單位:次
- int *SpeedTab; //加速速度表,速度單位:step/s
- int SecSpeedPoint; //減速點 單位:step(在電機運動過程中,如果剩余路程小于等于該值,那么電機開始減速)
- };
- typedef struct SPEED * Speed_t;
- //各參數范圍值,可以在此設置參數范圍
- //初速度大于0小于電機最高起速,末速度大于初速度,小于電機最高轉速
- #define IS_SPEED(V0,Vt) (((V0) >= 0) && ((V0) <= STEPSPEED(MOTOMAXSTART)) \
- && ((Vt) >= (V0)) && ((Vt) <= STEPSPEED(MOTOMAXSPEED)))
- #define IS_SPACE(S) ((S) > 0)
- #define IS_ADDTIMING(t) ((t) > 0)
- #define IS_ADDTIME(time) ((time) >= 32) //讓加速次數必須大于等于32,否則計算表格就沒什么意義
- #endif
復制代碼
所有資料51hei提供下載:
S型加減速分析.rar
(2.64 MB, 下載次數: 1151)
2018-8-14 02:50 上傳
點擊文件名下載附件
s型加減速 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|