一、現實問題
小車在啟動時由于受到慣性,后輪和前輪速度不一致,會引起車身不穩。
如小車上面裝的是水,會出現傾灑,體驗差。
二、數學研究
啟動時? ? ? ?
停止時? ? ?
急動度(jerk)
三、BLDC控制與S型曲線的融合邏輯??
BLDC電機的速度控制通常采用??雙閉環結構??:外層為速度環(PID控制),內層為電流環(或直接轉矩控制)。S型曲線的核心是為速度環提供??平滑的目標速度參考??,確保電機啟動/停止時加速度漸變,避免轉矩突變(導致機械沖擊或電流過沖)。
??關鍵步驟??:
- ??S型曲線生成??:根據目標速度(如用戶設定的車速)、最大允許加速度/急動度,生成連續的速度參考曲線(如前所述的Sigmoid模型)。
- ??速度環PID控制??:實時計算當前速度與S型曲線參考速度的誤差,通過PID調節器輸出轉矩參考(或電流參考)。
- ??電流環控制??:將轉矩參考轉換為三相電流參考,通過PWM調制驅動電機,確保電流平滑跟隨,避免轉矩脈動。
四、BLDC系統的S型曲線控制架構??
典型的BLDC控制系統(結合S型曲線)架構如下:
輸入:
目標速度(用戶設定)→ S型曲線生成器 → 速度參考v_ref(t)↑當前速度v_measured(編碼器/Hall傳感器反饋)→ 速度環PID → 轉矩參考T_ref↑電流環控制器(FOC/PWM)→ 三相PWM驅動 → BLDC電機
五、代碼實現(基于STM32的BLDC S型曲線控制)??
以下代碼基于STM32F4系列微控制器(支持硬件浮點運算),實現S型曲線生成、速度環PID控制及BLDC換相邏輯。代碼包含關鍵模塊的偽代碼和實際寄存器操作。
??1. 系統參數定義??
#include "stm32f4xx_hal.h"
#include <math.h>// BLDC電機參數
#define POLE_PAIRS 4 // 極對數(影響轉速計算)
#define ROTOR_RES 0.5f // 轉子電阻(Ohm)
#define L 0.001f // 電感(H)
#define MAX_TORQUE 2.5f // 最大轉矩(Nm)
#define MAX_CURRENT 10.0f // 最大相電流(A)// S型曲線參數
#define V_MAX 10.0f // 目標最大速度(m/s)
#define K_S 0.3f // S型曲線陡峭系數
#define TOTAL_TIME 10.0f // 總加速時間(s)
#define T0 (TOTAL_TIME/2.0f) // S型曲線中心點時間// 控制周期(PWM頻率10kHz → 周期100μs)
#define CONTROL_PERIOD 0.0001f // 秒// 全局變量
float current_time = 0.0f; // 當前時間(s)
float ref_speed = 0.0f; // S型曲線參考速度(m/s)
float measured_speed = 0.0f; // 編碼器測量速度(m/s)
float pid_output = 0.0f; // PID輸出轉矩參考(Nm)
??2. S型曲線參考速度生成??
在每個控制周期更新參考速度,確保平滑過渡。
// S型曲線速度計算函數(與Python/C版本邏輯一致)
float sigmoid_ref_speed(float t) {return V_MAX / (1.0f + expf(-K_S * (t - T0)));
}// 每個控制周期調用(更新參考速度)
void update_ref_speed(void) {current_time += CONTROL_PERIOD; // 累加控制周期時間if (current_time > TOTAL_TIME) {current_time = TOTAL_TIME; // 限制最大時間(避免超調)}ref_speed = sigmoid_ref_speed(current_time); // 計算S型曲線速度
}
??3. 速度環PID控制器??
通過PID調節將當前速度誤差轉換為轉矩參考,需考慮電機動力學特性(如轉動慣量)。
// PID參數(需現場調試)
#define KP 2.5f // 比例系數
#define KI 0.1f // 積分系數
#define KD 0.5f // 微分系數float pid_error = 0.0f; // 速度誤差
float pid_integral = 0.0f; // 積分項
float prev_pid_error = 0.0f; // 上一周期誤差// 速度環PID計算
void speed_pid_controller(void) {pid_error = ref_speed - measured_speed; // 計算誤差// 積分項(抗飽和)pid_integral += pid_error * CONTROL_PERIOD;if (pid_integral > 10.0f) pid_integral = 10.0f; // 積分限幅if (pid_integral < -10.0f) pid_integral = -10.0f;// 微分項(誤差變化率)float error_deriv = (pid_error - prev_pid_error) / CONTROL_PERIOD;prev_pid_error = pid_error;// PID輸出(轉矩參考)pid_output = KP * pid_error + KI * pid_integral + KD * error_deriv;// 轉矩限幅(避免過流)if (pid_output > MAX_TORQUE) pid_output = MAX_TORQUE;if (pid_output < -MAX_TORQUE) pid_output = -MAX_TORQUE;
}
??4. FOC電流控制(將轉矩轉換為PWM)??
FOC(磁場定向控制)通過坐標變換將三相電流轉換為d-q軸電流,直接控制轉矩和磁鏈。此處簡化為電流環輸出PWM占空比。
// 簡化的FOC電流控制(示例)
void foc_current_control(float torque_ref) {// 1. 轉矩與d-q軸電流的關系(簡化模型)float i_q_ref = torque_ref / (POLE_PAIRS * L * 0.1f); // 近似計算q軸電流// 2. 電流環PI控制(假設已采樣三相電流并轉換為i_d, i_q)float i_q_error = i_q_ref - current_i_q; // 實際i_q與參考的誤差float v_q = Kp_current * i_q_error + Ki_current * integral_i_q; // q軸電壓// 3. 逆Park變換(d-q → α-β)float v_alpha = v_d * cos_theta - v_q * sin_theta;float v_beta = v_d * sin_theta + v_q * cos_theta;// 4. 空間矢量PWM(SVPWM)生成svpwm_generate(v_alpha, v_beta); // 硬件實現SVPWM調制
}
??5. BLDC換相邏輯(六步換相模式)??
對于低成本BLDC電機,也可采用六步換相控制(無需霍爾傳感器時需反電動勢檢測)。S型曲線的加速度變化需匹配換相頻率,避免轉矩脈動。
// 六步換相狀態機(示例)
typedef enum {STEP_1, STEP_2, STEP_3, STEP_4, STEP_5, STEP_6
} commutation_step_t;commutation_step_t current_step = STEP_1;
uint8_t hall_sensor = 0; // 霍爾傳感器輸入(3位)// 根據霍爾信號更新換相狀態
void update_commutation(void) {hall_sensor = HAL_GPIO_ReadPin(HALL_PORT, HALL_PINS); // 讀取霍爾信號switch (hall_sensor) {case 0b001: current_step = STEP_1; break;case 0b011: current_step = STEP_2; break;case 0b010: current_step = STEP_3; break;case 0b110: current_step = STEP_4; break;case 0b100: current_step = STEP_5; break;case 0b101: current_step = STEP_6; break;default: current_step = STEP_1;}// 根據當前步設置三相PWM導通(示例:高電平有效)switch (current_step) {case STEP_1: HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2); break; // 相A導通case STEP_2: HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3); break; // 相B導通// ... 其他步驟類似}
}
??6. 主控制循環??
int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM1_Init(); // PWM定時器(驅動BLDC)MX_ADC_Init(); // 電流/速度采樣ADCwhile (1) {// 1. 采樣傳感器數據(霍爾/編碼器/電流)measured_speed = read_encoder_speed(); // 編碼器測速(rpm→m/s)measured_current = read_phase_current();// ADC采樣相電流// 2. 更新S型曲線參考速度update_ref_speed();// 3. 速度環PID控制speed_pid_controller();// 4. FOC電流控制(或六步換相)#ifdef USE_FOCfoc_current_control(pid_output);#elseupdate_commutation(); // 六步換相模式#endif// 5. 周期延時(匹配控制周期)HAL_Delay(CONTROL_PERIOD * 1000); // 轉換為ms}
}
六、關鍵注意事項??
-
??動態響應匹配??:S型曲線的
k
參數需與電機的轉動慣量(J)匹配。轉動慣量大時,需減小k
以避免加速度突變導致的超調。
公式:kopt?≈Tsample?4ζ2J??(ζ為阻尼比,Tsample?為控制周期)。 -
??電流限制??:S型曲線的最大加速度對應最大轉矩,需確保電機相電流不超過額定值(通過PID限幅實現)。
-
??無傳感器優化??:若使用霍爾傳感器或無傳感器算法(如反電動勢觀測器),需在S型曲線啟動階段抑制初始轉矩脈動(可通過調整初始
k
值實現)。
七、總結??
將S型曲線應用于BLDC控制的核心是??通過速度環生成平滑的參考速度??,并通過PID和電流環確保電機平穩跟隨。實際工程中需結合電機參數(極對數、電感、電阻)和控制周期,調整S型曲線的k
、V_max
等參數,并通過實驗優化PID系數,最終實現舒適、安全的啟動/停止控制。