嵌入式硬件篇---TOF|PID


文章目錄

  • 前言
  • 1. 硬件準備
    • 主控芯片
    • ToF模塊
      • 1.VL53L0X
      • 2.TFmini
    • 執行機構:
      • 電機
      • 舵機
      • 其他
  • 2. 硬件連接
    • (1) VL53L0X(I2C接口)
    • (2) TFmini(串口通信)
  • 3. ToF模塊初始化與數據讀取
    • (1) VL53L0X(基于HAL庫)
    • (2) TFmini(串口接收)
  • 4. PID算法實現
    • (1) PID結構體定義
    • (2) PID計算函數(帶抗積分飽和)
  • 5. 控制執行機構
    • (1) 電機控制(PWM調速)
    • (2) 舵機控制(角度調整)
  • 6. 主循環邏輯
  • 7. 關鍵優化與問題處理
    • (1) ToF數據濾波
    • (2) PID參數整定
      • 階躍響應法
      • 典型參數范圍:
    • (3) 動態目標適應
  • 8. 實際應用注意事項
    • ToF模塊限制
    • 實時性
    • 機械延遲


前言

STM32F103RCT6上使用ToF(Time-of-Flight)模塊(如VL53L0X、VL53L1X或TFmini)結合PID算法實現穩定距離控制,適用于高精度場景(如自動跟隨、避障或工業定位)。以下是簡單實現步驟:


1. 硬件準備

主控芯片

主控芯片:STM32F103RCT6(Cortex-M3,72MHz,足夠處理ToF數據與PID運算)。

ToF模塊

1.VL53L0X

VL53L0X:測距范圍30cm~2m,精度±3mm,I2C接口。

2.TFmini

TFmini:串口通信,測距0.3m~12m,精度1%。

執行機構:

電機

電機(直流電機+編碼器/PWM調速)。

舵機

舵機(用于方向調整,可選)。

其他

其他:電源、電機驅動(如TB6612)、OLED(顯示距離,可選)

2. 硬件連接

(1) VL53L0X(I2C接口)

VL53L0X引腳 STM32引腳 說明
VCC 3.3V 模塊供電
GND GND 共地
SDA PB7 I2C數據線
SCL PB6 I2C時鐘線
XSHUT PA8 復位引腳(可選)

(2) TFmini(串口通信)

TFmini引腳 STM32引腳 說明
VCC 5V 模塊供電
GND GND 共地
TX PA10 接STM32的RX
RX PA9 接STM32的TX

3. ToF模塊初始化與數據讀取

(1) VL53L0X(基于HAL庫)

#include "vl53l0x.h"
VL53L0X_Dev_t dev = {.i2c_handle = &hi2c1}; // I2C初始化略void ToF_Init() {VL53L0X_Error status;status = VL53L0X_Init(&dev);if (status != VL53L0X_ERROR_NONE) {printf("ToF init failed!\n");}VL53L0X_StartMeasurement(&dev);
}float Get_Distance() {VL53L0X_RangingMeasurementData_t data;VL53L0X_GetRangingMeasurementData(&dev, &data);return data.RangeMilliMeter / 10.0f; // 轉換為cm
}

(2) TFmini(串口接收)

uint8_t tfmini_buffer[9];
float Get_Distance() {HAL_UART_Receive(&huart1, tfmini_buffer, 9, 100); // 接收9字節數據幀if (tfmini_buffer[0] == 0x59 && tfmini_buffer[1] == 0x59) { // 幀頭校驗uint16_t distance = tfmini_buffer[2] + (tfmini_buffer[3] << 8);return distance / 100.0f; // 轉換為米}return -1; // 無效數據
}

4. PID算法實現

PID控制器通過調節輸出使當前距離(反饋值)趨近目標距離(設定值)。

(1) PID結構體定義

typedef struct {float Kp, Ki, Kd;    // PID參數float target;        // 目標距離(單位與ToF一致)float error, last_error, integral;float output_max, output_min; // 輸出限幅
} PID_Controller;PID_Controller pid = {.Kp = 0.8, .Ki = 0.05, .Kd = 0.2,.target = 50.0,         // 目標距離50cm.output_max = 100, .output_min = -100
};

(2) PID計算函數(帶抗積分飽和)

float PID_Update(PID_Controller *pid, float current) {pid->error = pid->target - current;// 積分項(抗飽和)pid->integral += pid->error;if (pid->integral > pid->output_max) pid->integral = pid->output_max;else if (pid->integral < pid->output_min) pid->integral = pid->output_min;// 微分項(抑制突變)float derivative = pid->error - pid->last_error;pid->last_error = pid->error;// PID輸出(限幅)float output = pid->Kp * pid->error + pid->Ki * pid->integral + pid->Kd * derivative;if (output > pid->output_max) output = pid->output_max;else if (output < pid->output_min) output = pid->output_min;return output;
}

5. 控制執行機構

(1) 電機控制(PWM調速)

// 初始化PWM(TIM4通道1,PB6)
void PWM_Init() {TIM_OC_InitTypeDef sConfigOC = {0};htim4.Instance = TIM4;htim4.Init.Prescaler = 71;       // 1MHz頻率htim4.Init.Period = 999;         // 1kHz PWMHAL_TIM_PWM_Init(&htim4);sConfigOC.Pulse = 0;             // 初始占空比0sConfigOC.OCMode = TIM_OCMODE_PWM1;HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
}// 設置電機速度和方向
void Set_Motor(float pid_output) {uint16_t pwm = (uint16_t)fabs(pid_output);__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, pwm);// 方向控制(假設PB0為方向引腳)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, pid_output > 0 ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

(2) 舵機控制(角度調整)

// 設置舵機角度(PID輸出映射到0~180°)
void Set_Servo(float pid_output) {uint16_t angle = 90 + (int16_t)pid_output; // 示例:PID輸出±30對應60°~120°uint16_t pwm = 500 + angle * 2000 / 180;   // 0.5ms~2.5ms__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
}

6. 主循環邏輯

int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();    // VL53L0X使用I2C// MX_USART1_UART_Init(); // TFmini使用串口PWM_Init();ToF_Init();float current_dist, pid_output;while (1) {current_dist = Get_Distance();          // 獲取當前距離pid_output = PID_Update(&pid, current_dist);Set_Motor(pid_output);                // 控制電機// Set_Servo(pid_output);             // 或控制舵機HAL_Delay(20); // 控制周期20ms(50Hz)}
}

7. 關鍵優化與問題處理

(1) ToF數據濾波

移動平均濾波:
#define FILTER_SIZE 5
float filter_buffer[FILTER_SIZE];
float Filter_Distance(float new_value) {static uint8_t index = 0;filter_buffer[index++] = new_value;if (index >= FILTER_SIZE) index = 0;float sum = 0;for (uint8_t i = 0; i < FILTER_SIZE; i++) sum += filter_buffer[i];return sum / FILTER_SIZE;
}

(2) PID參數整定

階躍響應法

設Ki=0, Kd=0,逐漸增大Kp直到系統振蕩,然后取50%的值
加入Kd抑制超調,最后加Ki消除穩態誤差。

典型參數范圍:

Kp: 0.5~2.0(比例增益)
Ki: 0.01~0.1(積分時間)
Kd: 0.1~0.5(微分時間)

(3) 動態目標適應

若目標距離變化頻繁,可加入動態參數調整:
if (fabs(pid.error) > 20) pid.Kp = 1.5; // 大誤差時提高響應
else pid.Kp = 0.8;

8. 實際應用注意事項

ToF模塊限制

ToF模塊限制:VL53L0X在強光下性能下降,需避免直射陽光

實時性

實時性:控制周期建議20~50ms,過短可能導致PID震蕩

機械延遲

機械延遲:電機響應滯后時,需增加Kd或降低Ki
通過上述步驟,STM32F103RCT6可精確控制物體與ToF模塊間的距離。實際調試時需結合硬件特性(如電機慣性、ToF精度)優化參數。


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

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

相關文章

PCB設計實踐(十二)PCB設計電容選型:功能、材質、規則

在PCB設計中&#xff0c;電容作為基礎元件承擔著濾波、儲能、去耦、耦合等核心功能。其分類與使用規則直接影響電路穩定性、抗干擾能力和信號完整性。本文從工程實踐角度系統梳理PCB設計中電容的五大分類、選型規范及布局布線規則&#xff0c;幫助設計者構建科學的電容應用體系…

vue2關閉eslint

在項目根目錄下找到 vue.config.js 文件。如果沒有該文件&#xff0c;可以直接在項目根目錄創建一個。 2. 添加 lintOnSave: false 配置 module.exports {lintOnSave: false };

MyBatis 一對多關聯映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis實現一對多關系時&#xff0c;可以通過XML映射文件來配置。下面我將詳細介紹幾種實現方式。 基本概念 一對多關系指的是一個實體對象包含多個子對象集合的情況&#xff0c;例如&#xff1a; 一個部門有多個員工一個訂單有多個訂單項一個博客有多個…

基于Stable Diffusion XL模型進行文本生成圖像的訓練

基于Stable Diffusion XL模型進行文本生成圖像的訓練 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…

基于React的高德地圖api教程001:初始化地圖

文章目錄 1、初始化地圖1.1 創建react項目1.2 可視化地圖1.3 設置衛星地圖1.4 添加開關開啟3D地圖1.5 代碼下載1、初始化地圖 1.1 創建react項目 創建geodeapi項目: npx create-react-app gaodeapi安裝高德地圖包: npm install @amap/amap-jsapi-loader1.2 可視化地圖 在…

uniapp使用npm下載

uniapp的項目在使用HBuilder X創建時是不會有node_modules文件夾的&#xff0c;如下圖所示&#xff1a; 但是uni-app不管基于哪個框架&#xff0c;它內部一定是有node.js的&#xff0c;否則沒有辦法去實現框架層面的一些東西&#xff0c;只是說它略微有點差異。具體差異表現在…

輕量在線工具箱系統源碼 附教程

源碼介紹 輕量在線工具箱系統源碼,直接扔服務器 修改config/config.php文件里面的數據庫 后臺賬號admin 密碼admin123 本工具是AI寫的 所以工具均是第三方接口直接寫的。 需要加工具直接自己找接口寫好扔到goju目錄 后臺自動讀取 效果預覽 源碼獲取 輕量在線工具箱系統源…

圖解gpt之Seq2Seq架構與序列到序列模型

今天深入探討如何構建更強大的序列到序列模型&#xff0c;特別是Seq2Seq架構。序列到序列模型&#xff0c;顧名思義&#xff0c;它的核心任務就是將一個序列映射到另一個序列。這個序列可以是文本&#xff0c;也可以是其他符號序列。最早&#xff0c;人們嘗試用一個單一的RNN來…

mac M2能安裝的虛擬機和linux系統系統

能適配MAC M2芯片的虛擬機下Linux系統的搭建全是深坑&#xff0c;目前網上的資料能搜到的都是錯誤的&#xff0c;自己整理并分享給坑友們~ 網上搜索到的推薦安裝的改造過的centos7也無法進行yum操作&#xff0c;我這邊建議安裝centos8 VMware Fusion下載地址&#xff1a; htt…

「國產嵌入式仿真平臺:高精度虛實融合如何終結Proteus時代?」——從教學實驗到低空經濟,揭秘新一代AI賦能的產業級教學工具

引言&#xff1a;從Proteus到國產平臺的范式革新 在高校嵌入式實驗教學中&#xff0c;仿真工具的選擇直接影響學生的工程能力培養與創新思維發展。長期以來&#xff0c;Proteus作為經典工具占據主導地位&#xff0c;但其設計理念已難以滿足現代復雜系統教學與國產化技術需求。…

【Linux】在Arm服務器源碼編譯onnxruntime-gpu的whl

服務器信息&#xff1a; aarch64架構 ubuntu20.04 nvidia T4卡 編譯onnxruntime-gpu前置條件&#xff1a; 已經安裝合適的cuda已經安裝合適的cudnn已經安裝合適的cmake 源碼編譯onnxruntime-gpu的步驟 1. 下載源碼 git clone --recursive https://github.com/microsoft/o…

前端上傳el-upload、原生input本地文件pdf格式(純前端預覽本地文件不走后端接口)

前端實現本地文件上傳與預覽&#xff08;PDF格式展示&#xff09;不走后端接口 實現步驟 第一步&#xff1a;文件選擇 使用前端原生input上傳本地文件&#xff0c;或者是el-upload組件實現文件選擇功能&#xff0c;核心在于文件渲染處理。&#xff08;input只不過可以自定義樣…

Python 數據分析與可視化:開啟數據洞察之旅(5/10)

一、Python 數據分析與可視化簡介 在當今數字化時代&#xff0c;數據就像一座蘊藏無限價值的寶藏&#xff0c;等待著我們去挖掘和探索。而 Python&#xff0c;作為數據科學領域的明星語言&#xff0c;憑借其豐富的庫和強大的功能&#xff0c;成為了開啟這座寶藏的關鍵鑰匙&…

C語言學習記錄——深入理解指針(4)

OK&#xff0c;這一篇主要是講我學習的3種指針類型。 正文開始&#xff1a; 一.字符指針 所謂字符指針&#xff0c;顧名思義就是指向字符的指針。一般寫作 " char* " 直接來說說它的使用方法吧&#xff1a; &#xff08;1&#xff09;一般使用情況&#xff1a; i…

springboot3+vue3融合項目實戰-大事件文章管理系統獲取用戶詳細信息-ThreadLocal優化

一句話本質 為每個線程創建獨立的變量副本&#xff0c;實現多線程環境下數據的安全隔離&#xff08;線程操作自己的副本&#xff0c;互不影響&#xff09;。 關鍵解讀&#xff1a; 核心機制 ? 同一個 ThreadLocal 對象&#xff08;如示意圖中的紅色區域 tl&#xff09;被多個線…

Nacos源碼—8.Nacos升級gRPC分析六

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 一.處理ClientChangedEvent事件 也就是同步數據到集群節點&#xff1a; public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…

設計雜談-工廠模式

“工廠”模式在各種框架中非常常見&#xff0c;包括 MyBatis&#xff0c;它是一種創建對象的設計模式。使用工廠模式有很多好處&#xff0c;尤其是在復雜的框架中&#xff0c;它可以帶來更好的靈活性、可維護性和可配置性。 讓我們以 MyBatis 為例&#xff0c;來理解工廠模式及…

AI與IoT攜手,精準農業未來已來

AIoT&#xff1a;農業領域的變革先鋒 在科技飛速發展的當下&#xff0c;人工智能&#xff08;AI&#xff09;與物聯網&#xff08;IoT&#xff09;的融合 ——AIoT&#xff0c;正逐漸成為推動各行業變革的關鍵力量&#xff0c;農業領域也不例外。AIoT 技術通過將 AI 的智能分析…

排錯-harbor-db容器異常重啟

排錯-harbor-db容器異常重啟 環境&#xff1a; docker 19.03 , harbor-db(postgresql) goharbor/harbor-db:v2.5.6 現象&#xff1a; harbor-db 容器一直restart&#xff0c;查看日志發現 報錯 initdb: error: directory "/var/lib/postgresql/data/pg13" exists…

Docker容器啟動失敗?無法啟動?

Docker容器無法啟動的疑難雜癥解析與解決方案 一、問題現象 Docker容器無法啟動是開發者在容器化部署中最常見的故障之一。盡管Docker提供了豐富的調試工具&#xff0c;但問題的根源往往隱藏在復雜的配置、環境依賴或資源限制中。本文將從環境變量配置錯誤這一細節問題入手&am…