久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 34376|回復: 70
打印 上一主題 下一主題
收起左側

STM32步進電機S加減速程序源碼與詳細分析

  [復制鏈接]
跳轉到指定樓層
樓主
基于STM32步進電機s型加減速控制


一個物體從起點運動到終點,要經歷加速,勻速,減速的過程,把整個過程中速度隨時間變化關系畫出來,就是速度曲線.
S型加減速就是指速度曲線中加減速階段的曲線呈現一個英文字母'S'型.
S型加減速相對于梯形加減速更加平穩,對電機和傳動系統的沖擊更小.
S型加減速的曲線并沒有限定是什么曲線,所以可以是指數曲線,可以是正弦曲線.這里分析的S型加減速是基于加速度勻速變化的曲線.
S型加減速的優點就是啟動和停止都很平滑,不會有很大的沖擊,但缺點就是啟動和停止的時間比較長.
具體的加減速的速度曲線看背景圖….

右圖就是S型加速曲線和對應的加速度曲線示意圖
在加速過程中,前半部分由于加速度是勻速遞增的,
這段曲線我們稱為加加速段曲線(后面稱它為IncAccel),后半部分是加速度勻速遞減的,稱為減加速段(DeAccel).
加加速段是加速度關于時間的斜率為正的直線,減
加速則是加速度關于時間的斜率為負的直線.
加速度從0開始變化,到了最大值開始減小,最后為0,
由于加速度的斜率是相同的,所以加加速度和減加速度
所用的時間是一樣.這兩段曲線是關于加速度最大值的對應的速度中心對稱的.





單片機源程序如下:
  1. #include "Speed.h"
  2. //函數名稱: CalculateSpeedTab
  3. //函數功能:計算加減速表
  4. //參數參數:Speed 速度結構體
  5. //             V0;                //初速度,單位:step/s
  6. //             Vt;                //末速度,單位:step/s
  7. //             S;                 //路程,單位:step
  8. //             t;                 //加速時間,單位:s
  9. //             time;              //加速次數    單位:次
  10. //             *SpeedTab;         //加速速度表,速度單位:step/s
  11. //             SecSpeedPoint;     //減速點 單位:step
  12. //返回輸出:速度結構體
  13. static Speed_t CalculateSpeedTab(Speed_t Speed)
  14. {
  15.     int i;                        
  16.     double aa;                    //加加速
  17.     int DeltaV;                   //速度變化量
  18.     int tempVt;
  19.     //如果速度記錄表的指針為空,說明沒有分配內存
  20.     RT_ASSERT(Speed->SpeedTab != RT_NULL);
  21.     //各參數是否超范圍
  22.     RT_ASSERT(IS_SPEED(Speed->V0, Speed->Vt));
  23.     RT_ASSERT(IS_SPACE(Speed->S));
  24.     RT_ASSERT(IS_ADDTIMING(Speed->t));
  25.     RT_ASSERT(IS_ADDTIME(Speed->time));
  26.     //根據加速法則計算末速度
  27.     tempVt = LASTVELOCITY(Speed->S / SPEEDPRINCIPLE, Speed->V0, Speed->t);
  28.     Speed->Vt = (tempVt > Speed->Vt) ? Speed->Vt : tempVt;                                                   
  29.     Speed->SecSpeedPoint = ACCELERATESPACE(Speed->V0, Speed->Vt, Speed->t);        //計算減速點位置,剩余路程為該值時開始減速
  30.     aa = (double)((Speed->Vt - Speed->V0) / 2)      //加速度變化拐點時的速度值                           a|   /|\            
  31.         * 2                                         //知道直角三角形面積,逆推三角型高度時將面積*2        |  / | \面積為DeltaV
  32.         / (Speed->time / 2)                         //除以底邊                                            | /  |  \            
  33.         / (Speed->time / 2);                        //再除以底邊,得到斜率,即加加速                      |/___|___\__time   
  34.     //開始速度計算
  35.     for(i = 0; i < ((Speed->time / 2) + 1); i++)
  36.     {
  37.         DeltaV = (aa * i * i) / 2;                                     //V = V0 + a * t / 2;  a = aa * t;
  38.         *(Speed->SpeedTab + i) = Speed->V0 + DeltaV;                   //當前點的速度
  39.         *(Speed->SpeedTab + Speed->time - i) = Speed->Vt - DeltaV;     //對稱點的速度
  40.     }
  41.     return Speed;
  42. }
  43. //函數名稱:TestSpeed
  44. //函數功能:測試速度表計算函數
  45. //函數參數:V0      初速度,單位:轉/min
  46. //          Vt      末速度,單位:轉/min
  47. //          S       路程,單位:mm
  48. //          time    加速次數
  49. //函數返回:無
  50. void TestSpeed(int V0, int Vt, int S, int time)
  51. {
  52.     int i;
  53.     Speed_t Speed = (Speed_t)rt_malloc(sizeof(struct SPEED));
  54.     Speed->V0 = STEPSPEED(V0);    //起速
  55.     Speed->Vt = STEPSPEED(Vt);    //末速
  56.     Speed->S = TOTALSTEP(S);      //路程
  57.     Speed->t = 0.2;               //加速時間設為0.2秒
  58.     Speed->time = time;           //加速次數
  59.     Speed->SpeedTab = (int *)rt_malloc(sizeof(int) * (Speed->time + 1)); //根據加速次數申請表格內存,加1,以防用的時候超界
  60.     CalculateSpeedTab(Speed);       //開始計算
  61.     for(i = 0; i < Speed->time; i++)
  62.     {
  63.         rt_kprintf("SpeedTab[%d] = %d, Acceleration = %d\n"
  64.                   , i
  65.                   , *(Speed->SpeedTab + i)
  66.                   , *(Speed->SpeedTab + i + 1) - *(Speed->SpeedTab + i));
  67.     }
  68.     rt_kprintf("SpeedTab[%d] = %d\n", i, *(Speed->SpeedTab + i));
  69.     rt_free(Speed->SpeedTab);              
  70.     rt_free(Speed);                    
  71. }

  72. FINSH_FUNCTION_EXPORT(TestSpeed, Test Speed table calculate);

復制代碼

頭文件:
  1. #ifndef __SPEED_H__
  2. #define __SPEED_H__
  3. #include "rtthread.h"
  4. #include "finsh.h"
  5. /*  三分之一加減速法則:
  6. 加速路程不超過三分之一總路程,
  7. 這樣做的目的是給減速留有足夠的時間去檢測減速點,
  8. 進而實現平穩的將速度減到初速度,
  9. 如果在處理速度夠快的情況下,
  10. 可以選擇二分之一加減速
  11. */
  12. //加減速法則,2分之一法則或3分之一法則
  13. #define SPEEDPRINCIPLE              3
  14. //電機最大轉速,單位轉/min
  15. #define MOTOMAXSPEED                1500   
  16. //電機每轉對應的傳動距離,單位:mm
  17. #define MOTOROUNDLENGTH             36
  18. //電機最大初速度,初速度超過該值會對電機造成傷害,單位轉/min
  19. #define MOTOMAXSTART                200
  20. //驅動器細分數
  21. #define DRIVERSFRACTION             1
  22. //電機細分數
  23. #define MOTOFRACTION                200
  24. //根據初速度,末速度,以及時間,計算加速路程
  25. #define ACCELERATESPACE(V0,Vt,t)    (((V0) + (Vt)) * (t) / 2)
  26. //根據加速路程,初速度,以及時間,計算末速度
  27. #define LASTVELOCITY(S,V0,t)        (2 * (S) / (t) - (V0))
  28. //根據電機轉速(轉/min),計算電機步速度(step/s)
  29. #define STEPSPEED(RV)               ((RV) * MOTOFRACTION * DRIVERSFRACTION / 60)
  30. //根據長度計算電機所需走的步數,S的單位為mm
  31. #define TOTALSTEP(S)                S * MOTOFRACTION * DRIVERSFRACTION / MOTOROUNDLENGTH
  32. struct SPEED
  33. {
  34.     int         V0;                 //初速度,單位:step/s
  35.     int         Vt;                 //末速度,單位:step/s
  36.     long long   S;                  //路程,單位:step
  37.     double      t;                  //加速時間,單位:s
  38.     int         time;               //加速次數    單位:次
  39.     int         *SpeedTab;          //加速速度表,速度單位:step/s
  40.     int         SecSpeedPoint;      //減速點 單位:step(在電機運動過程中,如果剩余路程小于等于該值,那么電機開始減速)
  41. };
  42. typedef struct SPEED * Speed_t;


  43. //各參數范圍值,可以在此設置參數范圍
  44. //初速度大于0小于電機最高起速,末速度大于初速度,小于電機最高轉速
  45. #define IS_SPEED(V0,Vt)     (((V0) >= 0) && ((V0) <= STEPSPEED(MOTOMAXSTART))  \
  46.                             && ((Vt) >= (V0)) && ((Vt) <= STEPSPEED(MOTOMAXSPEED)))                           
  47. #define IS_SPACE(S)         ((S) > 0)
  48. #define IS_ADDTIMING(t)     ((t) > 0)            
  49. #define IS_ADDTIME(time)     ((time) >= 32)        //讓加速次數必須大于等于32,否則計算表格就沒什么意義

  50. #endif
復制代碼


所有資料51hei提供下載:
S型加減速分析.rar (2.64 MB, 下載次數: 1151)



S型加減速.png (121.42 KB, 下載次數: 178)

S型加減速.png

S型加減速和梯形加減速.png (127.74 KB, 下載次數: 180)

S型加減速和梯形加減速.png

加速度曲線圖.png (113.87 KB, 下載次數: 162)

加速度曲線圖.png

實際計算得到的S型曲線圖.png (112.19 KB, 下載次數: 161)

實際計算得到的S型曲線圖.png

評分

參與人數 2黑幣 +13 收起 理由
AnthonyYMH + 5 共享資料的黑幣獎勵!
supermcu8 + 8 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏33 分享淘帖 頂5 踩
回復

使用道具 舉報

沙發
ID:389278 發表于 2018-8-24 11:23 | 只看該作者
正在學這個 真是運氣呀
謝謝
回復

使用道具 舉報

板凳
ID:146544 發表于 2018-9-14 09:35 | 只看該作者
學習了,很受用。請問樓主。rtthread.h在STM32里報錯什么原因?
回復

使用道具 舉報

地板
ID:155719 發表于 2018-11-3 09:14 | 只看該作者
多謝樓主了,收藏 學習,正需要
回復

使用道具 舉報

5#
ID:461071 發表于 2019-1-3 16:11 | 只看該作者
感謝樓主!
回復

使用道具 舉報

6#
ID:463385 發表于 2019-1-6 23:42 | 只看該作者
正需要步進電機的資料,謝謝
回復

使用道具 舉報

7#
ID:463496 發表于 2019-1-7 10:03 | 只看該作者
學習學習
回復

使用道具 舉報

8#
ID:337376 發表于 2019-1-13 21:16 | 只看該作者
很棒,很詳細
回復

使用道具 舉報

9#
ID:126254 發表于 2019-1-17 17:15 | 只看該作者
很受用,哈哈,謝謝樓主
回復

使用道具 舉報

10#
ID:471313 發表于 2019-1-25 08:12 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

11#
ID:384489 發表于 2019-1-31 11:34 | 只看該作者
一直想學習S型算法,無奈原理性的注釋太少了,也是云里霧里的。看到樓主發的這個很欣慰,感謝分享。
回復

使用道具 舉報

12#
ID:311744 發表于 2019-3-2 16:52 | 只看該作者
學習學習
回復

使用道具 舉報

13#
ID:138247 發表于 2019-3-6 11:02 | 只看該作者

謝謝樓主分享。。。
回復

使用道具 舉報

14#
ID:445062 發表于 2019-3-6 13:43 | 只看該作者

感謝樓主!
回復

使用道具 舉報

15#
ID:445062 發表于 2019-3-6 13:44 | 只看該作者
謝謝樓主分享。。。
回復

使用道具 舉報

16#
ID:19303 發表于 2019-3-8 10:38 | 只看該作者
很好,學習中
回復

使用道具 舉報

17#
ID:519239 發表于 2019-4-23 08:37 | 只看該作者
非常感謝樓主的分享,對于新手來說,幫助很大,謝謝
回復

使用道具 舉報

18#
ID:519224 發表于 2019-4-23 09:19 | 只看該作者
希望樓主可以出更多更好的教程
回復

使用道具 舉報

19#
ID:62019 發表于 2019-5-15 22:34 | 只看該作者
好好學習下
回復

使用道具 舉報

20#
ID:540349 發表于 2019-5-16 23:39 | 只看該作者
樓主厲害
回復

使用道具 舉報

21#
ID:561398 發表于 2019-6-12 23:56 | 只看該作者
不錯,不錯。。。
回復

使用道具 舉報

22#
ID:561398 發表于 2019-6-12 23:57 | 只看該作者
學習了,很受用。請問樓主。rtthread.h在STM32里報錯什么原因?
回復

使用道具 舉報

23#
ID:511461 發表于 2019-6-13 10:06 | 只看該作者
很棒,謝謝分享
回復

使用道具 舉報

24#
ID:576733 發表于 2019-7-2 22:02 | 只看該作者
非常好的資料,非常感謝
回復

使用道具 舉報

25#
ID:290893 發表于 2019-7-4 09:54 | 只看該作者
不錯。。。。。。。。。。。。。。。
回復

使用道具 舉報

26#
ID:418638 發表于 2019-7-4 14:31 | 只看該作者
不錯不錯
回復

使用道具 舉報

27#
ID:479761 發表于 2019-7-12 15:22 | 只看該作者
請問這是用什么驅動的
回復

使用道具 舉報

28#
ID:421308 發表于 2019-7-13 16:53 | 只看該作者
很有價值
回復

使用道具 舉報

29#
ID:511073 發表于 2019-7-14 12:48 | 只看該作者
謝謝分享
回復

使用道具 舉報

30#
ID:583912 發表于 2019-7-14 15:14 | 只看該作者

多謝樓主了,收藏 學習,
回復

使用道具 舉報

31#
ID:152548 發表于 2019-7-28 11:39 | 只看該作者
這個不錯,可以使很多人入門。算法還有PIID的,需要用到高等數學了。
回復

使用道具 舉報

32#
ID:554080 發表于 2019-8-23 14:59 | 只看該作者
看起來挺詳細  看看
回復

使用道具 舉報

33#
ID:609995 發表于 2019-9-10 14:38 | 只看該作者
謝謝,正在研究這方面的內容
回復

使用道具 舉報

34#
ID:610293 發表于 2019-9-11 10:01 | 只看該作者
感謝樓主的分享!
回復

使用道具 舉報

35#
ID:409322 發表于 2019-9-18 10:06 | 只看該作者
謝謝大佬分享!
回復

使用道具 舉報

36#
ID:409322 發表于 2019-9-18 10:07 | 只看該作者
謝謝大佬分享,正好能用到,拿來學習一下
回復

使用道具 舉報

37#
ID:477269 發表于 2019-10-17 17:07 | 只看該作者
正好需要呢,太感謝 了
回復

使用道具 舉報

38#
ID:637590 發表于 2019-11-7 17:25 | 只看該作者
寫的真好 你真棒寫的真好 你真棒寫的真好 你真棒
回復

使用道具 舉報

39#
ID:492919 發表于 2019-11-23 15:24 | 只看該作者
學習一下
感謝樓主
回復

使用道具 舉報

40#
ID:648200 發表于 2019-11-24 09:32 | 只看該作者
感謝樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕免费视频 | 日韩91在线 | 亚洲视频免费播放 | 亚洲精品大片 | 特级做a爰片毛片免费看108 | 狠狠爱免费视频 | 九九国产在线观看 | 国产精品久久久久久久久久免费 | 成人毛片在线观看 | 美女黄网站视频免费 | 欧美一区免费 | 99re国产| 欧美精品一区二区三区在线播放 | 亚洲精品一区二区三区蜜桃久 | 欧美午夜一区 | 色网在线观看 | 精品欧美色视频网站在线观看 | 日韩中文字幕在线观看视频 | 一区二区三区在线播放 | 97久久精品午夜一区二区 | 久久国产精品一区二区三区 | 在线国产一区二区 | 日本免费在线 | 狠狠的干| 午夜影视免费片在线观看 | 国产精品爱久久久久久久 | 亚洲 欧美 日韩 在线 | 久久人人网 | 亚洲国产欧美国产综合一区 | 中文在线播放 | 欧美在线激情 | 91视视频在线观看入口直接观看 | 日本黄色短片 | 久久久久国产一区二区三区四区 | 99一级毛片 | 狠狠狠色丁香婷婷综合久久五月 | 中文在线观看视频 | 欧美一二三| 中文字幕第90页 | 国产在线资源 | 日日骚av|