步進電機的轉速由由輸出給驅動器的PWM頻率而定,使用MCU的一個定時器(TIM2_CH1)輸出占空比 D=50% 的脈沖。
定時器的時鐘頻率為72MHz,分頻后8Mhz,于是輸出PWM的最低頻率大約為120Hz。
假定需要在時間 t 內運行 θ 角度,根據驅動器的細分數,齒輪傳動比等可以算出所需要的脈沖數 pls_cnt。
1.雙曲線加速
剛開始的想法是,前半程加速,后半程減速,加減速時間間隔為 delta_t,由另一定時器的中斷周期而定,在定時器ISR里面對頻率進行調整,便能讓電機平滑地起停。
但是我并不能直接改變輸出PWM的頻率 freq,能直接改變的只是定時器的自動重載值 period,freq 和 period 之間顯然是雙曲線的關系:
其中 tim_freq = 8MHz,
讓 period 線性化,結果導致 freq 呈雙曲線變化,加速過程很慢,減速很快,實驗現象也是如此,而且這個過程的時間也不好控制。
2.線性加速曲線
要讓 freq 線性化,首先確定 freq 的范圍,freq_min 我設定為300Hz,freq_max 因該就是這段行程平均速度的2倍了:
在 [freq_min, freq_max] 內將 freq 線性化:
freq = linspace(freq_min, freq_max, t/delta_t);
然后算出 period:
period = tim_freq 。/ freq;
減速過程的可以將數組其反過來:
1period = [period, fliplr(period)];
可以得到如下的頻率曲線:
實驗中電機的加減速還算比較平滑,精度也還可以。
3.S形加速曲線
既然可以用線性加速曲線,那應該可以用更為平滑的加速曲線,在印象中S形曲線是非常平滑的,會得到速度連續,加速度也連續的調速過程。于是用S形曲線再試試。
Sigmoid函數的原型我想是這樣子的:
繪出其在[-5, 5]上的圖形:
這里選擇[-5, 5]這段曲線比較合適,加速過程可能有點長,如有要求可以選擇[-4, 4]。
然后將其變成我想要的樣子:
起始點增益,也就是最低頻率:freq_min;
最大增益,也就是最高頻率:freq_max;
橫軸范圍:0~t;
對橫坐標做平移變換,然后伸縮變換,再對縱坐標做伸縮變換便得到下式:
由于在0~t時間段內,指數項不可能為∞,所以起始頻率要略高于 freq_min,指數項也不可能為0,所以最高頻率要略低于 freq_max。
變換后得到的圖像可能是這樣:
其中 t:0~4s,freq_min = 300Hz, freq_max = 1kHz。
上式中 freq_min 可以自己先給定,這樣還有一個參數 freq_max,需要確定。
在 0~t 時間段內運動 θ 角度,那么:
這樣S形曲線便確定了,然后再算出 period 數組即可。減速過程同樣的可以將數組反過來,例如:
實驗中S形曲線自然是最為平滑的,精度不算太好,如有可能的話,可用編碼器進行修正。
-
微控制器
+關注
關注
48文章
7576瀏覽量
151721 -
步進電機
+關注
關注
151文章
3115瀏覽量
147645 -
定時器
+關注
關注
23文章
3254瀏覽量
115067
發布評論請先 登錄
相關推薦
評論