สถาปัตยกรรม MCU
UAT 204 ไมโครคอนโทรลเลอร์และระบบสมองกลฝังตัว
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- อธิบายส่วนประกอบของไมโครคอนโทรลเลอร์ ได้แก่ CPU หน่วยความจำ บัส และอุปกรณ์รอบข้าง
- เปรียบเทียบไมโครคอนโทรลเลอร์ในตัวควบคุมการบิน Pixhawk 6X กับบอร์ด Pico 2 และ ESP32-S3
- คำนวณความละเอียดของ ADC และแปลงค่าดิจิทัลกลับเป็นแรงดัน
- ออกแบบวงจรแบ่งแรงดันเพื่อวัดแรงดันแบตเตอรี่ด้วย ADC
ทำไมต้องรู้
ในโดรนหนึ่งลำมีคอมพิวเตอร์ขนาดเล็กอยู่หลายตัว ตัวควบคุมการบิน ESC ทุกตัว GPS และแม้แต่แบตเตอรี่อัจฉริยะบางรุ่นก็มี ไมโครคอนโทรลเลอร์ (MCU) ของตัวเอง MCU คือคอมพิวเตอร์ทั้งเครื่องที่ย่ออยู่ในชิปเดียว ทั้ง CPU หน่วยความจำ และวงจรเชื่อมต่ออุปกรณ์ ถูกออกแบบให้ทำงานเฉพาะอย่างได้แน่นอนตามเวลา ใช้ไฟน้อย และราคาถูก ต่างจากคอมพิวเตอร์ทั่วไปที่ทำได้หลายอย่างแต่ไม่รับประกันเวลา
ทั้งวิชาใช้กรณีสมมติเดียว: สร้างโมดูลเซนเซอร์เสริมสำหรับโดรน บนบอร์ด Raspberry Pi Pico 2 ที่อ่านเซนเซอร์ วัดแรงดัน สั่ง servo และส่งข้อมูลให้ตัวควบคุมการบิน โค้ด Python ของทุกโมดูลดาวน์โหลดได้ที่ /downloads/uat-204/
ภายในไมโครคอนโทรลเลอร์
- แกน CPU ประมวลผลคำสั่ง MCU ในงานโดรนส่วนมากใช้แกนตระกูล Arm Cortex-M
- Flash เก็บโปรแกรมและค่าคงที่ ข้อมูลไม่หายเมื่อปิดไฟ
- SRAM เก็บตัวแปรระหว่างทำงาน หายเมื่อปิดไฟ
- บัส เส้นทางข้อมูลเชื่อมทุกส่วน
- อุปกรณ์รอบข้าง (peripheral) วงจรในชิปที่ทำงานเฉพาะ เช่น GPIO (ขาเข้าออกดิจิทัล) timer ADC (แปลงแอนะล็อกเป็นดิจิทัล) และวงจรสื่อสาร ทำงานไปพร้อมกับ CPU ได้
MCU ในงานโดรน
| บอร์ด | MCU | จุดเด่น |
|---|---|---|
| Pixhawk 6X (ตัวควบคุมการบิน) | STM32H753 Cortex-M7 480 MHz, flash 2 MB, RAM 1 MB และตัวประมวลผล IO STM32F100 | แยกงานเอาต์พุตไปตัวประมวลผลที่สอง |
| Raspberry Pi Pico 2 (ห้องปฏิบัติการ) | RP2350 Cortex-M33 สองแกน (หรือ RISC-V) 150 MHz, SRAM 520 KB | ราคาถูก ADC 12 บิต PWM 16 ช่อง |
| ESP32-S3 | Xtensa LX7 สองแกน 240 MHz, SRAM 512 KB | มี Wi-Fi และ Bluetooth ในตัว |
ตัวเลขทั้งหมดมาจากเอกสารของ PX4 Raspberry Pi และ Espressif ตัวควบคุมการบินใช้ MCU ที่เร็วกว่าและมีหน่วยความจำมากกว่า เพราะต้องประมาณสถานะและควบคุมท่าทางหลายร้อยครั้งต่อวินาที
ADC: จากแรงดันเป็นตัวเลข
ADC (analog-to-digital converter) แปลงแรงดันเป็นจำนวนเต็ม ADC ขนาด บิตแบ่งช่วง 0 ถึง เป็น ขั้น แต่ละขั้นเรียกว่า LSB RP2350 มี ADC 12 บิต จึงมี 4,096 ขั้น
ขา ADC รับแรงดันได้ไม่เกินแรงดันอ้างอิงของชิป (ประมาณ 3.3 V) แต่แบตเตอรี่ 6S มีแรงดันถึง 25.2 V จึงต้องลดแรงดันด้วย วงจรแบ่งแรงดัน ก่อน
ตัวอย่างที่ 1 วัดแรงดันแบตเตอรี่ 6S ด้วย ADC 12 บิต
ตัวต้านทาน kΩ และ kΩ แรงดันอ้างอิง 3.3 V
vref, bits = 3.3, 12
lsb = vref / 2 ** bits
r1, r2 = 100_000, 10_000
ratio = r2 / (r1 + r2)
print(f"LSB = {lsb * 1000:.3f} mV at the pin = {lsb / ratio * 1000:.2f} mV of battery voltage")
for v_batt in (25.2, 22.2, 19.8):
v_pin = v_batt * ratio
code = round(v_pin / lsb)
print(f"battery {v_batt:5.1f} V -> pin {v_pin:.3f} V -> code {code:4d} -> read back {code * lsb / ratio:.3f} V")
LSB = 0.806 mV at the pin = 8.86 mV of battery voltage
battery 25.2 V -> pin 2.291 V -> code 2844 -> read back 25.204 V
battery 22.2 V -> pin 2.018 V -> code 2505 -> read back 22.200 V
battery 19.8 V -> pin 1.800 V -> code 2234 -> read back 19.798 V
แบตเตอรี่เต็ม 25.2 V ทำให้ขาได้ประมาณ 2.29 V ต่ำกว่า 3.3 V จึงปลอดภัย แต่ละขั้นของ ADC เท่ากับประมาณ 8.9 mV ของแรงดันแบตเตอรี่ ความแม่นยำจริงยังขึ้นกับความคลาดเคลื่อนของตัวต้านทาน สัญญาณรบกวน และความแม่นยำของแรงดันอ้างอิง จึงต้องสอบเทียบกับมัลติมิเตอร์เหมือนใน UAT 321
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: รู้จักบอร์ด Pico 2
- อ่าน pinout ของ Pico 2 ระบุขา GPIO ขา ADC ขาไฟ 3.3 V และกราวด์
- ติดตั้งเครื่องมือเขียนโปรแกรม (MicroPython หรือ C/C++ SDK ตามที่อาจารย์กำหนด) แล้วเขียนโปรแกรมกะพริบ LED
- ต่อวงจรแบ่งแรงดันบนเบรดบอร์ด ใช้แหล่งจ่ายปรับได้แทนแบตเตอรี่ (ไม่เกินค่าที่คำนวณว่าปลอดภัย) อ่านค่า ADC ที่แรงดันสามค่า
- เทียบค่าที่อ่านกับโค้ดตัวอย่างที่ 1 และกับมัลติมิเตอร์ หาค่าคูณสอบเทียบ
- เปิดหน้า Pixhawk 6X ในเอกสาร PX4 ระบุว่าเซนเซอร์และพอร์ตแต่ละชนิดต่อกับตัวประมวลผลใด
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ต่อแรงดันเกิน 3.3 V เข้าขา ADC หรือ GPIO ชิปอาจเสียทันที
- ลืมต่อกราวด์ร่วม ระหว่างวงจรวัดกับ MCU
- เชื่อค่า ADC โดยไม่สอบเทียบ
- เลือก MCU จากความเร็ว CPU อย่างเดียว โดยไม่ดูอุปกรณ์รอบข้างที่ต้องใช้
- คิดว่าข้อมูลใน SRAM ยังอยู่หลังปิดไฟ
สรุป
- MCU รวม CPU หน่วยความจำ บัส และอุปกรณ์รอบข้างไว้ในชิปเดียว ทำงานเฉพาะอย่างได้แน่นอนตามเวลา
- Pixhawk 6X ใช้ STM32H753 เป็นตัวประมวลผลหลักและ STM32F100 เป็นตัวประมวลผล IO
- ADC บิตแบ่งช่วงแรงดันเป็น ขั้น
- วัดแรงดันสูงด้วยวงจรแบ่งแรงดัน และต้องสอบเทียบ
แบบฝึกตรวจความเข้าใจ
- ADC 10 บิต แรงดันอ้างอิง 3.3 V มีความละเอียดกี่ mV
- วงจรแบ่งแรงดัน kΩ, kΩ แรงดันเข้า 16.8 V ขาได้กี่ V
- ADC 12 บิตอ่านได้ 2048 แรงดันอ้างอิง 3.3 V แรงดันที่ขาเท่าใด
- ข้อมูลใดหายเมื่อปิดไฟ ระหว่าง Flash กับ SRAM
- ตัวประมวลผลหลักของ Pixhawk 6X ใช้ MCU รุ่นใด
เฉลย
- mV
- V
- V
- SRAM
- STM32H753 (Cortex-M7 480 MHz)
สรุปสูตรสำคัญ
| ความละเอียดของ ADC | |
| วงจรแบ่งแรงดัน |
แหล่งอ้างอิงหลัก
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz