在無人機(jī)電機(jī)控制領(lǐng)域,PID控制器已經(jīng)統(tǒng)治了數(shù)十年。它結(jié)構(gòu)簡單、參數(shù)直觀、實(shí)現(xiàn)容易,幾乎成了嵌入式開發(fā)的入門必修課。但隨著無人機(jī)應(yīng)用場景的拓展——高原巡檢、重載運(yùn)輸、高速競速——PID的局限性正變得越來越明顯:它處理不了外部擾動(dòng)帶來的持續(xù)性誤差,也無法適應(yīng)環(huán)境變化引起的模型漂移。自抗擾控制正在從學(xué)術(shù)界走向工程界,成為FOC系統(tǒng)中PID的有力替代者。
同一套代碼,換個(gè)中斷分組,系統(tǒng)響應(yīng)時(shí)間能差出一個(gè)數(shù)量級(jí)。這不是夸張——FreeRTOS的實(shí)時(shí)性,有一半捏在NVIC優(yōu)先級(jí)分組的手里。多數(shù)開發(fā)者只知道"設(shè)置優(yōu)先級(jí)",卻不知道分組方式選錯(cuò)了,整個(gè)調(diào)度體系就從"確定性實(shí)時(shí)"退化成"看運(yùn)氣響應(yīng)"。
嵌入式RTOS開發(fā),棧溢出是最常見也最隱蔽的運(yùn)行時(shí)錯(cuò)誤之一。一個(gè)任務(wù)分配的??臻g不足,并不會(huì)立即導(dǎo)致系統(tǒng)崩潰——而是靜默地覆蓋相鄰的內(nèi)存區(qū)域,可能破壞另一個(gè)任務(wù)的控制塊、篡改全局變量,甚至在數(shù)小時(shí)后才觸發(fā)一個(gè)莫名其妙的HardFault。FreeRTOS提供了三種不同層級(jí)的棧溢出檢測方法,它們分別適用于開發(fā)調(diào)試、生產(chǎn)部署和安全苛求等不同場景。
實(shí)時(shí)系統(tǒng)最怕什么?不是任務(wù)跑得慢,是高優(yōu)先級(jí)任務(wù)被低優(yōu)先級(jí)任務(wù)"綁架"。這就是優(yōu)先級(jí)反轉(zhuǎn)——實(shí)時(shí)系統(tǒng)里最陰險(xiǎn)的調(diào)度陷阱。FreeRTOS的互斥量(Mutex)內(nèi)置了優(yōu)先級(jí)繼承協(xié)議(Priority Inheritance Protocol, PIP),不需要你寫一行額外代碼,內(nèi)核自動(dòng)完成優(yōu)先級(jí)提升與恢復(fù)。理解它的實(shí)現(xiàn)原理,才能真正用好這個(gè)機(jī)制。
電池供電的物聯(lián)網(wǎng)設(shè)備中,MCU的功耗往往占據(jù)系統(tǒng)總功耗的相當(dāng)比重。一個(gè)典型的傳感器節(jié)點(diǎn)可能每秒采集一次數(shù)據(jù),其余時(shí)間都在等待。如果讓MCU在這段時(shí)間內(nèi)全速運(yùn)行,電池能量將很快耗盡。FreeRTOS提供了Tickless低功耗模式,但僅支持“全速運(yùn)行”和“深度睡眠”兩級(jí)切換。在多級(jí)休眠策略下,系統(tǒng)可以根據(jù)空閑時(shí)間的長短動(dòng)態(tài)選擇不同深度的休眠模式,從而在功耗和喚醒延遲之間取得最佳平衡。
同樣跑FOC,一個(gè)電流環(huán)抖5微秒,一個(gè)抖50微秒——差距就在操作系統(tǒng)的骨子里。ChibiOS和FreeRTOS都能跑電機(jī)控制,但當(dāng)你把示波器接上去看電流波形,ChibiOS的干凈程度會(huì)讓你重新理解"實(shí)時(shí)"兩個(gè)字。快,不是營銷話術(shù),是納秒級(jí)的工程事實(shí)。
在無人機(jī)FOC電調(diào)的調(diào)試過程中,總會(huì)遇到一些讓人摸不著頭腦的問題。電機(jī)像踩了剎車一樣堵轉(zhuǎn),PWM波形忽快忽慢,電機(jī)尖叫著發(fā)燙就是不轉(zhuǎn)。這些問題往往不是PID參數(shù)沒調(diào)好,而是代碼配置、硬件連接或時(shí)序邏輯中藏著某些容易被忽略的錯(cuò)誤。以下從實(shí)測數(shù)據(jù)出發(fā),梳理五個(gè)經(jīng)典“翻車”現(xiàn)場及其排查方法。
在電機(jī)驅(qū)動(dòng)系統(tǒng)中,電流采樣精度決定了FOC控制的性能上限。采樣誤差會(huì)導(dǎo)致轉(zhuǎn)矩脈動(dòng)、效率下降,甚至觸發(fā)過流保護(hù)。目前主流的電流采樣方案有三種:低側(cè)電阻采樣、高側(cè)電阻采樣和直流母線單電阻采樣。它們各自在精度、成本和復(fù)雜度之間做出了不同的取舍。本文將系統(tǒng)解析三種方案的測試原理、實(shí)測數(shù)據(jù)與工程意義。
在嵌入式實(shí)時(shí)系統(tǒng)中,動(dòng)態(tài)內(nèi)存分配向來是一把雙刃劍。一方面,它帶來了靈活性,允許系統(tǒng)在運(yùn)行時(shí)按需分配資源;另一方面,標(biāo)準(zhǔn)堆分配算法的時(shí)間不確定性和內(nèi)存碎片問題,在實(shí)時(shí)系統(tǒng)中可能成為致命缺陷。FreeRTOS內(nèi)核自身的任務(wù)、隊(duì)列等對象創(chuàng)建時(shí),默認(rèn)就是從堆中分配內(nèi)存的。但如果想在應(yīng)用層也實(shí)現(xiàn)高效、零碎片、時(shí)間恒定的對象分配,就需要設(shè)計(jì)專用的內(nèi)存池。
在無人機(jī)調(diào)試過程中,工程師常常面臨一個(gè)令人沮喪的場景:懸停測試發(fā)現(xiàn)電機(jī)響應(yīng)過沖,需要降低P值,于是降落后連接USB線,打開上位機(jī),寫入?yún)?shù),解鎖升空,再次測試,發(fā)現(xiàn)調(diào)整過頭了,于是重復(fù)上述流程。每輪調(diào)試需要3-5分鐘,而實(shí)際調(diào)參時(shí)間不到30秒。這種“落地-接線-燒寫-起飛”的循環(huán),在戶外調(diào)試現(xiàn)場尤為耗時(shí)。
互斥量和信號(hào)量長得像,用法像,連API都像——但它們的設(shè)計(jì)意圖完全相反?;コ饬抗艿氖?quot;誰能進(jìn)這扇門",信號(hào)量管的是"還剩幾張票"。用錯(cuò)了,輕則優(yōu)先級(jí)反轉(zhuǎn)死鎖,重則整個(gè)系統(tǒng)卡死。90%的開發(fā)者把二進(jìn)制信號(hào)量當(dāng)互斥量用,這是FreeRTOS里最貴的一個(gè)錯(cuò)誤。