戰(zhàn):從硬件選型到PID算法調(diào)試全解析)
1. 從零到一一個(gè)嵌入式工程師的循跡小車實(shí)戰(zhàn)復(fù)盤最近在整理過去的項(xiàng)目筆記翻到了幾年前帶實(shí)習(xí)生做的一個(gè)經(jīng)典項(xiàng)目——基于STM32的循跡小車。這個(gè)項(xiàng)目看似簡(jiǎn)單網(wǎng)上開源代碼也一大堆但真正從零開始把硬件選型、電路設(shè)計(jì)、傳感器調(diào)試、控制算法、代碼架構(gòu)都走一遍并且跑得又快又穩(wěn)中間踩的坑和積累的經(jīng)驗(yàn)遠(yuǎn)比想象中要多。它不僅是檢驗(yàn)單片機(jī)基礎(chǔ)功的“試金石”更是理解嵌入式系統(tǒng)軟硬件協(xié)同、實(shí)時(shí)控制邏輯的絕佳實(shí)踐。今天我就以一個(gè)過來人的身份拋開那些千篇一律的教程聊聊如何從工程角度打造一臺(tái)性能可靠的STM32循跡小車分享那些只有親手做過才會(huì)知道的細(xì)節(jié)和門道。這臺(tái)小車的核心任務(wù)很明確通過地面上的黑色引導(dǎo)線自主、平穩(wěn)、快速地行駛。它涉及的核心模塊包括作為大腦的STM32主控、感知路徑的循跡傳感器模塊、執(zhí)行動(dòng)作的電機(jī)驅(qū)動(dòng)、提供動(dòng)力的電源管理以及將它們有機(jī)整合起來的控制邏輯與軟件架構(gòu)。整個(gè)過程是從需求分析到硬件落地再到軟件調(diào)試的完整閉環(huán)。下面我就按照我們實(shí)際開發(fā)的流程拆解每一個(gè)環(huán)節(jié)的關(guān)鍵決策、實(shí)現(xiàn)細(xì)節(jié)和避坑指南。2. 硬件系統(tǒng)的頂層設(shè)計(jì)與關(guān)鍵器件選型硬件是軟件的基石一個(gè)穩(wěn)定可靠的硬件平臺(tái)能省去后期無數(shù)調(diào)試的煩惱。在項(xiàng)目啟動(dòng)時(shí)我們并沒有急于畫原理圖而是先明確了硬件的需求邊界和選型邏輯。2.1 主控芯片為什么是STM32F103C8T6在眾多STM32型號(hào)中我們最終選擇了經(jīng)典的“藍(lán)橋杯”神器——STM32F103C8T6。這個(gè)選擇背后有幾層考慮性能與資源平衡Cortex-M3內(nèi)核72MHz主頻對(duì)于處理幾個(gè)紅外傳感器的數(shù)據(jù)、運(yùn)行PID控制算法、產(chǎn)生PWM波驅(qū)動(dòng)電機(jī)綽綽有余。64KB Flash和20KB RAM也完全滿足程序存儲(chǔ)和運(yùn)行需求甚至還有富余進(jìn)行功能擴(kuò)展如添加藍(lán)牙遙控、OLED顯示等。外設(shè)豐富度它擁有多個(gè)通用定時(shí)器TIM可以輕松生成多路互補(bǔ)PWM用于電機(jī)驅(qū)動(dòng)同時(shí)還有USART、SPI、I2C等通信接口方便后續(xù)擴(kuò)展。ADC功能可以用來讀取電池電壓實(shí)現(xiàn)低壓報(bào)警。生態(tài)與成本這款芯片資料極其豐富社區(qū)支持強(qiáng)大各種庫標(biāo)準(zhǔn)庫、HAL庫成熟降低了開發(fā)門檻。同時(shí)它價(jià)格低廉配套的最小系統(tǒng)板核心板遍地都是非常適合學(xué)習(xí)和原型開發(fā)。封裝與可焊性LQFP48封裝對(duì)于有一定焊接基礎(chǔ)的人來說手工焊接是可行的。如果使用現(xiàn)成核心板則直接跳過了焊接MCU的難題。注意雖然F103系列是入門首選但如果項(xiàng)目對(duì)實(shí)時(shí)性、計(jì)算能力有更高要求比如需要運(yùn)行更復(fù)雜的濾波算法或視覺處理可以考慮性能更強(qiáng)的F4或H7系列。但對(duì)于絕大多數(shù)循跡小車F103是性價(jià)比最高的選擇。2.2 眼睛紅外對(duì)管循跡模塊的深層次剖析循跡模塊是小車的“眼睛”其穩(wěn)定性和精度直接決定性能。市面上常見的是集成式紅外循跡模塊通常有3路、5路、7路甚至更多。我們選擇了5路模塊這是一個(gè)兼顧成本與性能的甜點(diǎn)。模塊工作原理每個(gè)探頭包含一個(gè)紅外發(fā)射管和一個(gè)紅外接收管。發(fā)射管持續(xù)發(fā)射紅外光照射到地面。白色地面反射率高大量紅外光被反射回來被接收管接收模塊輸出低電平黑色引導(dǎo)線吸收紅外光反射極少接收管接收不到足夠信號(hào)模塊輸出高電平。MCU通過讀取這些高低電平數(shù)字量來判斷小車相對(duì)于黑線的位置。選型與布局的學(xué)問探頭數(shù)量3路左、中、右是最低配置但糾偏能力弱容易“畫龍”。5路左2、中、右2提供了更豐富的偏差信息能實(shí)現(xiàn)更平滑的控制。7路及以上精度更高但對(duì)算法和布局要求也更高。探頭間距這是極易被忽略的關(guān)鍵參數(shù)探頭間距需要與黑線寬度匹配。理想情況是當(dāng)小車完美居中時(shí)只有中間探頭壓在黑線上輸出高電平左右兩側(cè)探頭都在白地上輸出低電平。如果探頭間距遠(yuǎn)大于線寬可能出現(xiàn)多個(gè)探頭同時(shí)壓線導(dǎo)致位置信息模糊如果間距太小則容易丟失黑線。通常黑線寬度在2-3厘米探頭間距設(shè)置在1.5-2厘米比較合適。安裝高度模塊離地高度直接影響紅外光的反射強(qiáng)度。太高信號(hào)弱太低容易磕碰。一般通過實(shí)驗(yàn)調(diào)整在2-5厘米范圍內(nèi)找到一個(gè)信號(hào)區(qū)分度最明顯的固定高度。數(shù)字 vs 模擬我們用的是數(shù)字輸出模塊因?yàn)樗褂煤?jiǎn)單直接接GPIO讀取即可。還有一種模擬輸出模塊輸出的是電壓值需要接ADC讀取其優(yōu)點(diǎn)是能感知灰度變化而不僅僅是黑白理論上精度更高但需要額外的AD采樣和軟件處理增加了復(fù)雜度。對(duì)于標(biāo)準(zhǔn)黑白賽道數(shù)字模塊完全夠用。2.3 手腳電機(jī)與驅(qū)動(dòng)電路的可靠保障小車的動(dòng)力來自直流減速電機(jī)而控制它的是電機(jī)驅(qū)動(dòng)芯片。這里我們選擇了經(jīng)典的L298N或TB6612FNG驅(qū)動(dòng)模塊。電機(jī)選型我們選用的是常見的N20微型減速電機(jī)工作電壓3-6V帶有減速箱提供了足夠的扭矩。電機(jī)的轉(zhuǎn)速和扭矩需要平衡轉(zhuǎn)速太快不易控制扭矩太小爬坡無力。通常選擇空載轉(zhuǎn)速在200-300 RPM左右的型號(hào)。驅(qū)動(dòng)芯片對(duì)比L298N雙H橋驅(qū)動(dòng)驅(qū)動(dòng)能力強(qiáng)可接較大電機(jī)但發(fā)熱嚴(yán)重效率較低需要外接散熱片。邏輯電源和驅(qū)動(dòng)電源需分開。TB6612FNGMOSFET橋驅(qū)動(dòng)效率高發(fā)熱小體積小巧內(nèi)置保護(hù)電路邏輯電壓與驅(qū)動(dòng)電壓范圍兼容性好。這是我們更推薦的選擇它的性能全面優(yōu)于L298N。電源隔離一個(gè)重要的經(jīng)驗(yàn)是電機(jī)驅(qū)動(dòng)電路功率部分的電源必須與單片機(jī)、傳感器控制部分的電源進(jìn)行隔離或?yàn)V波。電機(jī)啟停時(shí)會(huì)產(chǎn)生巨大的電流波動(dòng)和反向電動(dòng)勢(shì)這些噪聲會(huì)通過電源線干擾單片機(jī)導(dǎo)致復(fù)位、傳感器誤讀等問題。實(shí)踐中我們使用兩節(jié)18650鋰電池串聯(lián)約7.4V作為總電源然后通過一個(gè)DC-DC降壓模塊如LM2596產(chǎn)生穩(wěn)定的5V或3.3V給控制部分供電。電機(jī)驅(qū)動(dòng)直接接電池的7.4V。這樣實(shí)現(xiàn)了功率地和控制地的“單點(diǎn)共地”有效抑制了干擾。2.4 能源與骨架電源管理與車體結(jié)構(gòu)電源管理如上所述采用電池降壓模塊的方案。務(wù)必在單片機(jī)ADC上接入一個(gè)分壓電路來監(jiān)測(cè)電池電壓當(dāng)電壓低于設(shè)定閾值如6.4V時(shí)讓小車停止或報(bào)警防止電池過放。開關(guān)應(yīng)控制總電源而非僅控制部分。車體結(jié)構(gòu)可以使用亞克力板切割的車架或金屬底盤。安裝時(shí)確保重心盡量低且居中提高穩(wěn)定性。循跡模塊安裝牢固且高度、角度可調(diào)例如通過長(zhǎng)條孔安裝便于調(diào)試。車輪與電機(jī)軸連接緊密避免打滑。我們?cè)蜍囕喆蚧瑢?dǎo)致編碼器計(jì)數(shù)不準(zhǔn)PID調(diào)節(jié)始終震蕩排查了很久才發(fā)現(xiàn)是機(jī)械問題。3. 控制大腦從傳感器數(shù)據(jù)到電機(jī)PWM的軟件邏輯硬件搭建好后軟件就是賦予小車靈魂的關(guān)鍵。軟件架構(gòu)的核心是實(shí)時(shí)、循環(huán)地執(zhí)行“感知-決策-控制”流程。3.1 傳感器數(shù)據(jù)的讀取與處理我們使用5路數(shù)字傳感器對(duì)應(yīng)MCU的5個(gè)GPIO輸入引腳。通常上拉輸入這樣傳感器輸出低電平白線時(shí)讀到0輸出高電平黑線時(shí)讀到1。最簡(jiǎn)單的處理方式是狀態(tài)編碼法。將5個(gè)傳感器的讀數(shù)0或1組合成一個(gè)5位的二進(jìn)制數(shù)。例如定義傳感器從左到右為S1, S2, S3, S4, S5。當(dāng)小車居中時(shí)理想狀態(tài)是00100只有中間S3壓黑線。當(dāng)小車偏右時(shí)可能是00011S4,S5壓線。我們可以為每一種或一類狀態(tài)編碼定義一個(gè)偏差值error。// 示例簡(jiǎn)單的狀態(tài)編碼法 uint8_t sensor_values (S14) | (S23) | (S32) | (S41) | S5; // 組合成5位數(shù)值 int32_t error 0; switch(sensor_values) { case 0b00100: error 0; break; // 居中 case 0b00010: error 1; break; // 輕微右偏 case 0b00001: error 2; break; // 右偏 case 0b00011: error 3; break; // 嚴(yán)重右偏 case 0b01000: error -1; break; // 輕微左偏 case 0b10000: error -2; break; // 左偏 case 0b11000: error -3; break; // 嚴(yán)重左偏 // ... 處理其他可能的狀態(tài)如全白丟線、全黑十字路口等 default: error 0; // 或執(zhí)行尋線策略 }這種方法直觀但狀態(tài)多且對(duì)傳感器一致性要求高。更常用的方法是加權(quán)計(jì)算法將傳感器位置賦予權(quán)重計(jì)算加權(quán)平均值作為偏差。// 假設(shè)傳感器位置坐標(biāo)S1(-2), S2(-1), S3(0), S4(1), S5(2) int32_t positions[] {-2, -1, 0, 1, 2}; int32_t error 0; int32_t sum 0; int32_t count 0; if(S1) { error positions[0]; count; } if(S2) { error positions[1]; count; } if(S3) { error positions[2]; count; } if(S4) { error positions[3]; count; } if(S5) { error positions[4]; count; } if(count ! 0) { error error * 100 / count; // 放大誤差便于PID調(diào)節(jié)也可直接使用error } else { // 所有傳感器都為0全白說明丟線了需要根據(jù)上一次偏差或特殊策略處理 error last_error * 2; // 例如按上次偏差方向加倍糾偏 }加權(quán)法更平滑能提供連續(xù)的偏差信號(hào)是使用PID控制的前提。3.2 控制算法的核心PID調(diào)節(jié)的工程化實(shí)現(xiàn)PID比例-積分-微分控制器是讓小車平穩(wěn)循跡的靈魂。它根據(jù)當(dāng)前的偏差error計(jì)算出一個(gè)控制量output來調(diào)整電機(jī)速度從而減小偏差。P比例與當(dāng)前偏差成正比。P越大糾偏力度越大但過大會(huì)導(dǎo)致小車在直線段左右劇烈震蕩“畫龍”。I積分累積歷史偏差。用于消除靜態(tài)誤差。比如小車長(zhǎng)期受一個(gè)恒定的側(cè)向力如地面不平、輪胎氣壓不均影響P無法完全糾正I可以慢慢積累一個(gè)控制量來抵消它。但I(xiàn)太大會(huì)引起超調(diào)甚至振蕩。D微分與偏差變化率成正比。具有“預(yù)見性”能抑制偏差向變大方向發(fā)展相當(dāng)于阻尼器能讓小車過彎更平穩(wěn)減少超調(diào)。位置式PID的代碼實(shí)現(xiàn)typedef struct { float Kp, Ki, Kd; // PID參數(shù) float integral; // 積分項(xiàng)累計(jì)值 float prev_error; // 上一次的偏差用于計(jì)算微分 float output_max; // 輸出限幅 float output_min; } PID_Controller; float PID_Calculate(PID_Controller *pid, float error, float dt) { // 比例項(xiàng) float proportional pid-Kp * error; // 積分項(xiàng)抗積分飽和處理 pid-integral error * dt; // 限制積分項(xiàng)防止積分飽和導(dǎo)致系統(tǒng)失控 if(pid-integral pid-output_max) pid-integral pid-output_max; if(pid-integral pid-output_min) pid-integral pid-output_min; float integral pid-Ki * pid-integral; // 微分項(xiàng)用誤差的差分近似微分 float derivative pid-Kd * (error - pid-prev_error) / dt; pid-prev_error error; // 更新歷史誤差 // 計(jì)算總輸出并限幅 float output proportional integral derivative; if(output pid-output_max) output pid-output_max; if(output pid-output_min) output pid-output_min; return output; }在循跡小車中的應(yīng)用 我們將計(jì)算得到的error作為PID的輸入。PID的輸出output是一個(gè)修正量。小車的兩個(gè)電機(jī)基礎(chǔ)速度設(shè)為base_speed一個(gè)常數(shù)比如對(duì)應(yīng)PWM占空比50%。然后左輪速度 base_speed output右輪速度 base_speed - output這樣當(dāng)小車偏右error為正時(shí)output為正左輪加速右輪減速小車向左糾偏。PID參數(shù)整定經(jīng)驗(yàn)先P后I再D首先將Ki和Kd設(shè)為0逐漸增大Kp直到小車在直線上開始出現(xiàn)輕微、穩(wěn)定的震蕩。此時(shí)Kp值為臨界值。加入D取臨界Kp的60%-70%作為初始Kp然后逐漸增加Kd。Kd能有效抑制震蕩讓過彎更順滑。注意Kd對(duì)噪聲敏感如果傳感器噪聲大需要謹(jǐn)慎調(diào)節(jié)或?qū)φ`差做濾波。最后加I如果發(fā)現(xiàn)小車在長(zhǎng)直線上存在固定的偏向靜態(tài)誤差再引入一個(gè)很小的Ki。Ki一定要小否則極易造成系統(tǒng)不穩(wěn)定?,F(xiàn)場(chǎng)微調(diào)所有參數(shù)都需要在真實(shí)的賽道上反復(fù)測(cè)試調(diào)整。不同的賽道材質(zhì)、光線條件都可能影響最佳參數(shù)。3.3 程序主循環(huán)與定時(shí)器調(diào)度一個(gè)健壯的程序需要一個(gè)清晰的結(jié)構(gòu)。我們通常采用定時(shí)中斷狀態(tài)機(jī)的架構(gòu)。系統(tǒng)時(shí)鐘初始化配置SysTick或基本定時(shí)器產(chǎn)生一個(gè)穩(wěn)定的時(shí)基例如1ms中斷。傳感器采樣在定時(shí)中斷或主循環(huán)中以固定的頻率如10ms讀取傳感器值并計(jì)算偏差error。頻率太高沒必要太低則響應(yīng)慢。PID計(jì)算同樣以固定周期如10ms調(diào)用PID計(jì)算函數(shù)獲取控制量output。這里的關(guān)鍵是dt時(shí)間間隔要準(zhǔn)確最好使用定時(shí)器的實(shí)際計(jì)時(shí)而不是簡(jiǎn)單循環(huán)。電機(jī)控制更新根據(jù)新的output值更新左右電機(jī)的PWM占空比。PWM頻率通常設(shè)置在1kHz到10kHz之間太低電機(jī)噪音大太高可能超出驅(qū)動(dòng)芯片響應(yīng)能力。異常處理在主循環(huán)中需要處理“丟線”情況所有傳感器為白。策略可以是保持原轉(zhuǎn)角繼續(xù)前進(jìn)一小段或緩慢旋轉(zhuǎn)直到重新檢測(cè)到黑線。還需要處理“十字路口”、“直角彎”等特殊賽道元素這需要更復(fù)雜的邏輯判斷。// 主循環(huán)偽代碼框架 int main(void) { Hardware_Init(); // 初始化GPIO、定時(shí)器(PWM)、ADC、中斷等 PID_Init(pid_ctrl, 10.0, 0.1, 0.5); // 初始化PID參數(shù)需調(diào)試 while(1) { if(sensor_sample_timer_flag) { // 例如10ms到 sensor_sample_timer_flag 0; error Read_Sensors_And_Calculate_Error(); // 可以在這里對(duì)error進(jìn)行一階低通濾波平滑數(shù)據(jù) // filtered_error alpha * filtered_error (1-alpha) * error; } if(pid_calculate_timer_flag) { // 例如10ms到 pid_calculate_timer_flag 0; output PID_Calculate(pid_ctrl, error, 0.01); // dt0.01s Set_Motor_Speed(BASE_SPEED output, BASE_SPEED - output); } // 其他任務(wù)如電池電壓檢測(cè)、調(diào)試信息發(fā)送等 Check_Battery(); if(usart_rx_flag) { Process_Debug_Command(); } } }4. 調(diào)試、優(yōu)化與進(jìn)階思考硬件連接好代碼寫完后真正的挑戰(zhàn)才剛剛開始——調(diào)試。4.1 調(diào)試方法論與實(shí)用工具分模塊調(diào)試傳感器單獨(dú)測(cè)試傳感器模塊用串口打印出每一路的值觀察在不同地面白紙、黑線下的輸出是否穩(wěn)定、準(zhǔn)確。用手在傳感器下移動(dòng)模擬過彎時(shí)傳感器的變化序列。特別注意環(huán)境光干擾強(qiáng)烈的日光燈或太陽光可能包含紅外成分導(dǎo)致傳感器誤觸發(fā)??梢越o傳感器模塊加上遮光罩用熱縮管或黑色電工膠帶包裹。電機(jī)驅(qū)動(dòng)單獨(dú)測(cè)試電機(jī)編寫代碼讓兩個(gè)電機(jī)正轉(zhuǎn)、反轉(zhuǎn)、調(diào)速觀察是否正常力度是否均勻。PID閉環(huán)先將小車架空輪子懸空。通過串口或按鍵手動(dòng)設(shè)置一個(gè)偏差值error觀察兩個(gè)輪子的轉(zhuǎn)速變化是否符合預(yù)期一個(gè)加速一個(gè)減速。利用串口打印這是最強(qiáng)大的調(diào)試工具。實(shí)時(shí)打印出error、output、P/I/D各分量的值、左右輪PWM占空比等。通過圖形化工具如SerialPlot、匿名上位機(jī)繪制曲線可以直觀看到PID的控制效果和震蕩情況極大提升調(diào)參效率。參數(shù)固化與現(xiàn)場(chǎng)調(diào)參將PID參數(shù)存儲(chǔ)在STM32的Flash中并編寫通過串口修改參數(shù)的接口。這樣可以在小車運(yùn)行時(shí)通過電腦串口助手實(shí)時(shí)發(fā)送指令調(diào)整Kp、Ki、Kd立即觀察效果找到最佳參數(shù)。4.2 常見問題與解決方案排查表問題現(xiàn)象可能原因排查步驟與解決方案小車不走直線總是偏向一側(cè)1. 電機(jī)轉(zhuǎn)速不一致個(gè)體差異2. 輪胎打滑或氣壓不均3. 車體結(jié)構(gòu)不對(duì)稱重心偏4. 傳感器安裝不水平一側(cè)離地高1. 架空小車給相同PWM觀察空載轉(zhuǎn)速是否一致。不一致可在軟件中為每個(gè)電機(jī)設(shè)置微調(diào)系數(shù)。2. 檢查輪胎是否安裝緊固嘗試更換輪胎。3. 重新調(diào)整電池等重物的位置。4. 調(diào)整傳感器支架確保所有探頭離地高度相同。過彎時(shí)沖出賽道或反應(yīng)遲鈍1. PID參數(shù)不合適P太小或D太大2. 傳感器采樣或PID計(jì)算周期太長(zhǎng)3. 基礎(chǔ)速度(base_speed)太快1. 重新整定PID參數(shù)適當(dāng)增大Kp或減小Kd。2. 縮短控制周期嘗試從20ms降到10ms或5ms。3. 降低基礎(chǔ)速度彎道性能會(huì)提升。在直線上來回震蕩“畫龍”1. PID參數(shù)不合適P太大或D太小2. 傳感器噪聲大誤差信號(hào)抖動(dòng)3. 機(jī)械結(jié)構(gòu)松動(dòng)1. 減小Kp或適當(dāng)增加Kd以增加阻尼。2. 對(duì)傳感器讀取的error進(jìn)行軟件濾波如移動(dòng)平均、低通濾波。檢查并優(yōu)化硬件加遮光罩、穩(wěn)定供電。3. 緊固所有螺絲特別是電機(jī)和輪子的連接。遇到十字路口停車或亂轉(zhuǎn)丟線處理邏輯不完善完善狀態(tài)判斷。當(dāng)檢測(cè)到可能為十字路口如中間3路同時(shí)壓黑線時(shí)進(jìn)入特殊處理模式例如繼續(xù)直行一段距離或根據(jù)預(yù)設(shè)路徑轉(zhuǎn)彎。單片機(jī)偶爾復(fù)位或傳感器讀數(shù)亂跳電源干擾或電機(jī)干擾1.最重要檢查電源隔離和濾波。確保電機(jī)電源與控制電源分離并在電機(jī)電源兩端并接大電容如1000uF吸收瞬態(tài)電流。2. 在單片機(jī)電源入口增加磁珠和去耦電容。3. 傳感器信號(hào)線使用雙絞線或屏蔽線遠(yuǎn)離電機(jī)電源線。4.3 性能優(yōu)化與進(jìn)階方向當(dāng)基礎(chǔ)循跡功能穩(wěn)定后可以考慮以下優(yōu)化和進(jìn)階動(dòng)態(tài)調(diào)速在直線上用較高速度檢測(cè)到彎道時(shí)error絕對(duì)值大提前減速過彎后再加速。這能大幅提升整體平均速度。使用編碼器為電機(jī)加裝編碼器實(shí)現(xiàn)真正的速度閉環(huán)控制。之前的PID控制的是“期望速度差”但電機(jī)負(fù)載變化時(shí)實(shí)際速度會(huì)變。加入編碼器后可以構(gòu)建兩個(gè)閉環(huán)內(nèi)環(huán)是電機(jī)速度PID環(huán)確保左輪速度右輪速度修正量外環(huán)是循跡偏差PID環(huán)??刂凭群瓦m應(yīng)性會(huì)飛躍。賽道記憶與算法對(duì)于固定賽道可以嘗試讓小車第一次慢速學(xué)習(xí)記錄下關(guān)鍵點(diǎn)如彎道角度、直道長(zhǎng)度和對(duì)應(yīng)的電機(jī)指令第二次運(yùn)行時(shí)根據(jù)記憶高速行駛。傳感器融合除了紅外可以增加陀螺儀IMU。在急彎或復(fù)雜路徑時(shí)結(jié)合角度信息進(jìn)行輔助決策能提高魯棒性。更高級(jí)的控制算法可以嘗試模糊控制它對(duì)于非線性、模型不精確的系統(tǒng)有很好效果而且不需要精確的PID參數(shù)。回過頭看一個(gè)成功的循跡小車項(xiàng)目技術(shù)點(diǎn)覆蓋了單片機(jī)原理、傳感器應(yīng)用、電路設(shè)計(jì)、控制理論、C語言編程和系統(tǒng)調(diào)試。它絕不僅僅是“調(diào)三個(gè)參數(shù)”那么簡(jiǎn)單。每一個(gè)穩(wěn)定的表現(xiàn)背后都是對(duì)硬件噪聲的抑制、對(duì)軟件時(shí)序的把握、對(duì)控制理論的實(shí)踐和對(duì)無數(shù)細(xì)節(jié)的打磨。我個(gè)人的體會(huì)是把小車從“能動(dòng)”調(diào)到“跑得穩(wěn)、跑得快”的過程是嵌入式工程師能力成長(zhǎng)的縮影。下次如果你也準(zhǔn)備做這個(gè)項(xiàng)目不妨多花點(diǎn)時(shí)間在電源設(shè)計(jì)和調(diào)試方法上這往往比糾結(jié)代碼更能解決問題。當(dāng)你的小車能優(yōu)雅地沿著黑線飛馳時(shí)你會(huì)對(duì)“系統(tǒng)”二字有更深的理解。