Real-time Spectrum Analyzer

Lab 7: Spectrum Analyzer in Action

Part 3 - Oscilloscope & Signal Processing

1. โครงสร้างภาพรวมของ Lab

Why? - ทำไมต้องเรียนรู้เรื่องนี้

  • Hardware-in-the-Loop: การเชื่อมต่อ UI กับ Hardware จริงเป็นทักษะสำคัญที่สุดของ Embedded Engineer ระบบ SCADA, HMI, และ Industrial Controller ล้วนต้อง map ข้อมูลจาก sensor ไปยัง parameter ของระบบ และแสดงผลแบบ real-time

  • ADC-to-Parameter Mapping: ในระบบจริง เราต้องแปลงค่า ADC (0-100%) ไปเป็นพารามิเตอร์ที่มีความหมาย เช่น ความถี่ (100-5000 Hz), Duty Cycle (10-90%), Temperature Setpoint เป็นต้น ทักษะนี้ใช้ในทุกระบบ Control

  • Phase Accumulator: เป็น pattern พื้นฐานของ Direct Digital Synthesis (DDS) ที่ใช้ในการสร้างสัญญาณดิจิทัล, PWM Controller, Motor Drive, และ Audio Synthesizer

  • Read-Only UI Sync: การแสดง slider ที่ sync กับค่าจาก hardware input โดยไม่ให้ผู้ใช้แก้ไขผ่าน UI เป็น pattern ที่ใช้บ่อยในระบบ monitoring

  • EE Application: Function Generator ที่ควบคุมด้วย POTEN + แสดงผลบน LED PWM เป็นพื้นฐานของ Signal Generator, Motor Speed Controller, Dimmer, Power Supply Regulation

What? - จะได้เรียนรู้อะไร

  1. Hardware ADC Integration: อ่านค่า Potentiometer ผ่าน aic_adc_read_percent() แบบ real-time

  2. Parameter Mapping: แปลง ADC 0-100% เป็น Frequency (100-5000 Hz) และ Duty Cycle (10-90%)

  3. Phase Accumulator: สร้าง waveform output ไปยัง LED ด้วย phase accumulator pattern

  4. PWM LED Control: ส่งค่า brightness (0-100%) ไปยัง LED3 Blue ผ่าน aic_gpio_pwm_set_brightness()

  5. Read-Only Slider: ทำ slider ให้แสดงค่าจาก hardware โดยไม่รับ touch input

  6. 3-Panel Navigation: Custom panel (Scope/Gen/FFT) แทน TabView เพื่อพื้นที่ chart สูงสุด

  7. Real-Time Signal Processing: FFT analysis ที่ใช้ค่าความถี่จาก POTEN จริง

How? - จะทำอย่างไร

  1. Initialize hardware: aic_scope_init(), aic_fft_init(), aic_gpio_init(), aic_gpio_pwm_init(), aic_sensors_init()

  2. สร้าง 3 panels (Scope/Gen/FFT) พร้อม navigation bar ด้านซ้าย

  3. ใน timer callback (33ms) อ่านค่า POTEN และ map เป็น parameter ตาม active panel

  4. Scope Tab: POTEN ควบคุม frequency, แสดง waveform + measurements

  5. Gen Tab: POTEN ควบคุม duty cycle, output switch เปิด/ปิด LED3 PWM

  6. FFT Tab: วิเคราะห์ spectrum ของ waveform ที่ POTEN กำหนดความถี่


2. หลักการทำงานและ Flowchart

2.1 Hardware Connection Diagram


3. ฟังก์ชันสำคัญ

3.1 Hardware APIs

Function
Description

aic_gpio_init()

Initialize GPIO subsystem

aic_gpio_pwm_init(AIC_LED_BLUE)

Initialize PWM on LED3 Blue (P16_5)

aic_sensors_init()

Initialize sensor/ADC subsystem

aic_adc_read_percent(AIC_ADC_CH0)

Read potentiometer value (0-100%)

aic_gpio_pwm_set_brightness(AIC_LED_BLUE, pct)

Set LED3 brightness (0-100%)

aic_gpio_pwm_get_brightness(AIC_LED_BLUE)

Get current LED3 brightness

3.2 Scope APIs

Function
Description

aic_scope_init()

Initialize scope subsystem

aic_fft_init(256)

Initialize FFT with 256-point size

aic_scope_generate_wave(buf, count, &config)

Generate waveform samples

aic_fft_calculate(input, output)

Calculate FFT spectrum

aic_fft_dominant_frequency(fft, bins, Fs)

Find peak frequency from FFT

aic_signal_peak_to_peak(buf, count)

Calculate Vpp (raw)

aic_signal_rms(buf, count)

Calculate RMS (raw)

3.3 LVGL Read-Only Slider Pattern

Technique
Code

Remove clickable flag

lv_obj_remove_flag(slider, LV_OBJ_FLAG_CLICKABLE)

Set value from code

lv_slider_set_value(slider, val, LV_ANIM_OFF)

Purpose

Slider reflects hardware input, user cannot drag


4. Code เต็ม

4.1 Constants and Configuration

4.2 Global Variables (สรุปสำคัญ)

4.3 LED PWM Output - Phase Accumulator

4.4 Timer Callback - Hardware Input Processing

4.5 Event Callbacks

4.6 Panel Creation Functions

4.7 Main Function


5. องค์ความรู้และเทคนิค

5.1 CRITICAL: Read-Only Slider Synced with Hardware

5.2 Phase Accumulator - DDS Pattern

5.3 Hardware Scope vs Simulation Scope

5.4 ADC-to-Parameter Mapping Patterns

5.5 Touch Keep-Alive Pattern


6. แบบฝึกหัด

Exercise 1: ADC Smoothing Filter

โจทย์: เพิ่ม Exponential Moving Average (EMA) filter ให้กับค่า ADC เพื่อลด noise:

  • เก็บค่าก่อนหน้า prev_pot (static variable)

  • คำนวณ: filtered = (alpha * raw) + ((1 - alpha) * prev_pot) โดย alpha = 0.3

  • ใช้ integer math: filtered = (3 * raw + 7 * prev) / 10

  • แสดง "RAW: XX% FLT: XX%" บน UI เทียบค่า raw vs filtered

  • สังเกตว่า waveform ปรับ frequency ได้ smooth ขึ้นเมื่อหมุน POTEN เร็ว

Exercise 2: Dual POTEN Mode

โจทย์: เพิ่ม Mode Switch ให้ POTEN ควบคุมได้ 2 แบบใน Scope Tab:

  • เพิ่ม Switch "FREQ/AMP" สำหรับเลือกว่า POTEN ควบคุม Frequency หรือ Amplitude

  • Mode FREQ: เหมือนเดิม (100-5000 Hz)

  • Mode AMP: POTEN ควบคุม amplitude (10-100%)

  • แสดง mode ปัจจุบันบน UI: "Mode: FREQ" หรือ "Mode: AMP"

  • เมื่อเปลี่ยน mode ค่าที่ไม่ได้ควบคุมจะ lock ไว้ที่ค่าล่าสุด

  • ประยุกต์ใช้: Oscilloscope แบบ knob เดียวที่ปรับได้หลาย parameter

Last updated

Was this helpful?