運動控制--小車的啟動和停止算法

一、現實問題

小車在啟動時由于受到慣性,后輪和前輪速度不一致,會引起車身不穩。

如小車上面裝的是水,會出現傾灑,體驗差。

二、數學研究

啟動時? ? ? ?V(t)=\frac{V_max}{(1+exp(-k*(t-t0)))}

停止時? ? ? V(t)=\frac{V0}{(1+exp(k*(t-t0)))}

急動度(jerk)

三、BLDC控制與S型曲線的融合邏輯??

BLDC電機的速度控制通常采用??雙閉環結構??:外層為速度環(PID控制),內層為電流環(或直接轉矩控制)。S型曲線的核心是為速度環提供??平滑的目標速度參考??,確保電機啟動/停止時加速度漸變,避免轉矩突變(導致機械沖擊或電流過沖)。

??關鍵步驟??:
  1. ??S型曲線生成??:根據目標速度(如用戶設定的車速)、最大允許加速度/急動度,生成連續的速度參考曲線(如前所述的Sigmoid模型)。
  2. ??速度環PID控制??:實時計算當前速度與S型曲線參考速度的誤差,通過PID調節器輸出轉矩參考(或電流參考)。
  3. ??電流環控制??:將轉矩參考轉換為三相電流參考,通過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}
}

六、關鍵注意事項??

  1. ??動態響應匹配??:S型曲線的k參數需與電機的轉動慣量(J)匹配。轉動慣量大時,需減小k以避免加速度突變導致的超調。
    公式:kopt?≈Tsample?4ζ2J??(ζ為阻尼比,Tsample?為控制周期)。

  2. ??電流限制??:S型曲線的最大加速度對應最大轉矩,需確保電機相電流不超過額定值(通過PID限幅實現)。

  3. ??無傳感器優化??:若使用霍爾傳感器或無傳感器算法(如反電動勢觀測器),需在S型曲線啟動階段抑制初始轉矩脈動(可通過調整初始k值實現)。

七、總結??

將S型曲線應用于BLDC控制的核心是??通過速度環生成平滑的參考速度??,并通過PID和電流環確保電機平穩跟隨。實際工程中需結合電機參數(極對數、電感、電阻)和控制周期,調整S型曲線的kV_max等參數,并通過實驗優化PID系數,最終實現舒適、安全的啟動/停止控制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83109.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebFuture:Ubuntu 系統上在線安裝.NET Core 8 的步驟

方法一&#xff1a;使用官方二進制包安裝 下載.NET Core 8 SDK 二進制包&#xff1a;訪問 .NET Core 8 SDK 官方下載頁面&#xff0c;根據你的系統架構選擇對應的 Linux x64 版本等下載鏈接&#xff0c;將其下載到本地4. 創建安裝目錄&#xff1a;在終端中執行以下命令創建用于…

可視化預警系統:如何實現生產風險的實時監控?

在生產環境中&#xff0c;風險無處不在&#xff0c;而傳統的監控方式往往只能事后補救&#xff0c;難以做到提前預警。但如今&#xff0c;可視化預警系統正在改變這一切&#xff01;它能夠實時收集和分析生產數據&#xff0c;通過直觀的圖表和警報&#xff0c;讓管理者第一時間…

深度解析 Linux 內核參數 net.ipv4.tcp_rmem:優化網絡性能的關鍵

文章目錄 引言一、認識 net.ipv4.tcp_rmem1. 最小值&#xff08;min&#xff09;2. 默認值&#xff08;default&#xff09;3. 最大值&#xff08;max&#xff09; 二、net.ipv4.tcp_rmem 的工作原理三、net.ipv4.tcp_rmem 的實際應用場景1. 高并發 Web 服務器2. 文件傳輸服務3…

Windmill:開源開發者基礎設施的革命者

前言 在企業內部,開發者經常需要構建各種內部工具來支持業務運營、數據分析和系統管理。這些工具通常需要前端界面、后端邏輯和工作流編排,開發過程繁瑣且耗時。今天要介紹的Windmill項目,正是為解決這一痛點而生,它讓構建內部工具變得簡單高效,堪稱開發者的得力助手。 …

國產化Excel處理組件Spire.XLS教程:用 Java 獲取所有 Excel 工作表名稱(圖文詳解)

在 Excel 中&#xff0c;工作表名稱通常能夠反映其用途或所含內容&#xff0c;提取這些名稱有助于理清整個工作簿的結構。對于新用戶或協作者來說&#xff0c;僅憑這些名稱就能快速掌握各表中的數據類型。本文將演示如何使用 Java 獲取 Excel 文件中的所有工作表名稱&#xff0…

day49python打卡

知識點回顧&#xff1a; 通道注意力模塊復習空間注意力模塊CBAM的定義 最近臨近畢業&#xff0c;事情有點多。如果有之前的基礎的話&#xff0c;今天的難度相對較低。 后面說完幾種模塊提取特征的組合方式后&#xff0c;會提供整理的開源模塊的文件。 現在大家已近可以去讀這類…

day27-shell編程(自動化)

1. 準備工具 添加到/etc/vimrc autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash,Dockerfile,docker-compose.yml exec ":call SetTitle()"func SetTitle() if expand("%:e") ~ sh\|bash call setline(1,"#!/bin/bash")call setline(2, &quo…

【免殺】C2免殺技術(十五)shellcode混淆uuid/ipv6/mac

針對 shellcode 混淆(Shellcode Obfuscation) 的實戰手段還有很多,如下表所示: 類型舉例目的編碼 / 加密XOR、AES、RC4、Base64、Poly1305、UUID、IP/MAC改變字節特征,避開靜態簽名或 YARA結構偽裝PE Stub、GIF/PNG 嵌入、RTF OLE、UUID、IP/MAC看起來像合法文件/數據,弱…

Vite中定義@軟鏈接

在webpack中可以直接通過符號表示src路徑&#xff0c;但是vite中默認不可以。 如何實現&#xff1a; vite中提供了resolve.alias&#xff1a;通過別名在指向一個具體的路徑 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…

記錄一次opengl顯示不出物體的錯誤原因

是這樣的&#xff0c;我打算學PBR中的IBL章節&#xff0c;即基于圖像的渲染&#xff0c;它的觀點是創建一個大的外景圖片&#xff0c;可以根據圖像中的信息來將環境中的漫反射光和鏡面反射光打在物體上。 但是我在我的程序中創建了一個立方體作為天空盒&#xff0c;我是有兩套…

國產錄播一體機:科技賦能智慧教育信息化

在數字化時代&#xff0c;教育正經歷著前所未有的變革。國產工控機作為信息化教育的核心載體&#xff0c;正在重新定義學習方式&#xff0c;賦能教師與學生&#xff0c;打造高效、互動、智能的教學環境&#xff0c;讓我們一起感受科技與教育的深度融合&#xff01;高能計算機推…

Android Native 之 lmkd進程和kernel kswapd的關聯

lwkd進程屬于native層啟動的一個守護進程&#xff0c;他的作用貫穿android世界的始終。他的另外一個大家都屬于的名字lowmemorykiller。 根據readme的介紹lmkd是用來對android系統內存檢查的守護進程&#xff0c;它通過終止不重要的進程來達到系統穩定運行的狀態。在Linux Kern…

【生活】程序員防猝si指南

note 一、定期體檢二、均衡飲食&#xff0c;多食用對心臟有保護作用的食物三、每周運動四、減壓五、保證睡眠六、戒煙限酒7、控制血壓8、警惕流感攻擊心臟9、關注牙齒健康10、不要抵觸吃藥 文章目錄 note一、定期體檢二、均衡飲食&#xff0c;多食用對心臟有保護作用的食物三、…

245. 2019年藍橋杯國賽 - 數正方形(困難)- 遞推

245. 數正方形&#xff08;困難&#xff09; 2019年藍橋杯國賽 - 數正方形&#xff08;困難&#xff09; 標簽&#xff1a;2019 國賽 遞推 題目描述 在一個 N N N N N N 的點陣上&#xff0c;取其中 4 個點恰好組成一個正方形的 4 個頂點&#xff0c;一共有多少種不同的取…

代碼隨想錄刷題day30

1、零錢兌換II 給你一個整數數組 coins 表示不同面額的硬幣&#xff0c;另給一個整數 amount 表示總金額。 請你計算并返回可以湊成總金額的硬幣組合數。如果任何硬幣組合都無法湊出總金額&#xff0c;返回 0 。 假設每一種面額的硬幣有無限個。 題目數據保證結果符合 32 位帶…

SpringBoot EhCache 緩存

一、EhCache核心原理 層級存儲 堆內緩存&#xff08;Heap&#xff09;&#xff1a;高速訪問&#xff0c;受JVM內存限制堆外緩存&#xff08;Off-Heap&#xff09;&#xff1a;突破JVM堆大小限制&#xff08;直接內存&#xff09;磁盤存儲&#xff08;Disk&#xff09;&#xff…

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的選項之一, 并非唯一 1 先厘清概念 點說明authenticationMethodURLAuthenticationChallenge.protectionS…

盤古信息PCB行業解決方案:以全域場景重構,激活智造新未來

一、破局&#xff1a;PCB行業的時代之問 在數字經濟蓬勃發展的浪潮中&#xff0c;PCB&#xff08;印制電路板&#xff09;作為 “電子產品之母”&#xff0c;其重要性愈發凸顯。隨著 5G、人工智能等新興技術的加速滲透&#xff0c;PCB行業面臨著前所未有的挑戰與機遇。產品迭代…

數據通信與計算機網絡——數據與信號

主要內容 模擬與數字 周期模擬信號 數字信號 傳輸減損 數據速率限制 性能 注&#xff1a;數據必須被轉換成電磁信號才能進行傳輸。 一、模擬與數字 數據以及表示數據的信號可以使用模擬或者數字的形式。數據可以是模擬的也可以是數字的&#xff0c;模擬數據是連續的采用…

循環語句之while

While語句包括一個循環條件和一段代碼塊&#xff0c;只要條件為真&#xff0c;就不斷 循環執行代碼塊。 1 2 3 while (條件) { 語句 ; } var i 0; while (i < 100) {console.log(i 當前為&#xff1a; i); i i 1; } 下面的例子是一個無限循環&#xff0c;因…