步进电机控制原理
實則為步進電機的控制
- 知識點
- 電機轉動
- 控制
- 加減速原理
- 梯形加速度的實現原理
- 精確計算時間間隔
- 脈沖時間間隔表達
- 步距角
- 位置
- 速度
- 加速度
- 控制過程
- 大體的思路
- 問題解決思路
- 實現
- 算法總結:
- 定時器中斷處理
- 總結
只是簡單記錄一下個人認為重要的控制原理。
知識點
電機轉動
通過__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, tmp);不停的設置比較值來實現,這個值決定了管腳下一次翻轉電平的時間。如設置定時器頻率為20M,若此值設置為500,輸出脈沖頻率為20*106/500 / 2 = 20K.為什么要除2,是因為一高一低兩個電平變化才構成一個完整驅動脈沖。
要是步進電機轉動一圈需要4K個脈沖的話,那么這個驅動頻率可以讓電機每秒轉5圈。
控制
這個操作一般都是在定時器中斷中完成的,也就是定時器中斷完成比較值的更新,根據不同加速度狀態,可設置不同的值和狀態。以此完成梯形或s形速度的設置。
加減速原理
加減速,都是由基礎頻率(低于電機啟動頻率)與跳變頻率(在基礎頻率上逐漸提高的頻率)
加減速曲線,一般為梯形,指數或s形曲線,對不同的負載,不同轉速,需要選擇合適的基礎頻率與跳變頻率,才能達到最佳的控制效果。
完成步進電機的加減速時間為300ms以上,過短的時間,對絕大多數步進電機來說,很難實現高速旋轉。
梯形加速度的實現原理
一個非常重要的步驟就是計算電機轉動所需要定時器輸出的脈沖頻率;它的大小決定著電機的轉速。如下圖所示:
加速的過程就是將脈沖的發送間隔時間逐漸變短。減速可直觀理解成加速的逆過程。
精確計算時間間隔
脈沖時間間隔表達
δt=ctt=cft\delta t=ct_t=\frac{c}{f_t}δt=ctt?=ft?c?
ft:表示定時器的頻率,倒數的話,就是定時器的計數周期,也就一個時間,如定時器頻率采用3分頻,那么就是80M/(3+1)=20M
c:以tt為單位的完整的脈沖,所代表的定時器的計數值。如:設定定時器計到500次,才翻轉一下電平,c=500.
步距角
α=2πspr\alpha= \frac{2\pi}{spr}α=spr2π?
spr:步進電機轉一圈的脈沖數,這個其實是常數。確定好細分數之后,這個就定了。
步距角對應的控制含義為:轉1o弧度所需要的脈沖數。步數的確定要看電機,如電機標定一步為1.8o,那么轉一圈所需要步數為360/1.8=200步。200步X控制器細分數=轉一圈所需要脈沖數。
位置
Θ=nα\Theta= n\alphaΘ=nα,也可以由速度來表示:θ(t)=∫τ=0tω(t)dτ=12ω˙t2=nα\theta(t)=\int_{\tau=0}^{t} \omega(t) d \tau=\frac{1}{2} \dot{\omega} t^{2}=n \alphaθ(t)=∫τ=0t?ω(t)dτ=21?ω˙t2=nα
一定時間內,電機所轉過角度,也就是電機的位置
變形后,可以求得到當前位置,電機所需要的時間:tn=2nαω˙t_{n}=\sqrt{\frac{2 \mathrm{n} \alpha}{\dot{\omega}}}tn?=ω˙2nα??,兩邊平方,得到n=ω˙tn22α\mathrm{n}=\frac{\dot{\omega} t_{n}^{2}}{2 \alpha}n=2αω˙tn2??,又因為tn=速度/加速度,將tn代入公式,可得:nω˙=ωn22α\mathrm{n} \dot{\omega}=\frac{\omega_{n}^{2}}{2 \alpha}nω˙=2αωn2??
用運動到n+1個脈沖位置所花時間減去tn,就可以得到第n個脈沖的時間間隔,cn*tt。(cn是定時器比較值,tt為定時器計數間隔)
n:脈沖數:cntt=tn+1?tn=2αω˙(n+1?n)c_{n} t_{t}=t_{n+1}-t_{n}=\sqrt{\frac{2 \alpha}{\dot{\omega}}}(\sqrt{n+1}-\sqrt{n})cn?tt?=tn+1??tn?=ω˙2α??(n+1??n?)
得到我們比較關心的cn值為:cn=1tt2αω˙(n+1?n)c_{n}=\frac{1}{t_{t}} \sqrt{\frac{2 \alpha}{\dot{\omega}}}(\sqrt{n+1}-\sqrt{n})cn?=tt?1?ω˙2α??(n+1??n?),這樣人為指定加速度后,就可以求得第n個脈沖的時間間隔。
第一個脈沖為c0=1tt2αω˙(0+1?0)=1tt2αω˙c_{0}=\frac{1}{t_{t}} \sqrt{\frac{2 \alpha}{\dot{\omega}}}(\sqrt{0+1}-\sqrt{0})=\frac{1}{t_{t}} \sqrt{\frac{2 \alpha}{\dot{\omega}}}c0?=tt?1?ω˙2α??(0+1??0?)=tt?1?ω˙2α??,所以,cn=c0(n+1?n)c_{n}=c_{0}(\sqrt{n+1}-\sqrt{n})cn?=c0?(n+1??n?)
速度
ω=αδt=αftc\omega=\frac{\alpha}{\delta t}=\frac{\alpha f_t}{c}ω=δtα?=cαft??,
也就是每個定時器驅動脈沖,電機所轉過的角度。后面等式是轉化成定時器頻率后對應的式子。c就是設定定時器比較值,可以說速度的改變全靠它。
若速度人為指定的話,那么c就等于步距角*定時器脈沖頻率/速度,這個就是定時器的比較值。
加速度
ω(t)=∫τ=0tω˙dτ=ω˙t\omega(t)=\int_{\tau=0}^{t} \dot{\omega} d \tau=\dot{\omega} tω(t)=∫τ=0t?ω˙dτ=ω˙t
速度是在一定時間內的加速度的積分。終于看到希望的時間了。前面說了一般會在300ms以上完成加速度。
控制過程
大體的思路
啟動電機后,先要不停地減小定時器的定時翻轉值,實現一定的加速度,這個加速度是一個漸進的過程,不能一下加到最大,否則就沒有加減速這一說了。那問題來了,如何確定這個加速過程呢?如何確定加速的停止點?相對應,還有減速度?
問題解決思路
加速的停止點:其實對應的是定時器的最小的時間間隔。也就是最大速度,可以由用戶指定。
加速過程確定:梯形加速由三段組成,如下圖所示:
想要完整確定這三段都是在哪些步上操作,就先要指定一個整個三段周期步數。剩下就是三段時間劃分的問題了,如何才能保持住一個線性的加速度呢?另外這個線的斜率如何確定?
這個斜率,也就是加速度,其實是可以用戶指定的。指定好后,這個加速的時間也就確定了,因為加速到最大速度也是用戶指定的。斜率其實脈沖n對應的時間間隔cn.
同理,減速斜率,也可以人為指定。
那么剩下的就是勻速階段的持續的時間了。
實現
-
指定一個最大速度,那么由速度公式ω=αδt=αftc\omega=\frac{\alpha}{\delta t}=\frac{\alpha f_t}{c}ω=δtα?=cαft??,可得到c,這個就是加速度的結束條件。
-
通過計算第一步c0來設定加速度。由cn=1tt2αω˙(n+1?n)c_{n}=\frac{1}{t_{t}} \sqrt{\frac{2 \alpha}{\dot{\omega}}}(\sqrt{n+1}-\sqrt{n})cn?=tt?1?ω˙2α??(n+1??n?)公式,得到c0=0.676?ft2α?10accel?c_{0}=0.676 * f t \sqrt{\frac{2 \alpha * 10}{\text { accel }}}c0?=0.676?ft?accel?2α?10?? accel:人為指定的加速度,0.676是一個修正參數。
-
計算加速到最大速度所需要的步數
由公式:nω˙=ωn22α\mathrm{n} \dot{\omega}=\frac{\omega_{n}^{2}}{2 \alpha}nω˙=2αωn2??,得到:n=speed?22α?accel??10n=\frac{\text { speed }^{2}}{2 \alpha \cdot \text { accel } \cdot 10}n=2α??accel??10?speed?2?
- 計算理論上多少步之后開始減速,不考慮最大速度的步數限制
由于加速度到最大速度等于開始減速度
如下圖所示:
速度其實是加速度在一定時間內積分,而時間也可以對應到步數上,所以n1ω˙1=n2ω˙2n_{1} \dot{\omega}_{1}=n_{2} \dot{\omega}_{2}n1?ω˙1?=n2?ω˙2?,所以n1對應的就是開始減速度時的步數,兩邊同時加n1w2得到:n1ω˙1+n1ω˙2=n2ω˙2+n1ω˙2n_{1} \dot{\omega}_{1}+n_{1} \dot{\omega}_{2}=n_{2} \dot{\omega}_{2}+n_{1} \dot{\omega}_{2}n1?ω˙1?+n1?ω˙2?=n2?ω˙2?+n1?ω˙2?,化簡得到$n1=\frac{\dot{\omega}{2}(n{1}+n_{2})}{\dot{\omega}{1}+\dot{\omega}{2} } ,因為,因為,因為n_{1}+n_{2}$等于全部的步數,加速度與減速度是人為指定的,所以:n1 = (n1+n2)decel / (accel + decel)。
-
計算減速需要步數,分兩種情況
如下圖所示:
-
如果最大速度步數 < 開始減速時的步數,說明此時,加速到減速時的步數多了,需要受限于最大速度的步數,根據這個公式n1ω˙1=n2ω˙2n{1} \dot{\omega}{1}=n{2} \dot{\omega}{2}n1ω˙1=n2ω˙2可得: decel_aval= - max_s_lim * (accel/decel),負號說明的速度的方向。
-
如果最大速度 >= 開始減速時的步數,也就是說加速度的步數,不足以加速到最大速度,那么此時就受限于開始減速時的步數了。此時的減速步數,直接用總步數減去加速時的步數就可以了。decel_val = -(step - accel_lim);
-
還要考慮特殊情況:當算出來decel_val=0,那么人為給它賦上-1,代表只剩最后一步時,減速。
-
-
計算加速到開始減速的步數
也就是是用全程的步數step + decel -
看一下,第一步c0來設定加速度是否是小于最大速度,若最大速度設置值還不如加速度大,那就沒必要加速了。反之,就從c0加速度開始加速。
算法總結:
可見,算法主要是實現減速開始步數及加速步數的計算。至于三段如何加速減速是放到定時器中斷中來處理的。
定時器中斷處理
主要實現就是加速與減速的過程,需要計算電機每走一步定時器的比較值,根據前面位置里公式cn=c0(n+1?n)c_{n}=c_{0}(\sqrt{n+1}-\sqrt{n})cn?=c0?(n+1??n?),就可以得到這個c值,但過程中開兩次根號太麻煩,同時也不是關于前一個比較值的關系,所以需要 cncn?1=c0(n+1?n)c0(n?n?1)\frac{c_{n}}{c_{n-1}}=\frac{c_{0}(\sqrt{n+1}-\sqrt{n})}{c_{0}(\sqrt{n}-\sqrt{n-1})}cn?1?cn??=c0?(n??n?1?)c0?(n+1??n?)?,再根據數學中泰勒公式特例:麥克勞林公式,(推導起來也比較麻煩,知道結果就可以了)得到最終cn=cn?1?2cn?14n+1c_{n}=c_{n-1}-\frac{2 c_{n-1}}{4 n+1}cn?=cn?1??4n+12cn?1??。根據公式,寫代碼就可以了。
new_step_delay = srd.step_delay - (((2 * srd.step_delay) + rest) / (4 * srd.accel_count + 1)); //計算新(下)一步脈沖周期(時間間隔) rest = ((2 * srd.step_delay) + rest) % (4 * srd.accel_count + 1); // 計算余數,下次計算補上余數,減少誤差加速與減速都是用這個公式,計算結果會包含一個系數和一個余數,為了提高精度,余數要保留并包含到下一次計算當中。
然后,再設置狀態,停止、加速,運行、減速,針對不同狀態,計算定時器的比較值,這樣就可以實現梯形控制了。s形控制也是一樣的原理
總結
比較重要的就是數學公式推導,可見數學在算法中的位置。但數學真不是知道就能用的,需要一個很長很長的過程。還是想到屈原一句話“路漫漫其修遠兮,吾將上下而求索”。別急,慢慢去體會。
總結
- 上一篇: Magics21 安装教程
- 下一篇: cad旋转命令_CAD平面图标高技巧