Waveform Generator

Lab 1: Waveform Generator

Part 3 - Oscilloscope & Signal Processing


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

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

  • Signal Fundamentals: สัญญาณพื้นฐาน (Sine, Square, Triangle, Sawtooth) เป็นรากฐานของวิศวกรรมไฟฟ้าทุกสาขา ไม่ว่าจะเป็น Power Systems, Communications หรือ Control Systems

  • DSP Foundation: การสร้างและแสดงผล Waveform เป็นก้าวแรกสู่ Digital Signal Processing ที่ใช้ในงานวิเคราะห์ Power Quality, Audio Processing และ Vibration Analysis

  • Testing & Calibration: Function Generator เป็นเครื่องมือพื้นฐานในห้อง Lab สำหรับทดสอบวงจร การสร้างได้ด้วยซอฟต์แวร์ช่วยลดต้นทุนและเพิ่มความยืดหยุ่น

  • EE Application: ใน Power Systems ใช้สร้างสัญญาณจำลอง 50 Hz AC, ใน Communications ใช้สร้าง Carrier Wave, ใน Control ใช้สร้าง Test Signal

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

  1. Waveform Mathematics: สูตรคณิตศาสตร์ของ Square, Sine, Triangle, Sawtooth

  2. Chart as Oscilloscope: ใช้ lv_chart แสดง waveform 200+ จุด แบบ real-time

  3. User Controls: Dropdown เลือกชนิด waveform, Slider ปรับ frequency และ amplitude

  4. Buffer Management: จัดการ sample buffer สำหรับ waveform generation

  5. Mapping Technique: แปลงค่าจาก signal domain (-1000..+1000) เป็น display domain (0..100)

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

  1. สร้าง Chart แสดง waveform ด้วย lv_chart_create() กำหนด 200 จุด

  2. เขียนฟังก์ชัน generate สำหรับ waveform แต่ละชนิด

  3. เพิ่ม Dropdown เลือกประเภท wave

  4. เพิ่ม Slider สำหรับ frequency (10-1000 Hz) และ amplitude (100-1000)

  5. เชื่อม callbacks เพื่ออัพเดท waveform ตามการเปลี่ยนแปลง


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

2.1 Waveform Generation Functions

Function
Description
สูตร

generate_sine()

สร้างคลื่นไซน์

y = A * sin(2PIf*n/Fs)

generate_square()

สร้างคลื่นสี่เหลี่ยม

y = A * sign(sin(2PIf*n/Fs))

generate_triangle()

สร้างคลื่นสามเหลี่ยม

y = A * (4*

generate_sawtooth()

สร้างคลื่นฟันเลื่อย

y = A * (2*phase - 1)

2.2 LVGL Chart API

Function
Description

lv_chart_create(parent)

สร้าง chart widget

lv_chart_set_type(chart, LV_CHART_TYPE_LINE)

กำหนดเป็น line chart

lv_chart_set_point_count(chart, 200)

จำนวนจุดที่แสดง

lv_chart_set_range(chart, axis, min, max)

กำหนดช่วงแกน Y

lv_chart_add_series(chart, color, axis)

เพิ่ม data series

lv_chart_set_value_by_id(chart, ser, id, val)

กำหนดค่าจุด

lv_chart_refresh(chart)

อัพเดทการแสดงผล

lv_chart_set_div_line_count(chart, h, v)

เส้น grid

2.3 Waveform Type Enum


3. Code เต็ม

3.1 Constants and Global Variables

3.2 Waveform Generation Functions

3.3 Waveform Update and Chart Display

3.4 Event Callbacks

3.5 Main Function


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

4.1 Nyquist Theorem - ทฤษฎีไนควิสต์

4.2 Cycles per Display

4.3 Amplitude Mapping

4.4 Chart Performance Tips


5. แบบฝึกหัด

Exercise 1: Noise Injection (เพิ่ม Noise ให้สัญญาณ)

โจทย์: เพิ่ม Slider สำหรับ Noise Level (0-500) ที่จะบวก random noise เข้าไปในสัญญาณ

  • เพิ่ม slider ปรับระดับ noise (0 = clean, 500 = maximum noise)

  • ใช้ rand() สร้าง random values แล้วบวกเข้าไปหลัง generate

  • แสดงค่า SNR (Signal-to-Noise Ratio) โดยประมาณ

คำใบ้:

Exercise 2: Dual-Channel Display (แสดง 2 ช่องสัญญาณ)

โจทย์: สร้างการแสดงผล 2 ช่องสัญญาณบน chart เดียวกัน (เหมือน oscilloscope 2 channels)

  • Channel 1 (สีเขียว): waveform ที่เลือกจาก dropdown

  • Channel 2 (สีเหลือง): sine wave ที่ความถี่ 2 เท่าของ Channel 1

  • ใช้ lv_chart_add_series() เพิ่ม series ที่สอง

  • เพิ่มปุ่ม toggle เปิด/ปิด Channel 2

คำใบ้:


6. References


Last updated

Was this helpful?