跳轉到

第 10 章:上位機調參與安全機制(總整理)

本章學習目標

  • 知道飛控怎麼把資料傳給上位機、你又怎麼用它調參
  • 看懂這台的四道安全防線(含電壓帶你算一次
  • 把第 0~9 章串成一張完整的資訊流圖

10.1 什麼是上位機(地面站)?它有什麼用

上位機」是對岸常用的詞,字面是「上面的電腦」,其實就是電腦端的一個軟體, 拿來跟「下位機」(飛控本身那顆 STM32)溝通。在無人機圈,它更常被叫做地面站(Ground Station)

一句話:上位機=你在電腦上開的程式,用一條線(USB/串口)或無線連到飛機, 用來「看飛機在想什麼、調飛機的設定」。

它的主要用途有四個:

用途 做什麼
📈 看波形 / 遙測 即時顯示姿態角、陀螺、油門、電壓…的曲線,飛行中或測試時觀察
🎛️ 調參數 改 PID、靈敏度等(邊看波形邊調效果)
🧭 校準 加速度計水平校準、遙控行程校準等
🐞 除錯 飛機怪怪的時候,從資料找出是哪個感測器或哪段邏輯出問題

常見的上位機:

  • ANO 匿名地面站(ANO_TC)你這台用的就是它(國產、適合學習)。
  • Betaflight Configurator:FPV 穿越機最主流。
  • Mission Planner / QGroundControl:給 Ardupilot / PX4 那種大型自駕飛控用。

🚗 比喻:上位機就像修車廠的電腦診斷儀——插上車子接口,就能看引擎轉速、油溫、故障碼,還能改設定。 飛控的「診斷儀」就是上位機。

它怎麼跟飛控對話:ANO 匿名協議

飛控透過串口,用 ANO 匿名協議把資料打包送到電腦上的 ANO_TC 地面站。 封包格式很簡單(HAL/ANO_DT.c):

0xAA 0xAA | 功能碼 | 長度 | 資料… | 校驗和
  幀頭      說明這  說明後  實際內容  把前面所有
(固定)    包是什麼  面幾位         位元組相加 & 0xFF
  • 幀頭 0xAA 0xAA:收方靠它認出「一包開始了」。
  • 功能碼:這包是姿態?是感測器原始值?是電壓?
  • 校驗和:把前面位元組加起來取低 8 位,收方重算一次比對,防止傳輸出錯

飛機每隔固定時間(第 1 章的 Duty_20ms / Duty_4ms)就送一包,所以你能在上位機即時看到波形


10.2 用上位機調參的流程

  1. 飛控接電腦(串口),打開 ANO_TC,選對 COM 埠與鮑率。
  2. 勾選要看的資料(姿態角、陀螺、PID 的 desired/measured…),畫成波形。
  3. 試飛或手動晃動,觀察波形找問題(抖?跟不上?過衝?)。
  4. 調整 PID,再看波形,反覆收斂。

這台的 PID 是「編譯進去」的

這份韌體的增益寫在 USER/INIT.cpid_param_Init()改參數要改原始碼再重新燒錄 (不像有些飛控能從上位機即時寫入並存進 Flash)。 所以這台的上位機主要價值是「看波形、找方向」,調好的數字要回去改 pid_param_Init()。 調參順序記得第 4 章的原則:先內環、後外環;先姿態、再高度、再光流


10.3 四道安全防線

飛控不是「能飛」就好,更要「出事時別釀大禍」。這台有四道防線:

① 獨立看門狗 IWDG(防程式卡死)

main() 開了看門狗,逾時約 1 秒。主迴圈每跑完一圈就 IWDG_Feed() 餵狗; 萬一某段程式卡死(例如感測器 I2C 通訊卡住),狗沒被餵到 → 自動重啟 MCU,給飛機一個恢復機會。

② 低電壓檢測(防過放摔機)

Voltage_Check()CONFIG/ADC.c,20Hz)用 ADC 量電池電壓:

CONFIG/ADC.c
voltage += 0.2f * (2 * (3300 * ADC_ConvertedValue[0] / 4096) - voltage);

帶你算一次:12 位元 ADC(0~4095)、參考 3.3V(=3300mV)、外部用了 1/2 分壓(所以乘 2)。 假設讀到 ADC = 2480

\[ \text{電壓} = 2 \times \frac{3300 \times 2480}{4096} = 2 \times 1998 \approx \mathbf{3996 \ mV} = 4.0\,V \]

那個 += 0.2f * (... - voltage) 又是一階低通濾波(還記得第 2.5 節嗎?同一招),把電壓讀數濾平穩。 電壓過低時程式會用 LED 警告,提醒你該降落了——避免鋰電池過放損壞空中沒電墜機

③ 失控保護 Failsafe(防斷訊亂飛)

第 6 章看過:遙控訊號斷掉 → 搖桿回中、油門緩降。靠 Duty_1000ms 的訊號強度統計判斷「還連著嗎」。

④ 解鎖/緊急停機(防誤觸與失控)

  • 預設上鎖,要刻意手勢才解鎖(第 6 章)。
  • ALL_flag.unlock == EMERGENT 時,PID 與馬達立即停止——緊急情況一鍵切斷動力。

10.4 把整台飛機串起來(全課程總圖)

恭喜你走到這裡!下面這張圖把第 0~9 章串成一條完整的資訊流——從感測器到馬達

flowchart TD
    subgraph sensors ["感官(第 2 章)"]
        G["陀螺/加速度<br/>MPU6050"]
        B["氣壓<br/>SPL06"]
        F["光流<br/>PMW3901"]
    end
    G --> AT["姿態解算<br/>四元數+Mahony(第 3 章)"]
    RC["遙控搖桿<br/>(第 6 章)"] --> MODE{"飛行模式<br/>(第 6 章)"}
    F --> FP["光流位置/速度環<br/>(第 8 章)"]
    B --> HP["高度環/速度環<br/>(第 7 章)"]
    MODE --> OUT["角度外環<br/>(第 4 章)"]
    FP --> OUT
    AT --> OUT
    OUT --> IN["角速度內環<br/>(第 4 章)"]
    HP --> MIX
    IN --> MIX["馬達混控<br/>(第 5 章)"]
    MIX --> PWM["PWM → 四顆馬達<br/>(第 5 章)"]
    SCH["排程器每 2~1000ms 分時驅動這一切(第 1 章)"]

每一個方塊,你現在都能說出「它在做什麼、用哪個感測器、對應哪段程式」——這就是你最初想要的: 把任何一台多旋翼的原理、硬體、程式三者對起來。


10.5 起飛前安全檢查清單

每次飛行前過一遍

  • 螺旋槳裝對方向、鎖緊;調參/測試時先拆槳
  • 電池電量充足、插緊(看上位機電壓,對照 10.3 ②)。
  • 開機時飛機靜止水平放好(讓陀螺/氣壓校準正確,第 2、7 章)。
  • 確認遙控連線正常、低電量保護有效。
  • 先小油門解鎖測試姿態方向對不對,再到空曠安全場地起飛。
  • 特技/極限飛行:足夠高度、空曠無人、戴護目鏡(第 9 章)。

10.6 思考題(綜合)

  • 用 10.3 ② 的公式,若上位機顯示電壓掉到 3.5V,反推 ADC 讀數大約是多少?
  • 看門狗能救「程式卡死」,但救不了「邏輯算錯」。請各舉一個你在前面章節學到的、屬於這兩類的例子。
  • 對著 10.4 的總圖,挑一條路徑(例如「光流定點」),把它經過的每一個方塊、每一章、每個感測器完整說一遍——這是檢驗你是否真的學通的最好方法。

10.7 本章對應的原始碼

檔案 看什麼
HAL/ANO_DT.cHAL/ANO_Data_Transfer.c ANO 協議打包與收發
USER/main.c 看門狗 IWDG_Init/Feed
CONFIG/ADC.c Voltage_Check() 電壓檢測
HAL/remote.c 失控保護、解鎖、緊急停機

🎉 全 11 章完成。 你已經把這台飛機從上電、感測、解算、控制、混控、到各種飛行模式與安全機制, 完整走了一遍。接下來最好的學習,就是對著真機、開著上位機,一邊飛一邊驗證每一章學到的東西