戰(zhàn):從PID控制到姿態(tài)解算的嵌入式系統(tǒng)設(shè)計(jì))
1. 項(xiàng)目概述與核心思路做一臺(tái)能自己站起來的平衡小車大概是每個(gè)玩單片機(jī)的朋友都繞不開的一個(gè)“執(zhí)念”。我第一次看到別人做的平衡小車視頻時(shí)那種顛覆物理直覺的穩(wěn)定感讓我立刻決定自己也要搞一臺(tái)。但真動(dòng)手了才發(fā)現(xiàn)從“知道原理”到“能讓它穩(wěn)穩(wěn)立住”中間隔著無數(shù)個(gè)需要親手調(diào)試的坑。這個(gè)項(xiàng)目我們聚焦最核心、也最磨人的部分——平衡控制。它不涉及復(fù)雜的循跡或遙控目標(biāo)純粹而直接讓一個(gè)兩輪結(jié)構(gòu)在沒有任何外部支撐的情況下自主保持直立。這本質(zhì)上是一個(gè)典型的倒立擺控制問題。你可以把它想象成用手掌豎直托起一根長桿桿子往前倒你的手就得往前追桿子往后倒你的手就得往后撤。我們的STM32單片機(jī)就是那個(gè)“大腦”它通過讀取車體傾角是往前倒還是往后倒和傾角變化的速度倒得快還是慢然后快速計(jì)算出兩個(gè)電機(jī)應(yīng)該轉(zhuǎn)多快、往哪個(gè)方向轉(zhuǎn)來模擬手掌的追桿動(dòng)作從而維持車體的動(dòng)態(tài)平衡。整個(gè)系統(tǒng)的核心閉環(huán)是這樣的傳感器感知姿態(tài) - 單片機(jī)處理數(shù)據(jù)并計(jì)算控制量 - 電機(jī)驅(qū)動(dòng)執(zhí)行動(dòng)作 - 車體姿態(tài)改變 - 傳感器再次感知。這個(gè)循環(huán)必須在極短的時(shí)間內(nèi)通常是幾毫秒完成任何一環(huán)的延遲或誤差累積都會(huì)導(dǎo)致小車劇烈振蕩甚至直接“趴窩”。所以這個(gè)項(xiàng)目不僅是對(duì)STM32性能的考驗(yàn)更是對(duì)控制算法理解、傳感器數(shù)據(jù)處理和電機(jī)驅(qū)動(dòng)調(diào)參的一次綜合實(shí)戰(zhàn)。無論你是想深入理解PID控制還是想挑戰(zhàn)嵌入式實(shí)時(shí)系統(tǒng)自制平衡小車都是絕佳的練手項(xiàng)目。2. 硬件系統(tǒng)設(shè)計(jì)與核心器件選型硬件是算法的基石一個(gè)穩(wěn)定可靠的硬件平臺(tái)能讓后續(xù)的調(diào)試事半功倍。平衡小車的硬件架構(gòu)相對(duì)清晰主要圍繞感知、決策、執(zhí)行三大模塊展開。2.1 主控與姿態(tài)感知模塊主控芯片STM32F103C8T6核心板這是平衡小車領(lǐng)域經(jīng)久不衰的“神U”選擇它主要基于幾點(diǎn)考量首先是性能足夠72MHz的主頻和充足的定時(shí)器、中斷資源能夠輕松應(yīng)對(duì)毫秒級(jí)的控制周期計(jì)算。其次是生態(tài)完善無論是標(biāo)準(zhǔn)庫還是HAL庫資料和例程都極其豐富社區(qū)里你遇到的絕大多數(shù)問題都能找到答案。最后是成本核心板價(jià)格低廉即便調(diào)試過程中操作失誤導(dǎo)致?lián)p壞也不會(huì)太心疼。對(duì)于初次嘗試完全夠用如果想追求更高性能或更多功能如接入更復(fù)雜的濾波算法、無線調(diào)試可以考慮STM32F4系列但F103是性價(jià)比最高的起點(diǎn)。姿態(tài)傳感器MPU6050六軸陀螺儀加速度計(jì)這是整個(gè)系統(tǒng)的“眼睛”。它集成了三軸陀螺儀測(cè)量角速度和三軸加速度計(jì)測(cè)量加速度通過融合這兩類數(shù)據(jù)我們可以解算出車體相對(duì)于重力方向的傾角。為什么不用簡單的角度傳感器因?yàn)槲覀冃枰氖莿?dòng)態(tài)、實(shí)時(shí)的姿態(tài)MPU6050以數(shù)字信號(hào)輸出通過I2C接口與單片機(jī)通信速度快集成度高。注意MPU6050模塊一定要選擇帶電平轉(zhuǎn)換芯片和穩(wěn)壓電路的版本。因?yàn)镸PU6050芯片本身是3.3V供電而很多調(diào)試器或供電是5V直接連接可能損壞傳感器。好的模塊會(huì)集成一顆如AMS1117的LDO和TXS0108E之類的電平轉(zhuǎn)換器省去很多麻煩。2.2 執(zhí)行與驅(qū)動(dòng)模塊電機(jī)TT減速直流電機(jī)帶編碼器電機(jī)的選擇直接決定了小車的“力氣”和“反應(yīng)速度”。我們通常選擇N20或類似尺寸的減速直流電機(jī)。減速比很重要常見的有1:30, 1:100, 1:200等。減速比越大輸出扭矩越大力氣大帶得動(dòng)車體但最高轉(zhuǎn)速越低反應(yīng)可能慢。對(duì)于自重約300-500克的小車1:100左右的減速比是一個(gè)不錯(cuò)的平衡點(diǎn)。務(wù)必選擇帶正交編碼器的型號(hào)。編碼器是閉環(huán)控制的“另一只眼”它反饋電機(jī)輪子的實(shí)際轉(zhuǎn)速讓我們能實(shí)現(xiàn)精準(zhǔn)的速度控制這是實(shí)現(xiàn)平衡和后續(xù)速度環(huán)、轉(zhuǎn)向環(huán)的基礎(chǔ)。電機(jī)驅(qū)動(dòng)TB6612FNG 或 DRV8833絕不推薦使用L298N。雖然L298N經(jīng)典但其壓降大、發(fā)熱嚴(yán)重、控制精度一般。TB6612FNG和DRV8833是更現(xiàn)代的MOSFET橋驅(qū)動(dòng)芯片效率高、發(fā)熱小、支持PWM頻率更高。TB6612FNG驅(qū)動(dòng)能力更強(qiáng)單路1.2A邏輯電壓與單片機(jī)3.3V兼容性好DRV8833體積更小價(jià)格略有優(yōu)勢(shì)。兩者都支持雙路電機(jī)控制且?guī)в写龣C(jī)引腳方便安全控制。2.3 電源與結(jié)構(gòu)模塊電源18650鋰電池兩節(jié)串聯(lián)7.4V電機(jī)和單片機(jī)系統(tǒng)最好分開供電。方案一兩節(jié)18650串聯(lián)得到7.4V直接給電機(jī)驅(qū)動(dòng)供電同時(shí)使用一塊降壓模塊如MP1584EN將7.4V降為穩(wěn)定的5V或3.3V給單片機(jī)和傳感器供電。方案二使用一塊帶充放電保護(hù)板的2S鋰電池搭配一個(gè)雙路輸出的DC-DC降壓模塊分別輸出電機(jī)驅(qū)動(dòng)所需的電壓和單片機(jī)所需的電壓。絕對(duì)不要試圖用USB供電來驅(qū)動(dòng)電機(jī)電流遠(yuǎn)遠(yuǎn)不夠會(huì)導(dǎo)致小車一啟動(dòng)就復(fù)位。車體結(jié)構(gòu)亞克力或碳纖維板結(jié)構(gòu)強(qiáng)度至關(guān)重要。車體不能太軟否則會(huì)在啟動(dòng)或平衡時(shí)產(chǎn)生難以建模的形變和振動(dòng)。自己用亞克力激光切割是最常見的選擇設(shè)計(jì)時(shí)要注意電機(jī)安裝孔的精度確保兩個(gè)輪子平行且軸線水平。電池的安裝位置應(yīng)盡可能靠近輪軸這能降低整車的轉(zhuǎn)動(dòng)慣量讓小車反應(yīng)更靈敏。你可以把電池放在車體下層緊貼底盤。3. 軟件框架與核心算法解析軟件是平衡小車的靈魂。一個(gè)好的程序架構(gòu)能讓復(fù)雜的控制邏輯變得清晰而核心算法的理解則是調(diào)參成功的鑰匙。3.1 程序主循環(huán)與中斷設(shè)計(jì)平衡控制對(duì)實(shí)時(shí)性要求極高絕不能使用while(1)循環(huán)中簡單延時(shí)的方式來讀取傳感器和控制電機(jī)。標(biāo)準(zhǔn)的做法是建立一個(gè)定時(shí)器中斷作為系統(tǒng)的心跳。// 示例使用STM32的定時(shí)器配置1ms中斷 void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 1. 讀取MPU6050原始數(shù)據(jù) // 2. 執(zhí)行姿態(tài)解算如互補(bǔ)濾波 // 3. 讀取編碼器值計(jì)算電機(jī)速度 // 4. 執(zhí)行平衡PID和速度PID計(jì)算 // 5. 更新電機(jī)PWM輸出 Control_Task(); // 將上述步驟封裝成一個(gè)控制任務(wù)函數(shù) } }在這個(gè)1ms的中斷里我們完成一次從感知到執(zhí)行的全流程。主函數(shù)main()的循環(huán)則負(fù)責(zé)一些非實(shí)時(shí)性的任務(wù)比如按鍵掃描、狀態(tài)LED指示、通過串口向上位機(jī)發(fā)送調(diào)試數(shù)據(jù)等。這種中斷驅(qū)動(dòng)的方式確保了控制周期的絕對(duì)精確。3.2 姿態(tài)解算從數(shù)據(jù)到角度MPU6050輸出的是原始的陀螺儀角速度單位度/秒和加速度計(jì)數(shù)據(jù)單位g。我們需要把它們?nèi)诤铣梢粋€(gè)穩(wěn)定、準(zhǔn)確的傾角。加速度計(jì)算角度當(dāng)小車近似靜止時(shí)通過測(cè)量重力加速度在X、Z軸上的分量可以用三角函數(shù)atan2(AccX, AccZ)算出傾角。這個(gè)方法在靜態(tài)時(shí)很準(zhǔn)但一旦小車運(yùn)動(dòng)起來電機(jī)振動(dòng)、小車加速度都會(huì)引入巨大噪聲。陀螺儀積分算角度對(duì)角速度進(jìn)行積分可以得到角度變化。這個(gè)方法動(dòng)態(tài)響應(yīng)好沒有運(yùn)動(dòng)加速度干擾但存在積分漂移溫漂、零漂會(huì)隨時(shí)間累積導(dǎo)致角度越來越不準(zhǔn)?;パa(bǔ)濾波一種簡單而有效的融合算法。其思想是用加速度計(jì)的角度去校正陀螺儀積分的漂移。// 簡化的互補(bǔ)濾波公式 float Complementary_Filter(float acc_angle, float gyro_rate, float dt) { static float angle 0; float K 0.02; // 互補(bǔ)濾波系數(shù)通常很小0.02-0.1 // 角度 0.98 * (上一角度 陀螺儀角速度*時(shí)間差) 0.02 * 加速度計(jì)角度 angle (1 - K) * (angle gyro_rate * dt) K * acc_angle; return angle; }這里的K是一個(gè)權(quán)衡參數(shù)。K越大信任加速度計(jì)越多靜態(tài)越穩(wěn)但動(dòng)態(tài)響應(yīng)差K越小信任陀螺儀越多動(dòng)態(tài)好但漂移大。通常需要根據(jù)實(shí)際效果微調(diào)。實(shí)操心得在調(diào)試初期務(wù)必通過串口將acc_angle加速度計(jì)角度、gyro_integral陀螺儀積分角度和filtered_angle融合后角度實(shí)時(shí)打印出來用上位機(jī)軟件如SerialChart、匿名上位機(jī)觀察波形。你會(huì)直觀地看到加速度計(jì)數(shù)據(jù)的抖動(dòng)和陀螺儀的漂移以及互補(bǔ)濾波如何將它們平滑地結(jié)合在一起。這是理解濾波最有效的方式。3.3 控制核心串級(jí)PID算法單靠一個(gè)PID環(huán)很難讓小車既穩(wěn)定又聽話。這里我們采用最經(jīng)典的串級(jí)PID控制外環(huán)是速度環(huán)內(nèi)環(huán)是平衡環(huán)角度環(huán)。內(nèi)環(huán)平衡環(huán)這是維持直立的核心。輸入是期望角度通常設(shè)為0度即完全直立與當(dāng)前融合后角度的偏差以及角速度可由陀螺儀直接獲得作為微分項(xiàng)D。輸出是一個(gè)控制量直接決定電機(jī)的“力度”和方向。比如車體前傾角度為正平衡環(huán)就輸出一個(gè)正值驅(qū)動(dòng)電機(jī)向前轉(zhuǎn)把車體“追回來”。平衡環(huán)輸出 Kp_balance * 角度偏差 Kd_balance * 角速度這里Kp比例決定了反應(yīng)的強(qiáng)度Kd微分決定了“剎車”的力度能抑制振蕩。通常不需要積分項(xiàng)(I)因?yàn)橹绷⒖刂剖且粋€(gè)快速、無靜差要求的動(dòng)態(tài)過程加入積分容易導(dǎo)致超調(diào)和不穩(wěn)定。外環(huán)速度環(huán)如果只有平衡環(huán)小車雖然能站住但會(huì)不受控制地朝一個(gè)方向慢慢移動(dòng)因?yàn)槿魏挝⑿〉牟粚?duì)稱都會(huì)累積。速度環(huán)的輸入是期望速度通常由遙控器給定自平衡模式下可設(shè)為0與編碼器反饋的實(shí)際速度的偏差。輸出是一個(gè)角度偏移量疊加到平衡環(huán)的期望角度上。速度環(huán)輸出 Kp_speed * 速度偏差 Ki_speed * 速度偏差積分 期望角度 0 速度環(huán)輸出當(dāng)小車因?yàn)榈孛孑p微傾斜而開始下滑時(shí)編碼器會(huì)檢測(cè)到向下的速度速度環(huán)輸出一個(gè)負(fù)的角度偏移比如-0.5度這意味著平衡環(huán)的目標(biāo)不再是0度而是-0.5度略微后仰。于是平衡環(huán)會(huì)驅(qū)動(dòng)電機(jī)向后轉(zhuǎn)產(chǎn)生一個(gè)向上的加速度來抵消下滑最終使平均速度穩(wěn)定在0。關(guān)鍵點(diǎn)速度環(huán)的積分項(xiàng)Ki_speed至關(guān)重要。正是這個(gè)積分作用能夠持續(xù)累加微小的速度偏差產(chǎn)生一個(gè)穩(wěn)定的角度偏移來抵消重力分力或機(jī)械不對(duì)稱帶來的持續(xù)漂移從而實(shí)現(xiàn)真正的“原地”平衡。4. 詳細(xì)實(shí)現(xiàn)步驟與調(diào)試實(shí)錄理論懂了接下來就是動(dòng)手實(shí)現(xiàn)和痛苦的調(diào)試過程。遵循一個(gè)清晰的步驟能讓你少走彎路。4.1 硬件組裝與基礎(chǔ)驅(qū)動(dòng)測(cè)試焊接與組裝按照電路圖將電機(jī)驅(qū)動(dòng)、單片機(jī)核心板、MPU6050模塊、電池接口等焊接在洞洞板或PCB上。注意電源走線要粗電機(jī)驅(qū)動(dòng)部分最好并聯(lián)大電容如470uF以吸收電機(jī)啟停產(chǎn)生的電流沖擊。機(jī)械組裝時(shí)確保車體重心在輪軸下方、電池居中兩個(gè)輪子轉(zhuǎn)動(dòng)靈活且無卡滯?;A(chǔ)通信測(cè)試單片機(jī)程序先寫一個(gè)最簡單的程序讓LED閃爍確認(rèn)開發(fā)環(huán)境、下載器沒問題。MPU6050測(cè)試使用I2C讀取MPU6050的WHO_AM_I寄存器默認(rèn)值0x68確認(rèn)通信成功。然后循環(huán)讀取加速度計(jì)和陀螺儀的原始值通過串口打印出來。靜止時(shí)Z軸加速度應(yīng)接近±1g取決于模塊方向轉(zhuǎn)動(dòng)模塊時(shí)陀螺儀數(shù)據(jù)應(yīng)有明顯變化。編碼器測(cè)試編寫編碼器讀數(shù)程序。STM32的定時(shí)器編碼器接口模式是最高效的方式。配置一個(gè)定時(shí)器為編碼器模式它會(huì)自動(dòng)根據(jù)AB相的脈沖和方向更新計(jì)數(shù)值。讓輪子空轉(zhuǎn)打印計(jì)數(shù)值正轉(zhuǎn)應(yīng)遞增反轉(zhuǎn)應(yīng)遞減。電機(jī)驅(qū)動(dòng)測(cè)試寫一個(gè)函數(shù)輸入PWM值和方向能控制電機(jī)正反轉(zhuǎn)。先低速測(cè)試確保電機(jī)響應(yīng)正確沒有接反線否則后續(xù)調(diào)試會(huì)完全混亂。4.2 姿態(tài)解算與平衡環(huán)初步調(diào)試實(shí)現(xiàn)互補(bǔ)濾波將MPU6050的讀取和互補(bǔ)濾波函數(shù)整合到1ms定時(shí)器中斷中。計(jì)算并輸出filtered_angle。通過串口波形觀察確保角度響應(yīng)平滑沒有劇烈跳變。用手緩慢改變車體傾角觀察角度值是否線性變化。平衡環(huán)PID參數(shù)整定空載手扶著將小車用手扶住保持近似直立。先調(diào)Kd后調(diào)Kp這是一個(gè)非常重要的技巧。首先將Kp_balance設(shè)為0Kd_balance設(shè)為一個(gè)較小的正值比如-1。給Kd一個(gè)負(fù)號(hào)是因?yàn)榻撬俣确较蚺c我們需要抑制的運(yùn)動(dòng)方向相反。用手給小車一個(gè)快速的、小幅度的推力然后松開模擬一個(gè)擾動(dòng)。觀察輪子的反應(yīng)。如果輪子迅速向擾動(dòng)相反方向轉(zhuǎn)動(dòng)一下然后停止說明Kd在起作用阻尼。如果小車來回振蕩說明Kd不夠大緩慢增加Kd值直到擾動(dòng)后能快速穩(wěn)定下來沒有振蕩。固定Kd開始調(diào)Kp。將Kp_balance設(shè)為一個(gè)很小的正值比如1。同樣用手施加擾動(dòng)。Kp決定了小車“追”的力度。Kp太小小車反應(yīng)慢扶正無力Kp太大會(huì)產(chǎn)生過沖和振蕩。緩慢增加Kp直到小車能較快地抵抗擾動(dòng)回到直立位置且不產(chǎn)生持續(xù)振蕩。核心觀察點(diǎn)電機(jī)的聲音和反應(yīng)。調(diào)試時(shí)你應(yīng)該能聽到電機(jī)隨著你的推力發(fā)出相應(yīng)的高頻響應(yīng)聲。參數(shù)合適時(shí)小車在你手里會(huì)感覺“有韌性”既不會(huì)軟綿綿也不會(huì)跟你“較勁”亂抖。4.3 速度環(huán)整合與參數(shù)整定實(shí)現(xiàn)速度環(huán)計(jì)算在1ms中斷中通過編碼器差值計(jì)算電機(jī)轉(zhuǎn)速單位脈沖/毫秒或轉(zhuǎn)/分鐘。速度環(huán)的計(jì)算頻率可以比平衡環(huán)低例如每10ms計(jì)算一次。速度環(huán)PID輸出一個(gè)angle_offset將其加到平衡環(huán)的期望角度上。速度環(huán)參數(shù)整定小車已能短暫自立先讓平衡環(huán)工作嘗試松手讓小車自己平衡。此時(shí)它大概率會(huì)朝一個(gè)方向勻速跑掉。將速度環(huán)的Kp_speed和Ki_speed都設(shè)為0。然后先調(diào)Kp_speed。給Kp_speed一個(gè)很小的負(fù)值比如-0.1。這個(gè)負(fù)號(hào)很關(guān)鍵如果小車向前跑速度為正我們希望它產(chǎn)生一個(gè)后仰的角度偏移角度為負(fù)來剎車。觀察效果。增加Kp_speed的絕對(duì)值小車的漂移速度會(huì)變慢甚至開始來回緩慢擺動(dòng)。Kp_speed太大會(huì)引起低頻振蕩。當(dāng)Kp_speed使小車基本能在一個(gè)小范圍內(nèi)來回移動(dòng)而不是跑遠(yuǎn)時(shí)引入Ki_speed。Ki_speed也是一個(gè)負(fù)值且數(shù)值非常小比如-0.001。它的作用是消除靜差。緩慢增加Ki_speed的絕對(duì)值你會(huì)發(fā)現(xiàn)小車逐漸能夠“定”在一點(diǎn)不再緩慢漂移。危險(xiǎn)區(qū)Ki_speed是導(dǎo)致系統(tǒng)不穩(wěn)定的常見元兇。如果Ki_speed過大積分會(huì)累積過快導(dǎo)致角度偏移巨大小車會(huì)突然加速?zèng)_向一邊并倒下。調(diào)試時(shí)必須非常小心每次只做微小的調(diào)整。4.4 進(jìn)階調(diào)試與性能優(yōu)化當(dāng)小車能穩(wěn)定站立幾十秒后可以開始優(yōu)化機(jī)械振動(dòng)濾波電機(jī)轉(zhuǎn)動(dòng)和車體抖動(dòng)會(huì)嚴(yán)重影響MPU6050的加速度計(jì)讀數(shù)。除了在軟件上優(yōu)化互補(bǔ)濾波系數(shù)K可以在MPU6050模塊和車體之間增加海綿雙面膠或軟性硅膠墊進(jìn)行物理隔震效果立竿見影??刂屏枯敵鱿薹c死區(qū)// 對(duì)平衡環(huán)和速度環(huán)的最終輸出進(jìn)行限幅 #define MAX_OUTPUT 5000 // 對(duì)應(yīng)PWM計(jì)數(shù)值上限 if (output MAX_OUTPUT) output MAX_OUTPUT; if (output -MAX_OUTPUT) output -MAX_OUTPUT; // 加入死區(qū)避免電機(jī)在零點(diǎn)附近的嗡嗡聲 if (abs(output) DEAD_ZONE) output 0;電池電壓監(jiān)測(cè)與補(bǔ)償電池電壓下降會(huì)導(dǎo)致電機(jī)出力不足。可以測(cè)量電池電壓計(jì)算一個(gè)補(bǔ)償系數(shù)動(dòng)態(tài)調(diào)整PWM輸出或PID參數(shù)讓小車在電量不足時(shí)也能工作。5. 常見問題排查與實(shí)戰(zhàn)心得調(diào)試平衡小車的過程就是與各種詭異現(xiàn)象斗爭的過程。下面是一些典型問題及排查思路現(xiàn)象可能原因排查與解決思路上電后電機(jī)狂轉(zhuǎn)不受控制1. 電機(jī)驅(qū)動(dòng)輸入邏輯錯(cuò)誤。2. PWM初始化或GPIO配置錯(cuò)誤。3. 單片機(jī)與驅(qū)動(dòng)共地問題。1. 檢查驅(qū)動(dòng)芯片的AIN1/AIN2, BIN1/BIN2與STM32引腳的連接和初始化代碼確保正反轉(zhuǎn)邏輯正確。2. 用萬用表測(cè)量驅(qū)動(dòng)模塊的電源和地是否穩(wěn)定。3. 確保單片機(jī)、驅(qū)動(dòng)、電池的“地”是連接在一起的。小車一邊倒扶正后向反方向加速倒下平衡環(huán)的Kp或Kd極性錯(cuò)誤。檢查角度和角速度的符號(hào)定義。通常前傾車頭向下角度為正此時(shí)電機(jī)應(yīng)向前轉(zhuǎn)輸出為正以追回。如果反了嘗試將Kp_balance或Kd_balance乘以-1。小車能站住但劇烈高頻抖動(dòng)1.Kd_balance過大。2. 機(jī)械結(jié)構(gòu)松動(dòng)或電機(jī)軸套間隙大。3. PWM頻率過低建議在10kHz以上。1. 減小Kd_balance。2. 緊固所有螺絲檢查輪子與電機(jī)軸是否固定牢靠。3. 將定時(shí)器PWM輸出頻率提高到15kHz左右超出人耳聽覺范圍也能減少電機(jī)嘯叫。小車緩慢地朝一個(gè)方向勻速移動(dòng)速度環(huán)未起作用或參數(shù)不正確。機(jī)械不對(duì)稱。1. 確認(rèn)速度環(huán)計(jì)算已開啟且angle_offset被正確加到期望角度上。2. 檢查速度環(huán)Kp_speed和Ki_speed的極性應(yīng)為負(fù)值。3. 嘗試微調(diào)小車機(jī)械結(jié)構(gòu)或軟件上給兩個(gè)電機(jī)一個(gè)微小的靜態(tài)偏移補(bǔ)償。用手推一下小車來回振蕩幾次才穩(wěn)定阻尼不足。Kd_balance太小。在保證不振的前提下逐步增大Kd_balance。Kd是抑制振蕩的關(guān)鍵可以理解為“電子阻尼”。松手后小車往一個(gè)方向加速?zèng)_出去速度環(huán)積分項(xiàng)Ki_speed過大。立即調(diào)小Ki_speed的絕對(duì)值。這是最危險(xiǎn)的參數(shù)之一。先將其設(shè)為0重新調(diào)整Kp_speed使小車緩慢擺動(dòng)再以極小的步進(jìn)增加Ki_speed。角度數(shù)據(jù)跳動(dòng)厲害1. MPU6050受到振動(dòng)干擾。2. 互補(bǔ)濾波系數(shù)K不合適。3. I2C通信受干擾。1. 物理隔震加海綿。2. 適當(dāng)減小K更信任陀螺儀。3. 在I2C數(shù)據(jù)線和時(shí)鐘線上加上拉電阻4.7kΩ并盡量縮短走線。最后的個(gè)人體會(huì)調(diào)平衡小車耐心比技術(shù)更重要。參數(shù)沒有絕對(duì)的最優(yōu)值每個(gè)車體都不一樣。一定要一次只調(diào)一個(gè)參數(shù)并且記錄下每次改動(dòng)和對(duì)應(yīng)的現(xiàn)象。善用串口繪圖工具將關(guān)鍵數(shù)據(jù)角度、角速度、控制輸出可視化這比盯著數(shù)字瞎猜要高效一百倍。當(dāng)你的小車第一次顫顫巍巍地自己站起來并且能堅(jiān)持超過5秒鐘時(shí)那種成就感是無與倫比的。之后你可以在此基礎(chǔ)上增加藍(lán)牙遙控、超聲波避障、循跡等功能把它變成一個(gè)真正的移動(dòng)平臺(tái)。這個(gè)從零到一的過程會(huì)讓你對(duì)嵌入式實(shí)時(shí)控制有一個(gè)脫胎換骨的理解。