找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 56246|回復(fù): 102
打印 上一主題 下一主題
收起左側(cè)

步進(jìn)電機(jī)加減速算法設(shè)計總結(jié) 附stm32單片機(jī)控制小車加減速源程序 超詳細(xì)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:188491 發(fā)表于 2017-4-11 15:49 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
最近在研究stm32單片機(jī)控制小車加減速,寫了一些東西,教程和源程序都有:


步進(jìn)電機(jī)加減速算法設(shè)計總結(jié)
  • 需求分析
步進(jìn)電機(jī)已經(jīng)廣泛地應(yīng)用于工業(yè)自動化行業(yè)。目前常用的步進(jìn)電機(jī)驅(qū)動器接受兩個光電耦合信號輸入,一個為脈沖,另一個為方向。步進(jìn)電機(jī)驅(qū)動器內(nèi)部不對電機(jī)的加減速作任何假設(shè),它根據(jù)輸入脈沖的頻率來控制電機(jī)的轉(zhuǎn)速。
在行業(yè)應(yīng)用中,對于執(zhí)行機(jī)構(gòu)的啟動與停止階段,是有一定要求的。最基本的,要求速度連續(xù),也就是加速度無跳變。因為,加速度與執(zhí)行機(jī)構(gòu)的出力是成正比的,加速度上的跳變,造就了出力的突變,直接影響就是在機(jī)構(gòu)運(yùn)行過程中產(chǎn)生沖擊。不但在工作過程中有噪音,更大的危害在于縮短了機(jī)構(gòu)的使用壽命。
因此,有必要針對步進(jìn)電機(jī)開發(fā)一套合適的加減速算法,來確保電機(jī)的速度曲線連續(xù)。
  • 算法原理
本節(jié)推到線性速度實現(xiàn)過程中的幾個基本關(guān)系式。
2.1 步進(jìn)電機(jī)運(yùn)行基本公式
步進(jìn)電機(jī)驅(qū)動器接受脈沖信號,轉(zhuǎn)換為步進(jìn)電機(jī)的轉(zhuǎn)角,一個脈沖轉(zhuǎn)過的角度稱為步距角。因此,脈沖的總數(shù)決定了一次運(yùn)動過程中電機(jī)的轉(zhuǎn)角,脈沖的頻率決定了步進(jìn)電機(jī)的速度。圖1表示脈沖出現(xiàn)的時刻,時間t0,t1,t2之間的間隔分別是基礎(chǔ)時鐘的整數(shù)倍,分別為c0和c1
如果定時器的時鐘基礎(chǔ)頻率為ft,那么有
如果步進(jìn)電機(jī)的步距角為alpha,那么可以求出瞬時速度為
同時,步進(jìn)電機(jī)轉(zhuǎn)過的角度為
其中,步距角與步進(jìn)電機(jī)每圈對應(yīng)的脈沖數(shù)有關(guān)
Spr就是每圈對應(yīng)的脈沖數(shù),steps per round
要實現(xiàn)線性速度,需要速度隨著時間均勻變化,根據(jù)勻加速計算公式有
合并后得到
從該公式中可以得出一個重要結(jié)論,那就是當(dāng)速度一定的時候,步進(jìn)電機(jī)加速度與所需的步數(shù)成反比。如果所示
因此,對于給定的總步數(shù)以及加速度,減速度,加速的步數(shù)與減速的步數(shù)是確定的
2.2 線性加減速切換步數(shù)
線性加減速的參數(shù)包括,最大速度,加速度,減速度,總步數(shù)四個。根據(jù)參數(shù)間的約束關(guān)系,分為兩種情況,一種是可以到達(dá)最大速度運(yùn)行,另外一種沒到達(dá)。判定的標(biāo)準(zhǔn)是max_s_lim與accel_lim的大小,max_s_lim是達(dá)到最大速度所需的步數(shù),accel_lim是根據(jù)給定的加速度與減速度,減速開始所需的步數(shù)。
兩者的計算方法如下
2.2.1 可以到達(dá)最大速度

那么,減速開始的步數(shù)為

2.2.2 不能達(dá)到最大速度
減速開始的步數(shù)為
  • 算法實現(xiàn)
根據(jù)算法原理分析,可以得知,線性加減速算法的核心在于定期改變脈沖的間隔。因此,需要在定時器溢出的時候改變下次溢出時間。
為了區(qū)分不同的速度輪廓,需要對給定的運(yùn)動參數(shù)做判別,這個步驟可以在主函數(shù)中進(jìn)行。如果實際運(yùn)行的過程中,不改變參數(shù),那么固定后可以獲得更高的效率。此外,采用定點數(shù)來替換浮點運(yùn)算,加快計算過程。使得該算法可以方便移植到更低端的16位乃至8位單片機(jī)上。
3.1 電機(jī)運(yùn)行狀態(tài)機(jī)
為了跟蹤電機(jī)速度輪廓的各個狀態(tài),設(shè)計了一個狀態(tài)機(jī),分別為停止態(tài),加速態(tài),運(yùn)行態(tài),減速態(tài)。各個狀態(tài)的切換關(guān)系如圖所示

3.2 主要數(shù)據(jù)結(jié)構(gòu)
3.2.1 速度輪廓數(shù)據(jù)SPEED_RAMP_DATA
結(jié)構(gòu)體成員的含義如下
run_state,用來指示電機(jī)運(yùn)行狀態(tài)
dir 電機(jī)運(yùn)行方向
step_delay 以定時器周期為基數(shù)的延時數(shù)
decel_start 減速開始對應(yīng)的步數(shù)
decel_val 減速度
min_delay 運(yùn)行態(tài)對應(yīng)的延時數(shù)
accel_count 加速與減速段對應(yīng)的步數(shù),是個累計值,在加速段從0開始,在減速段以0結(jié)束

3.2.2 電機(jī)運(yùn)行標(biāo)志GLOBAL_FLAGS
running,表示電機(jī)是否在運(yùn)動,一個軸的運(yùn)動完成以前不允許第二次運(yùn)動
cmd,表示是否接到了一個運(yùn)動命令,該變量保留作為上下位機(jī)交互調(diào)試使用

3.2.3 宏定義
有一些與電機(jī)參數(shù)有關(guān)的宏定義
T1_FREQ 定時器運(yùn)行頻率
SPR 步進(jìn)電機(jī)每轉(zhuǎn)對應(yīng)的脈沖數(shù)
ALPHA 步距角
此外,為了簡化計算,以及支持定點運(yùn)算,定義了一些中間常量,如
A_T_x100
T1_FREQ_148
A_SQ
A_x20000

3.2.4 運(yùn)動參數(shù)MOVE_PARAMS
包含有
              int16_t steps;
              uint16_t accel;
              uint16_t decel;
              uint16_t omega;


1. 梯形加減速算法
這個算法最大的優(yōu)勢在于,不借用任何表格,在每個中斷中計算下一個中斷發(fā)生的時刻,因此節(jié)約了大量的內(nèi)存,給資源緊缺的單機(jī),特別是8bit單片機(jī)帶來了福音。不過,這個算法在代碼上有幾個缺陷。
1,采用的是PWM輸出引腳。對于步進(jìn)電機(jī)來說,不需要采用PWM,而且一般單片機(jī)的PWM腳是硬件綁定的,不靈活。
2,在周期計算函數(shù)中,不應(yīng)該每個中斷都更新定時器的預(yù)設(shè)值,這樣就無法得到50%的占空比。
3,代碼在波形配置寄存器上少寫了一句關(guān)鍵的代碼。
4. 算法采用了定點算術(shù),導(dǎo)致數(shù)據(jù)都偏大,其中某個預(yù)定義的宏,編譯器提示溢出。
5,如果要進(jìn)一步增大加速度和速度,不進(jìn)行特殊處理,會造成32位的數(shù)據(jù)溢出。
6,對于整形運(yùn)算中的%,使用了編譯器相關(guān)的特性,因此會有移植性問題。
諸如此類,不一而足,在向32bit的單片機(jī)移植過程中,本工作室對問題都做了修復(fù),確保算法的正確性和適應(yīng)性。

2. 任意形狀的S形加減速
如果從加速度輪廓上看,梯形加減速的加速度是矩形的,而且在速度切換點,加速度從正一下子變?yōu)樨?fù),會有明顯的響聲,因此,有必要開發(fā)更為平滑的算法。那就是S形加減速。針對S形加減速,具體做法有很多,比較簡單的做法是采用sigmoid函數(shù),一切有S形狀的函數(shù)都可以拿來做基礎(chǔ)S函數(shù),比如log函數(shù)的變形,sin函數(shù)。不過,這些函數(shù)在S曲線的計算公式上雖然簡單了,但是由于可調(diào)參數(shù)太少,導(dǎo)致了無法根據(jù)現(xiàn)實情況隨意更改S曲線形式,缺少靈活性。為此,本工作室在理論推導(dǎo)的基礎(chǔ)上推出任意形狀的S形曲線算法。具體來說,首先規(guī)劃運(yùn)動的加速度,然后積分得到速度輪廓,進(jìn)而轉(zhuǎn)換為步進(jìn)電機(jī)的頻率輪廓。

3. 擬合電機(jī)矩頻特性加減速
該算法充分利用所選的步進(jìn)電機(jī)特性曲線來選擇加減速輪廓,具有最大化電機(jī)能力的優(yōu)點,而且算法占用的空間少,對于特定的步進(jìn)電機(jī)具有帶載能力最大化的優(yōu)點,在小負(fù)載測試中發(fā)現(xiàn),使用梯形加減速算法可以在3s內(nèi)完成無丟步的運(yùn)動,換為該算法,可以實現(xiàn)2.2s無丟步加減速。

stm32源程序:
  1. /*----------------------------------------------------------------------------*/
  2. //版權(quán)信息:    無極電子工作室
  3. //文件名:      s_curve.c
  4. //當(dāng)前版本:    1.0
  5. //單片機(jī)型號:  MB9BF322L
  6. //開發(fā)環(huán)境:    IAR EWARM7.4
  7. //晶振頻率:    4M
  8. //作者:        paul
  9. //功能:        s曲線計算文件
  10. //修訂記錄:   
  11. //2015-09-28----創(chuàng)建
  12. /*----------------------------------------------------------------------------*/



  13. #include "s_curve.h"



  14. //s曲線加速度各段參數(shù)定義
  15. //起始速度
  16. const float f0 = 0;

  17. //加加速度與減減速度,
  18. float faa = 0;
  19. float frr = 0;

  20. //加速段三個時間        
  21. const float taa = 0.1;
  22. const float tua = 0.2;
  23. const float tra = 0.1;

  24. //勻速段        
  25. const float tuu = 5.0;

  26. //減速段        
  27. const float tar = 0.1;
  28. const float tur = 0.2;
  29. const float trr = 0.1;

  30. unsigned int s_curve_table[TABLE_LEN]={0};




  31. static int S_curve_func(
  32.                         S_curve_params_struct *s_params,
  33.                         float t,
  34.                         float *freq,
  35.                         float *acc
  36.                         );









  37. void S_curve_gen(void)
  38. {
  39.                
  40.         unsigned int i,tint;
  41.         float ti;
  42.         float freq,freq_pre;
  43.         float acc,acc_pre;
  44.         float fi;
  45.         S_curve_params_struct s_params;

  46.         s_params.f0 = f0;
  47.         
  48.         s_params.taa = taa;
  49.         s_params.tua = tua;
  50.         s_params.tra = tra;
  51.         s_params.tuu = tuu;
  52.         s_params.tar = tar;
  53.         s_params.tur = tur;
  54.         s_params.trr = trr;


  55.         s_params.faa = 2.0/(s_params.taa*(s_params.taa+s_params.tra+2*s_params.tua));
  56.         s_params.frr = 2.0/(s_params.trr*(s_params.tar+s_params.trr+2*s_params.tur));
  57.         
  58.         for(i = 0;i < TABLE_LEN;i++)
  59.         {
  60.                 fi = i*(taa+tua+tra+tuu+tar+tur+trr)/TABLE_LEN;
  61.                 S_curve_func(&s_params,fi,&freq,&acc);
  62.                
  63.                
  64.                 ti = TMAX - (TMAX - TMIN)*freq;
  65.                 tint = (unsigned int)ti;

  66.                 s_curve_table[i] = tint;
  67.                
  68.         }
  69.         
  70. }

  71. static int S_curve_func(
  72.                         S_curve_params_struct *s_params,
  73.                         float t,
  74.                         float *freq,
  75.                         float *acc
  76.                         )
  77. {
  78.         float A,B,C,D,E,F;
  79.         float f1,f2,f3,f4,f5;
  80.         float Ta,Tu,Tr;
  81.         float fra,far;
  82.         float f0,faa,frr;
  83.         float taa,tua,tra,tuu,tar,tur,trr;

  84.         faa = s_params->faa;
  85.         frr = s_params->frr;
  86.         
  87.         taa = s_params->taa;
  88.         tua = s_params->tua;
  89.         tra = s_params->tra;
  90.         tuu = s_params->tuu;
  91.         tar = s_params->tar;
  92.         tur = s_params->tur;
  93.         trr = s_params->trr;
  94.         
  95.         f0 = s_params->f0;

  96.         fra = faa*taa/tra;
  97.         far = frr*trr/tar;
  98.         
  99.         Ta = taa + tua + tra;
  100.         Tu = tuu;
  101.         Tr = tar + tur + trr;

  102.         A = f0;
  103.         B = f0 - 0.5*faa*taa*taa;
  104.         C = f0 + 0.5*faa*taa*taa + faa*taa*tua + 0.5*fra*(taa+tua)*(taa+tua) - fra*Ta*(taa+tua);

  105.         f1 = f0 + 0.5*faa*taa*taa;
  106.         f2 = f0 + 0.5*faa*taa*taa + faa*taa*tua;
  107.         f3 = 0.5*fra*Ta*Ta + C;

  108.         D = f3 - 0.5*far*(Ta+Tu)*(Ta+Tu);
  109.         f4 = -far*0.5*(Ta+Tu+tar)*(Ta+Tu+tar) + far*(Ta+Tu)*(Ta+Tu+tar) + D;

  110.         E = f4 + far*tar*(Ta+Tu+tar);
  111.         f5 = -far*tar*(Ta+Tu+Tr-trr) + E;

  112.         F = f5 + frr*(Ta+Tu+Tr)*(Ta+Tu+Tr-trr) - 0.5*frr*(Ta+Tu+Tr-trr)*(Ta+Tu+Tr-trr);

  113.         if((t>=0) && (t<=Ta+Tu+Tr))
  114.         {
  115.                 if((t>=0) && (t<=taa))
  116.                 {
  117.                         *freq = 0.5*faa*t*t + A;
  118.                         *acc = faa*t;
  119.                 }
  120.                 else if((t>=taa) && (t<=taa+tua))
  121.                 {
  122.                         *freq = faa*taa*t + B;
  123.                         *acc = faa*taa;
  124.                 }
  125.                 else if((t>=taa+tua) && (t<=taa+tua+tra))
  126.   

  127. …………限于本文篇幅 余下代碼請從51黑下載附件…………

復(fù)制代碼


資料下載:
s型加減速.rar (1.97 MB, 下載次數(shù): 859)


評分

參與人數(shù) 13黑幣 +63 收起 理由
18680365301 + 5
BigWheels + 5 贊一個!
億海拾貝 + 2
鄭元湖 + 5 很給力!
苓苦葑 + 3 共享資料的黑幣獎勵!
wcyingdream + 5 很給力!
KingSealEast + 5 絕世好帖!
kangyanbing + 4
Eleven_1ing + 6 贊一個!
nmvxcsdf + 5 很給力!
RoyTinn + 3 贊一個!
wfliu + 10 贊一個!
jinshan010 + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏48 分享淘帖 頂10 踩
回復(fù)

使用道具 舉報

102#
ID:203661 發(fā)表于 2024-12-23 09:54 | 只看該作者
回復(fù)

使用道具 舉報

101#
ID:104425 發(fā)表于 2024-9-20 11:09 | 只看該作者
學(xué)習(xí)中,感謝分享...
回復(fù)

使用道具 舉報

100#
ID:25103 發(fā)表于 2024-8-28 14:38 | 只看該作者
非常好的資料。感謝樓主分享!
回復(fù)

使用道具 舉報

99#
ID:25103 發(fā)表于 2024-7-22 17:08 | 只看該作者
非常好的資料。感謝樓主分享
回復(fù)

使用道具 舉報

98#
ID:1069199 發(fā)表于 2023-3-31 10:27 | 只看該作者
對原作者的文檔理解十分到位,通透,贊一個
回復(fù)

使用道具 舉報

97#
ID:291668 發(fā)表于 2023-3-20 22:11 | 只看該作者
頂起,時時刻刻都要回看。才知道哪里可以改進(jìn)。學(xué)習(xí)了
回復(fù)

使用道具 舉報

96#
ID:971661 發(fā)表于 2021-10-29 16:53 | 只看該作者
是不是運(yùn)算太多了,這么多浮點運(yùn)算,感覺不實用
回復(fù)

使用道具 舉報

95#
ID:949088 發(fā)表于 2021-8-2 15:45 | 只看該作者
請問axis和step代表什么
回復(fù)

使用道具 舉報

94#
ID:328121 發(fā)表于 2020-1-10 09:00 | 只看該作者
多謝樓主分享,可以少走彎路
回復(fù)

使用道具 舉報

93#
ID:682030 發(fā)表于 2020-1-6 11:23 | 只看該作者
嗯嗯  很不錯的資料
回復(fù)

使用道具 舉報

92#
ID:481152 發(fā)表于 2019-10-24 20:36 | 只看該作者

感謝分享
回復(fù)

使用道具 舉報

91#
ID:194871 發(fā)表于 2019-10-24 15:18 | 只看該作者
nice,資料給力
回復(fù)

使用道具 舉報

90#
ID:123983 發(fā)表于 2019-9-28 10:29 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

89#
ID:20672 發(fā)表于 2019-9-14 16:33 | 只看該作者
真的很想看。
回復(fù)

使用道具 舉報

88#
ID:282095 發(fā)表于 2019-8-17 00:52 | 只看該作者
參數(shù)怎么調(diào)試啊
回復(fù)

使用道具 舉報

87#
ID:593487 發(fā)表于 2019-8-16 19:33 | 只看該作者
很給力
回復(fù)

使用道具 舉報

86#
ID:546593 發(fā)表于 2019-7-14 15:30 | 只看該作者
非常好的資料
回復(fù)

使用道具 舉報

85#
ID:546593 發(fā)表于 2019-7-14 15:29 | 只看該作者
贊一個
回復(fù)

使用道具 舉報

84#
ID:421308 發(fā)表于 2019-7-14 09:25 | 只看該作者
學(xué)習(xí)中,算法很復(fù)雜啊
回復(fù)

使用道具 舉報

83#
ID:574354 發(fā)表于 2019-7-11 20:55 | 只看該作者
想用一下
回復(fù)

使用道具 舉報

82#
ID:282095 發(fā)表于 2019-7-10 09:43 | 只看該作者
感謝樓主的分享 受益匪淺
回復(fù)

使用道具 舉報

81#
ID:27517 發(fā)表于 2019-7-9 16:11 | 只看該作者
謝謝分享,看不懂!
回復(fù)

使用道具 舉報

80#
ID:282095 發(fā)表于 2019-6-19 19:36 | 只看該作者
漲知識了
回復(fù)

使用道具 舉報

79#
ID:340754 發(fā)表于 2019-6-19 12:11 | 只看該作者
非常好
回復(fù)

使用道具 舉報

78#
ID:282095 發(fā)表于 2019-6-11 08:02 | 只看該作者
不錯的資源 值得分享
回復(fù)

使用道具 舉報

77#
ID:556901 發(fā)表于 2019-6-8 11:41 | 只看該作者
所以這個程序里邊對應(yīng)的管腳輸出除了有GPIOA.2(控制LED的輸出)?還有哪些管腳的輸出是用來控制步進(jìn)電機(jī)加減速呢,求解答!
回復(fù)

使用道具 舉報

76#
ID:556901 發(fā)表于 2019-6-6 23:03 | 只看該作者
謝謝樓主的分享!
回復(fù)

使用道具 舉報

75#
ID:439075 發(fā)表于 2018-12-21 21:51 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

74#
ID:449987 發(fā)表于 2018-12-19 16:11 | 只看該作者
多謝分享,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

73#
ID:437359 發(fā)表于 2018-12-4 18:20 | 只看該作者
膩害。!
回復(fù)

使用道具 舉報

72#
ID:437359 發(fā)表于 2018-12-4 18:19 | 只看該作者
樓主厲害,頂頂-----頂
回復(fù)

使用道具 舉報

71#
ID:185639 發(fā)表于 2018-10-12 13:24 | 只看該作者
感謝分享,下載學(xué)習(xí)一下
回復(fù)

使用道具 舉報

70#
ID:392947 發(fā)表于 2018-9-10 16:19 | 只看該作者
謝謝樓主分享!
回復(fù)

使用道具 舉報

69#
ID:155719 發(fā)表于 2018-9-10 14:07 | 只看該作者
學(xué)習(xí)了,
回復(fù)

使用道具 舉報

68#
ID:69086 發(fā)表于 2018-9-6 14:39 | 只看該作者
多謝樓主分享!
回復(fù)

使用道具 舉報

67#
ID:337376 發(fā)表于 2018-8-26 19:37 | 只看該作者
很好,值得研究研究
回復(fù)

使用道具 舉報

66#
ID:389278 發(fā)表于 2018-8-23 15:10 | 只看該作者
非常感謝
學(xué)習(xí)了
回復(fù)

使用道具 舉報

65#
ID:389278 發(fā)表于 2018-8-23 14:37 | 只看該作者
感謝分享 學(xué)習(xí)了
回復(fù)

使用道具 舉報

64#
ID:384585 發(fā)表于 2018-8-9 13:59 | 只看該作者
很給力,謝謝樓主!
回復(fù)

使用道具 舉報

63#
ID:384489 發(fā)表于 2018-8-9 11:34 | 只看該作者
最近正在學(xué)習(xí)步進(jìn)電機(jī)調(diào)速,還有595級聯(lián)。感謝分享~
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表