1. 程式人生 > >STM32——步進電機梯形加速曲線

STM32——步進電機梯形加速曲線

上星期寫了一篇STM32——使用PWM+DMA實現脈衝傳送精確控制
今天想起來了,就在之前的基礎上寫了步進電機的加速曲線控制,其實也沒多難,如果看過上一篇的小夥伴也許會記得,程式碼中有一個核心陣列send_buf,今天要說的梯形速度控制其實就是按照梯形加速的方式配置send_buf
send_buf中填寫的是PWM的ARR值,我們知道ARR的值可以決定PWM的頻率
這裡寫圖片描述

下面這個程式碼是為了驗證效果,在VS裡寫的一個demo

void config_buf(long steps, long Fpwm, int cmd)這個函式是梯形加速曲線實現的核心,輸入引數stepsFpwm

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頻率由低到高 -> 保持不變 -> 由高到低的過程。
應用到步進電機上就是一個勻加速 -> 勻速 -> 勻減速的過程

這裡寫圖片描述