Skip to main content

空速度計

🚗 STM32 風壓與速度資料擷取系統說明

撰寫人: 范紹捷/動力組/5~9代

📌 系統目標

使用 STM32 MCU 從以下來源擷取資料:

  • MPXV7002 壓力感測器(透過 ADC 讀取電壓,計算壓力與風速)
  • 透過 UART 傳輸格式化資料給 Python GUI 顯示與繪圖

🔧 系統架構

感測器/模組 功能 照片
MPXV7002 壓力感測 image
stm32 運算 image
GUI 主機 顯示資料 USARTx_TX (UART 傳輸腳位)

🔌 感測器與接腳

螢幕擷取畫面 2025-05-21 164842

軟體架構

MPXV7002 ⇩ ADC ⇩ 壓力/風速計算 ⇩ STM32 格式化字串 ⇩ UART 傳送給 GUI

🧮 風速計算公式

壓力轉換公式:

pressure_kPa = (voltage - 2.5) / 1.0;  // ±2kPa 對應 0.5V~4.5V

風速計算(使用伯努力定律):

airspeed_mps = sqrt(2 * abs(pressure_kPa) * 1000 / 1.225);
airspeed_kmh = airspeed_mps * 3.6;

🧰 STM32 程式碼片段

1️⃣ ADC 電壓讀取(以 12-bit 為例) 112~114行

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
ADC_Value = HAL_ADC_GetValue(&hadc1);

2️⃣ 壓力/風速計算 118~121行

ADC_Volt = (float)ADC_Value/4096*3.3;
float pressure = (ADC_Volt - V_OFFSET) / SENSITIVITY;  //kPa
float airspeed = sqrt(2 * fabs(pressure) * 1000.0f / AIR_DENSITY);   
float airspeed_kmh = airspeed * 3.6f;

3️⃣ 格式化字串並透過 UART 傳送 123~126行

if(HAL_GetTick()%100 == 0){ //USRT Send
    char buf[100];
    sprintf(buf, "Volt:%.2lf V \t P:%.2lf kPa \t S:%.2lf Kmh\n", ADC_Volt,pressure,airspeed_kmh);
    HAL_UART_Transmit(&huart1, (uint8_t*)buf, strlen(buf), HAL_MAX_DELAY);
}

🧰 STM32 程式碼

image