先疊buff,這是玩具!玩具!玩具!
這是一個使用一晚上時間,指揮AI智能體實現的esp32示波器。這個也只是玩具級的demo。適配了lvgl,使用lvgl的劃線功能繪制圖像。代碼默認開啟GPIO0作為輸入通道,50KHz的采樣率,自動識別輸入波形的頻率,然后再截取固定相位的波形顯示在屏幕上(3個周期)。
ESP32-C6 LCD 示波器 — 從零實現方案
背景:
已有條件:ESP32-C6 + ST7789T LCD (320×172 橫屏已配好) + LVGL 已能正常顯示(直接拿微雪或者其他成品代碼給AI作參考適配就行了,不要閑著沒事兒干丟屏驅芯片的手冊,讓AI給你寫驅動)。 目標:實現簡易示波器,ADC 采樣率 50KHz,GPIO0 模擬輸入。
數據流
- ADC 采樣(50KHz) → 觸發(穩住波形) → 測量(頻率+幅度) → LVGL 顯示(波形+數字)
步驟 1:ADC 采樣 + 校準
做什么
用 ESP-IDF 連續 ADC 驅動持續采集 GPIO0 的模擬信號,校準后以 mV 單位輸出。
具體步驟
- 配置連續 ADC:ADC1_CH0 (GPIO0),12bit,ADC_ATTEN_DB_12,50KHz
- 分配環形緩沖區 8192 采樣點(163ms @50KHz,兼顧 10Hz~25kHz)
- adc_cali_create_scheme_curve_fitting()
- adc_cali_raw_to_voltage()
- osc_adc_snapshot(buf, max)
- 在 中初始化 ADC,循環調用 snapshot,通過 打印前 20 個值
驗收
- GPIO0 接 3.3V → 打印值 ≈ 2500~3300mV(C6 滿量程不是 3.3V)
- 接 1kHz 正弦波 → 數據有明顯周期性高低變化
自己做這一部分的驗收工作,確認adc連續采樣已經可以工作了。
步驟 2:邊沿觸發
做什么
在采樣數據中找到上升過中點的位置,讓波形從固定相位開始,顯示不漂移。
具體步驟
- data[i] >= mid && data[i-1] < mid
- 在主循環中:觸發成功則從觸發點取數據,失敗則取緩沖區末尾
驗收
- 主循環:snapshot → 觸發 → 打印觸發位置
- 接正弦波,串口持續輸出觸發索引,值應在合理范圍內跳動
步驟 3:Vpp 測量
做什么
從一段采樣數據中算出峰峰值電壓。
具體步驟
- 實現測量函數:遍歷數據找 min_mV 和 max_mV
- Vpp = (max_mV - min_mV) / 1000.0
驗收
- 接 1kHz 正弦波(信號發生器設置 1Vpp)→ 打印 Vpp ≈ 1.0V
- 接 1kHz 方波(信號發生器設置 3Vpp)→ 打印 Vpp ≈ 3.0V
步驟 4:頻率測量 — 過零點法
做什么
統計上升過中點的次數和間距,計算基波頻率。
具體步驟
- data[i] >= mid && data[i-1] < mid
驗收
- 1kHz 正弦波 → 打印 ≈ 1000Hz,誤差 < 5%
- 535Hz 方波 90%占空比 → 打印 ≈ 535Hz(不會誤判為 1070Hz 二次諧波)
注意
- < 200Hz 時頻率讀數會跳變(163ms 緩沖區內周期數太少),這是正常的,后續可用多幀平滑改善
步驟 5:頻率測量 — FFT(可選 fallback)
做什么
為過零點失敗的場景提供備選頻率檢測。此步驟可選,過零點法已覆蓋絕大多數場景。
具體步驟
- 實現 512 點 Cooley-Tukey FFT:bit_reverse + 蝶形運算
- 在 measure 中:對數據加 Hann 窗后送入 FFT
- 測量策略:過零點優先,FFT 僅在過零點返回 0 時使用
驗收
- 過零點失敗時(如噪聲信號),FFT 仍能給出近似頻率
注意
- fft_len 必須是 2 的冪
- while (n*2 <= limit) n*=2
- ESP32-C6 無 FPU,2048 點 FFT 會觸發看門狗,限制在 512 點
- 方波的二次諧波比基波還強時 FFT 會誤判,所以過零點必須是主方案
步驟 6:波形顯示 — 基礎版
做什么
在 LVGL 上畫出波形,先實現最簡單的版本:直接顯示采樣數據,不做周期縮放。
具體步驟
- y = disp_h - 1 - (mV × disp_h / 3300)
驗收
- 接 5kHz 信號 → 波形變密(周期多),但仍能看到
步驟 7:固定 3 周期顯示
做什么
根據測量的周期,自動縮放波形,始終顯示 3 個完整周期。
具體步驟
- period_samples = sample_rate / frequency + 0.5
- src_len = period_samples × 3
- 用線性插值將 src_len 個采樣重采樣到 320 像素:
- frac = i × (src_len-1) / 319
驗收
注意
- 可能小于 320(高頻時),這是正常的,插值會拉伸,不需要加 的限制
步驟 8:參考線 + 信息文字
做什么
疊加 1.65V 參考線和頻率/Vpp 數字顯示。
具體步驟
- 創建第二條 作為參考線,水平畫在 位置(1.65V),顏色暗青色
驗收
步驟 9:整合主循環
做什么
將所有模塊串聯到的主循環中。
具體步驟
- 中依次初始化:LCD → LVGL → ADC → UI
驗收
- 切換波形類型(正弦/方/三角)和頻率,1 秒內穩定
這上面的步驟,FFT部分可以不需要做,其他的,遇到AI寫Lvgl界面錯誤的,例如文字旋轉丟失,位置不正確,波形繪制上下顛倒什么的,自己根據情況反饋給AI修正即可。
源碼地址:https://gitee.com/walker2048/eetree-occurrence/tree/master/oscilloscope-c6
· END ·
請將我們設為“星標”,這樣就會第一時間收到推送消息。
歡迎關注EEWorld旗下訂閱號:“機器人開發圈”