標題: 步進電機加減速算法設計總結 附stm32單片機控制小車加減速源程序 超詳細 [打印本頁]
作者: qixing 時間: 2017-4-11 15:49
標題: 步進電機加減速算法設計總結 附stm32單片機控制小車加減速源程序 超詳細
最近在研究stm32單片機控制小車加減速,寫了一些東西,教程和源程序都有:
步進電機加減速算法設計總結
步進電機已經廣泛地應用于工業自動化行業。目前常用的步進電機驅動器接受兩個光電耦合信號輸入,一個為脈沖,另一個為方向。步進電機驅動器內部不對電機的加減速作任何假設,它根據輸入脈沖的頻率來控制電機的轉速。
在行業應用中,對于執行機構的啟動與停止階段,是有一定要求的。最基本的,要求速度連續,也就是加速度無跳變。因為,加速度與執行機構的出力是成正比的,加速度上的跳變,造就了出力的突變,直接影響就是在機構運行過程中產生沖擊。不但在工作過程中有噪音,更大的危害在于縮短了機構的使用壽命。
因此,有必要針對步進電機開發一套合適的加減速算法,來確保電機的速度曲線連續。
本節推到線性速度實現過程中的幾個基本關系式。
2.1 步進電機運行基本公式
步進電機驅動器接受脈沖信號,轉換為步進電機的轉角,一個脈沖轉過的角度稱為步距角。因此,脈沖的總數決定了一次運動過程中電機的轉角,脈沖的頻率決定了步進電機的速度。圖1表示脈沖出現的時刻,時間t0,t1,t2之間的間隔分別是基礎時鐘的整數倍,分別為c0和c1
1.001.jpg (9.47 KB, 下載次數: 248)
下載附件
2017-4-11 16:50 上傳
如果定時器的時鐘基礎頻率為ft,那么有
1.002.jpg (2.54 KB, 下載次數: 250)
下載附件
2017-4-11 16:50 上傳
如果步進電機的步距角為alpha,那么可以求出瞬時速度為
1.003.jpg (2.62 KB, 下載次數: 251)
下載附件
2017-4-11 16:50 上傳
同時,步進電機轉過的角度為
1.004.jpg (2.02 KB, 下載次數: 245)
下載附件
2017-4-11 16:50 上傳
其中,步距角與步進電機每圈對應的脈沖數有關
1.005.jpg (2.47 KB, 下載次數: 251)
下載附件
2017-4-11 16:50 上傳
Spr就是每圈對應的脈沖數,steps per round
要實現線性速度,需要速度隨著時間均勻變化,根據勻加速計算公式有
1.006.jpg (2.99 KB, 下載次數: 239)
下載附件
2017-4-11 16:50 上傳
合并后得到
1.007.jpg (1.92 KB, 下載次數: 243)
下載附件
2017-4-11 16:50 上傳
從該公式中可以得出一個重要結論,那就是當速度一定的時候,步進電機加速度與所需的步數成反比。如果所示
1.008.jpg (6.69 KB, 下載次數: 264)
下載附件
2017-4-11 16:50 上傳
因此,對于給定的總步數以及加速度,減速度,加速的步數與減速的步數是確定的
1.009.jpg (3.55 KB, 下載次數: 265)
下載附件
2017-4-11 16:50 上傳
2.2 線性加減速切換步數
線性加減速的參數包括,最大速度,加速度,減速度,總步數四個。根據參數間的約束關系,分為兩種情況,一種是可以到達最大速度運行,另外一種沒到達。判定的標準是max_s_lim與accel_lim的大小,max_s_lim是達到最大速度所需的步數,accel_lim是根據給定的加速度與減速度,減速開始所需的步數。
兩者的計算方法如下
1.010.jpg (4.89 KB, 下載次數: 227)
下載附件
2017-4-11 16:50 上傳
1.011.jpg (5.06 KB, 下載次數: 230)
下載附件
2017-4-11 16:50 上傳
2.2.1 可以到達最大速度
1.012.jpg (13.36 KB, 下載次數: 250)
下載附件
2017-4-11 16:50 上傳
那么,減速開始的步數為
1.013.jpg (4.52 KB, 下載次數: 229)
下載附件
2017-4-11 16:50 上傳
2.2.2 不能達到最大速度
減速開始的步數為
1.014.jpg (12.5 KB, 下載次數: 208)
下載附件
2017-4-11 16:50 上傳
1.015.jpg (4.03 KB, 下載次數: 232)
下載附件
2017-4-11 16:50 上傳
根據算法原理分析,可以得知,線性加減速算法的核心在于定期改變脈沖的間隔。因此,需要在定時器溢出的時候改變下次溢出時間。
為了區分不同的速度輪廓,需要對給定的運動參數做判別,這個步驟可以在主函數中進行。如果實際運行的過程中,不改變參數,那么固定后可以獲得更高的效率。此外,采用定點數來替換浮點運算,加快計算過程。使得該算法可以方便移植到更低端的16位乃至8位單片機上。
3.1 電機運行狀態機
為了跟蹤電機速度輪廓的各個狀態,設計了一個狀態機,分別為停止態,加速態,運行態,減速態。各個狀態的切換關系如圖所示
1.016.jpg (21.27 KB, 下載次數: 263)
下載附件
2017-4-11 16:50 上傳
3.2 主要數據結構
3.2.1 速度輪廓數據SPEED_RAMP_DATA
結構體成員的含義如下
run_state,用來指示電機運行狀態
dir 電機運行方向
step_delay 以定時器周期為基數的延時數
decel_start 減速開始對應的步數
decel_val 減速度
min_delay 運行態對應的延時數
accel_count 加速與減速段對應的步數,是個累計值,在加速段從0開始,在減速段以0結束
3.2.2 電機運行標志GLOBAL_FLAGS
running,表示電機是否在運動,一個軸的運動完成以前不允許第二次運動
cmd,表示是否接到了一個運動命令,該變量保留作為上下位機交互調試使用
3.2.3 宏定義
有一些與電機參數有關的宏定義
T1_FREQ 定時器運行頻率
SPR 步進電機每轉對應的脈沖數
ALPHA 步距角
此外,為了簡化計算,以及支持定點運算,定義了一些中間常量,如
A_T_x100
T1_FREQ_148
A_SQ
A_x20000
3.2.4 運動參數MOVE_PARAMS
包含有
int16_t steps;
uint16_t accel;
uint16_t decel;
uint16_t omega;
1. 梯形加減速算法
這個算法最大的優勢在于,不借用任何表格,在每個中斷中計算下一個中斷發生的時刻,因此節約了大量的內存,給資源緊缺的單機,特別是8bit單片機帶來了福音。不過,這個算法在代碼上有幾個缺陷。
1,采用的是PWM輸出引腳。對于步進電機來說,不需要采用PWM,而且一般單片機的PWM腳是硬件綁定的,不靈活。
2,在周期計算函數中,不應該每個中斷都更新定時器的預設值,這樣就無法得到50%的占空比。
3,代碼在波形配置寄存器上少寫了一句關鍵的代碼。
4. 算法采用了定點算術,導致數據都偏大,其中某個預定義的宏,編譯器提示溢出。
5,如果要進一步增大加速度和速度,不進行特殊處理,會造成32位的數據溢出。
6,對于整形運算中的%,使用了編譯器相關的特性,因此會有移植性問題。
諸如此類,不一而足,在向32bit的單片機移植過程中,本工作室對問題都做了修復,確保算法的正確性和適應性。
2. 任意形狀的S形加減速
如果從加速度輪廓上看,梯形加減速的加速度是矩形的,而且在速度切換點,加速度從正一下子變為負,會有明顯的響聲,因此,有必要開發更為平滑的算法。那就是S形加減速。針對S形加減速,具體做法有很多,比較簡單的做法是采用sigmoid函數,一切有S形狀的函數都可以拿來做基礎S函數,比如log函數的變形,sin函數。不過,這些函數在S曲線的計算公式上雖然簡單了,但是由于可調參數太少,導致了無法根據現實情況隨意更改S曲線形式,缺少靈活性。為此,本工作室在理論推導的基礎上推出任意形狀的S形曲線算法。具體來說,首先規劃運動的加速度,然后積分得到速度輪廓,進而轉換為步進電機的頻率輪廓。
3. 擬合電機矩頻特性加減速
該算法充分利用所選的步進電機特性曲線來選擇加減速輪廓,具有最大化電機能力的優點,而且算法占用的空間少,對于特定的步進電機具有帶載能力最大化的優點,在小負載測試中發現,使用梯形加減速算法可以在3s內完成無丟步的運動,換為該算法,可以實現2.2s無丟步加減速。
stm32源程序:
- /*----------------------------------------------------------------------------*/
- //版權信息: 無極電子工作室
- //文件名: s_curve.c
- //當前版本: 1.0
- //單片機型號: MB9BF322L
- //開發環境: IAR EWARM7.4
- //晶振頻率: 4M
- //作者: paul
- //功能: s曲線計算文件
- //修訂記錄:
- //2015-09-28----創建
- /*----------------------------------------------------------------------------*/
- #include "s_curve.h"
- //s曲線加速度各段參數定義
- //起始速度
- const float f0 = 0;
- //加加速度與減減速度,
- float faa = 0;
- float frr = 0;
- //加速段三個時間
- const float taa = 0.1;
- const float tua = 0.2;
- const float tra = 0.1;
- //勻速段
- const float tuu = 5.0;
- //減速段
- const float tar = 0.1;
- const float tur = 0.2;
- const float trr = 0.1;
- unsigned int s_curve_table[TABLE_LEN]={0};
- static int S_curve_func(
- S_curve_params_struct *s_params,
- float t,
- float *freq,
- float *acc
- );
- void S_curve_gen(void)
- {
-
- unsigned int i,tint;
- float ti;
- float freq,freq_pre;
- float acc,acc_pre;
- float fi;
- S_curve_params_struct s_params;
- s_params.f0 = f0;
-
- s_params.taa = taa;
- s_params.tua = tua;
- s_params.tra = tra;
- s_params.tuu = tuu;
- s_params.tar = tar;
- s_params.tur = tur;
- s_params.trr = trr;
- s_params.faa = 2.0/(s_params.taa*(s_params.taa+s_params.tra+2*s_params.tua));
- s_params.frr = 2.0/(s_params.trr*(s_params.tar+s_params.trr+2*s_params.tur));
-
- for(i = 0;i < TABLE_LEN;i++)
- {
- fi = i*(taa+tua+tra+tuu+tar+tur+trr)/TABLE_LEN;
- S_curve_func(&s_params,fi,&freq,&acc);
-
-
- ti = TMAX - (TMAX - TMIN)*freq;
- tint = (unsigned int)ti;
- s_curve_table[i] = tint;
-
- }
-
- }
- static int S_curve_func(
- S_curve_params_struct *s_params,
- float t,
- float *freq,
- float *acc
- )
- {
- float A,B,C,D,E,F;
- float f1,f2,f3,f4,f5;
- float Ta,Tu,Tr;
- float fra,far;
- float f0,faa,frr;
- float taa,tua,tra,tuu,tar,tur,trr;
- faa = s_params->faa;
- frr = s_params->frr;
-
- taa = s_params->taa;
- tua = s_params->tua;
- tra = s_params->tra;
- tuu = s_params->tuu;
- tar = s_params->tar;
- tur = s_params->tur;
- trr = s_params->trr;
-
- f0 = s_params->f0;
- fra = faa*taa/tra;
- far = frr*trr/tar;
-
- Ta = taa + tua + tra;
- Tu = tuu;
- Tr = tar + tur + trr;
- A = f0;
- B = f0 - 0.5*faa*taa*taa;
- C = f0 + 0.5*faa*taa*taa + faa*taa*tua + 0.5*fra*(taa+tua)*(taa+tua) - fra*Ta*(taa+tua);
- f1 = f0 + 0.5*faa*taa*taa;
- f2 = f0 + 0.5*faa*taa*taa + faa*taa*tua;
- f3 = 0.5*fra*Ta*Ta + C;
- D = f3 - 0.5*far*(Ta+Tu)*(Ta+Tu);
- f4 = -far*0.5*(Ta+Tu+tar)*(Ta+Tu+tar) + far*(Ta+Tu)*(Ta+Tu+tar) + D;
- E = f4 + far*tar*(Ta+Tu+tar);
- f5 = -far*tar*(Ta+Tu+Tr-trr) + E;
- F = f5 + frr*(Ta+Tu+Tr)*(Ta+Tu+Tr-trr) - 0.5*frr*(Ta+Tu+Tr-trr)*(Ta+Tu+Tr-trr);
- if((t>=0) && (t<=Ta+Tu+Tr))
- {
- if((t>=0) && (t<=taa))
- {
- *freq = 0.5*faa*t*t + A;
- *acc = faa*t;
- }
- else if((t>=taa) && (t<=taa+tua))
- {
- *freq = faa*taa*t + B;
- *acc = faa*taa;
- }
- else if((t>=taa+tua) && (t<=taa+tua+tra))
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (57.88 KB, 下載次數: 270)
下載附件
2017-4-11 16:52 上傳
資料下載:
s型加減速.rar
(1.97 MB, 下載次數: 859)
2017-4-11 15:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: cm7626 時間: 2017-4-17 16:36
很難得的好資料 下載了
作者: qq2512262471 時間: 2017-4-19 00:20
感謝分享!
作者: crazyboytu 時間: 2017-7-11 10:29
請問樓主,程序里面的參數怎么來的啊?有算法解析嗎?
作者: donydong 時間: 2017-7-31 12:34
非常好,下來學習一下
作者: 維超 時間: 2017-7-31 23:02
非常好的資料。感謝樓主分享
作者: roguebear 時間: 2017-8-17 21:09
這個不就是抄的AN446的嘛
作者: amos235 時間: 2017-8-20 16:44
謝謝謝 好資料,51黑有你更精彩!!!
作者: sddzycnq 時間: 2017-11-24 09:21
感謝分享,但黑幣不夠。汗。
作者: 穿山躍海 時間: 2017-11-28 11:01
AVR446的算法,贊!
作者: wuxishun 時間: 2017-11-29 18:36
下載學習了
作者: a274 時間: 2017-12-25 22:08
很難得的好資料,只能看
作者: 摩卡饃饃123 時間: 2017-12-28 14:03
謝謝分享
作者: 摩卡饃饃123 時間: 2017-12-28 14:23
非常謝謝
作者: 摩卡饃饃123 時間: 2017-12-28 14:23
謝謝!謝謝!謝謝!
作者: zyw20012 時間: 2018-1-2 21:40
樓主,怎么樣才能聯系到你,我的扣扣179687307求聯系
作者: soul85 時間: 2018-1-4 15:10
niu
正好在研究 算法很復雜
作者: ycgxy1650601 時間: 2018-2-6 15:07
謝謝分享
作者: nmvxcsdf 時間: 2018-3-19 17:27
謝謝分享
作者: zhouke 時間: 2018-3-20 07:56
謝謝分享
作者: yun_2106118 時間: 2018-4-10 17:47
多謝樓主好東東
作者: yun_2106118 時間: 2018-4-10 17:48

多謝樓主的資料,值得參考
作者: 圣誕樹枝 時間: 2018-4-17 16:14
很棒的資料,正有需要
作者: deanj123 時間: 2018-4-19 08:37
謝謝分享
作者: Wilson_Chen 時間: 2018-4-22 12:02
不是很明白,頂一下
作者: 煙花綻放 時間: 2018-4-23 11:35
先下載學習一下,謝謝樓主分享
作者: yhummqj 時間: 2018-4-23 14:41
謝謝分享
作者: yanzy_002 時間: 2018-4-23 14:59
正好在使用步進電機梯形算法,換向時沖擊力較大,希望此算法能解決這個問題
作者: jianshijie 時間: 2018-4-24 09:56
謝謝分享,要慢慢看啊,希望能搞懂
作者: zhwtang123 時間: 2018-4-25 17:20
很棒的資料,正有需要
作者: zhwtang123 時間: 2018-4-25 17:21
很棒的資料,正有需要
作者: zhwtang123 時間: 2018-4-25 17:49
正是我所需要的,多謝分享
作者: Eleven_1ing 時間: 2018-4-25 20:36
感謝分享,51黑電子有你更精彩
作者: caibihui163 時間: 2018-4-25 20:50
好資料,點個贊!
作者: wwchang 時間: 2018-4-26 12:33
好東西啊,正需要
作者: tiansa521 時間: 2018-4-26 14:40
學習中,多謝樓主
作者: wwchang 時間: 2018-4-26 19:37
樓主做得很詳細,很到位。正需要呢
作者: 喜歡就Mark 時間: 2018-5-2 14:45
分析得很到位,最近正缺這一理論知識引導~
作者: kh99827765 時間: 2018-5-3 15:49
多謝樓主分享,正在學習這塊。。。
作者: 389056325 時間: 2018-5-7 10:30
多謝樓主分享,正在學習這塊。。。
作者: 年少有點狂 時間: 2018-5-13 12:23
學習學習
作者: 摸兩摸 時間: 2018-5-14 08:53
正好需要,謝謝樓主的分析分享
作者: xiaozhi0725 時間: 2018-5-16 14:43
謝謝樓主的分享
作者: xiaozhi0725 時間: 2018-5-16 14:44
謝謝樓主的分享
作者: _風云無忌_ 時間: 2018-5-23 11:26
點贊!
作者: 12345666ii 時間: 2018-5-24 15:24
高手 謝謝分享!!
作者: xode 時間: 2018-5-24 16:13
很專業,謝謝分享
作者: ffww123 時間: 2018-5-27 22:42
很好,分不夠
作者: jiaogn 時間: 2018-5-28 02:16
分不夠,等攢分哦。
作者: 竹鼠商 時間: 2018-5-28 09:37
感謝分享,下載了以后說不定用得到
作者: qq799225734 時間: 2018-5-30 21:22
謝謝大佬分享,學習學習~~~~~~~~
作者: xode 時間: 2018-6-3 21:58
謝謝分享
作者: tdi110 時間: 2018-6-5 22:44
非常好,下來學習一下
作者: asd18989199010 時間: 2018-6-6 23:24
非常感謝,正需要這東西
作者: YQ_S 時間: 2018-6-19 09:45
有誰正常使用了么?為什么我的并不能使用
作者: wcyingdream 時間: 2018-6-26 17:14
好東西,下載下來學習下
作者: cccccccccccccc 時間: 2018-7-16 15:10
東西是好東西,可惜。大哥一點點注解都沒有,讀起來想扔掉
作者: lingaoxun 時間: 2018-7-26 15:40
很棒的資料,正有需要
作者: 泡泡無敵 時間: 2018-7-27 09:54
非常常用步進電機S曲線算法控制,感謝樓主的無私分享
作者: calvinxxw 時間: 2018-8-2 18:23
難得的好資料。
作者: qjw 時間: 2018-8-6 11:24
感謝分享
作者: zjg0123 時間: 2018-8-8 17:53
感謝樓主,最近正好在研究步進電機控制方面的問題
作者: onono 時間: 2018-8-9 11:34
最近正在學習步進電機調速,還有595級聯。感謝分享~
作者: cjk_623256405 時間: 2018-8-9 13:59
很給力,謝謝樓主!!
作者: yang_2018 時間: 2018-8-23 14:37
感謝分享 學習了
作者: yang_2018 時間: 2018-8-23 15:10
非常感謝
學習了
作者: xode 時間: 2018-8-26 19:37
很好,值得研究研究
作者: 路人停下 時間: 2018-9-6 14:39
多謝樓主分享!!
作者: cooldog123pp 時間: 2018-9-10 14:07
學習了,

作者: 上善若水123456 時間: 2018-9-10 16:19
謝謝樓主分享!
作者: 悲天憫人 時間: 2018-10-12 13:24
感謝分享,下載學習一下
作者: blk26782 時間: 2018-12-4 18:19
樓主厲害,頂頂-----頂
作者: blk26782 時間: 2018-12-4 18:20
膩害。。
作者: ancle520 時間: 2018-12-19 16:11
多謝分享,學習學習
作者: bucker 時間: 2018-12-21 21:51
學習了
作者: 溫寶愉 時間: 2019-6-6 23:03
謝謝樓主的分享!
作者: 溫寶愉 時間: 2019-6-8 11:41
所以這個程序里邊對應的管腳輸出除了有GPIOA.2(控制LED的輸出)?還有哪些管腳的輸出是用來控制步進電機加減速呢,求解答!
作者: 鵬博士PBs 時間: 2019-6-11 08:02
不錯的資源 值得分享
作者: lsf1949 時間: 2019-6-19 12:11
非常好
作者: 鵬博士PBs 時間: 2019-6-19 19:36
漲知識了
作者: q779883414 時間: 2019-7-9 16:11
謝謝分享,看不懂!
作者: 鵬博士PBs 時間: 2019-7-10 09:43
感謝樓主的分享 受益匪淺
作者: slg17 時間: 2019-7-11 20:55
想用一下
作者: xiaozhong1314 時間: 2019-7-14 09:25
學習中,算法很復雜啊
作者: dasdad 時間: 2019-7-14 15:29
贊一個
作者: dasdad 時間: 2019-7-14 15:30
非常好的資料
作者: 流222 時間: 2019-8-16 19:33
很給力
作者: 鵬博士PBs 時間: 2019-8-17 00:52
參數怎么調試啊
作者: wdliming 時間: 2019-9-14 16:33
真的很想看。
作者: calvinxxw 時間: 2019-9-28 10:29
謝謝分享
作者: _少年放肆的夢 時間: 2019-10-24 15:18
nice,資料給力
作者: ashamed 時間: 2019-10-24 20:36
感謝分享
作者: 卡修達 時間: 2020-1-6 11:23
嗯嗯 很不錯的資料
作者: hellowC8051 時間: 2020-1-10 09:00
多謝樓主分享,可以少走彎路
作者: khjkhjhkj 時間: 2021-8-2 15:45
請問axis和step代表什么
作者: lengrudie 時間: 2021-10-29 16:53
是不是運算太多了,這么多浮點運算,感覺不實用
作者: li64331218 時間: 2023-3-20 22:11
頂起,時時刻刻都要回看。才知道哪里可以改進。學習了
作者: STM32Study1 時間: 2023-3-31 10:27
對原作者的文檔理解十分到位,通透,贊一個
作者: huaishang 時間: 2024-7-22 17:08
非常好的資料。感謝樓主分享
作者: huaishang 時間: 2024-8-28 14:38
非常好的資料。感謝樓主分享!
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
激情五月综合
|
中文字幕在线观看一区
|
欧美成人精品在线
|
欧美一级二级三级视频
|
欧美国产视频
|
天天狠狠|
国产精品久久久久不卡
|
亚洲欧美日韩在线
|
国产精品一区在线
|
国产一区不卡在线观看
|
91国内精品久久
|
亚洲精品在线播放
|
韩三级在线观看
|
成人在线视频免费观看
|
亚洲精品日韩综合观看成人91
|
一区二区三区免费
|
午夜大片|
欧美一二三
|
av在线电影网
|
色综合色综合色综合
|
日本免费在线
|
国产电影一区二区
|
国产一区2区
|
性在线|
一级毛片免费视频
|
欧美激情综合
|
不卡一区二区三区四区
|
99re66在线观看精品热
|
亚洲综合在线视频
|
日本涩涩视频
|
欧美亚洲网站
|
亚洲av毛片
|
黄色免费在线观看网站
|
在线观看免费黄色片
|
久久日韩精品一区二区三区
|
欧美成年黄网站色视频
|
在线看亚洲
|
亚洲草草视频
|
男人的天堂在线视频
|
www.日本在线播放
|
中文字字幕在线中文乱码范文
|