STM32——步進電機梯形加速曲線
阿新 • • 發佈:2018-11-21
上星期寫了一篇STM32——使用PWM+DMA實現脈衝傳送精確控制
今天想起來了,就在之前的基礎上寫了步進電機的加速曲線控制,其實也沒多難,如果看過上一篇的小夥伴也許會記得,程式碼中有一個核心陣列send_buf
,今天要說的梯形速度控制其實就是按照梯形加速的方式配置send_buf
send_buf
中填寫的是PWM的ARR
值,我們知道ARR
的值可以決定PWM的頻率
下面這個程式碼是為了驗證效果,在VS裡寫的一個demo
void config_buf(long steps, long Fpwm, int cmd)
這個函式是梯形加速曲線實現的核心,輸入引數steps
、Fpwm
cmd
steps
是想要傳送的脈衝數 Fpwm
是想要傳送的脈衝頻率,是加速過程的最大值,也就是勻速階段的頻率值。 cmd
是一個選擇加速或者不加速的引數,1
為使用加速曲線;0
為不採用加速曲線,則全程勻速。
#include <stdio.h>
#define default_size 10000
#define default_arr 599
#define default_psc 719
#define default_size 10000
#define init_arr 999
#define Fmax 10000
int send_buf[default_size];
void config_buf(long steps, long Fpwm, int cmd)
{
if (steps > 0 && steps <= default_size && Fpwm <= Fmax) /* 判斷引數合法性 */
{
long arr_goal = (long)(100000 / Fpwm) - 1; /* 計算arr目標值 */
long default_a = (long)((init_arr - arr_goal) / (steps / 4)); /* 計算加速度 */
if (cmd == 1) /* 使用加速曲線 */
{
long counter; /* 計數 */
long flag = 0; /* 標記分界點 */
long arr_temp = init_arr;
for (counter = 0; (init_arr - default_a * counter) > arr_goal; ++counter)
{
arr_temp = init_arr - default_a * counter;
send_buf[counter] = arr_temp;
}
if ((init_arr - default_a * counter) <= arr_goal) /* 開始勻速階段 */
{
flag = counter; /* 分界點 */
long m;
for (m = flag; m < steps - flag; ++m)
{
send_buf[m] = arr_goal;
counter = m; /* 計數 */
}
}
long j;
for (j = counter + 1; arr_goal + default_a * (j - (steps - flag) + 1) < init_arr; ++j) /* 開始減速階段 */
{
send_buf[j] = arr_goal + default_a * (j - (steps - flag) + 1);
}
if (arr_goal + default_a * (j - (steps - flag) + 1) >= init_arr)
{
send_buf[j] = arr_goal + default_a * (j - (steps - flag) + 1);
}
}
else if (cmd == 0) /* 全程勻速 */
{
long n;
for (n = 0; n < steps; ++n)
{
send_buf[n] = arr_goal;
}
}
}
}
int main()
{
config_buf(1000, 1000, 1);
for (int a = 0; a<default_size;++a)
{
printf("%d \n", send_buf[a]);
if (send_buf[a] == 0)
break;
}
getchar();
return 0;
}
在VS裡跑的效果就像下面這樣
為了更加直觀地看出資料的特徵,我把資料在Excel裡做了一張圖表,如下。
可以看到縱軸是ARR
的值,橫軸是脈衝數,一共傳送1000個脈衝,第1001個位是0。所以會看到圖表最後有一個巨大的跳變。由於ARR
越大,PWM的頻率就越低,所以圖表上看見的內容就是一個PWM頻率由低到高 -> 保持不變 -> 由高到低的過程。
應用到步進電機上就是一個勻加速 -> 勻速 -> 勻減速的過程