แนะนำตัวและของที่ใช้
เพราะพี่ค่อนข้างสนใจเรื่อง DAC ว่ามันทำงานยังไงกันแน่ เลยอยากลองลงมือสร้างระบบง่ายๆ ขึ้นมาดูสักอัน! DAC คือระบบที่แปลงสัญญาณดิจิทัลเป็นสัญญาณอนาล็อก ถ้าน้องอยากรู้ลึกกว่านี้ว่ามันคืออะไร เอาไปทำอะไรได้บ้าง พี่เคยเขียนอธิบายไว้ละเอียดเลย (แต่ลิงก์หายไปแล้ววว ไว้หามาให้ใหม่นะ!) คราวนี้เราจะมาออกแบบระบบแปลงดิจิทัลเป็นอนาล็อกด้วยการสร้างวงจรที่เรียกว่า R-2R ladder วงจรนี้จะแปลงเอาต์พุตแรงดันสูง/ต่ำ (น้ำหนักแบบไบนารี – โดย 1 คือ 5V และ 0 คือ 0V) ให้เป็นแรงดันอนาล็อก (เช่น 4.6777V) หลักการมันอาศัยการวิเคราะห์วงจรและการแบ่งแรงดันนั่นแหละ
รู้จักกับ Arduino UNO
Arduino คือแพลตฟอร์มฮาร์ดแวร์โอเพนซอร์ส ที่เราสามารถโปรแกรมไมโครคอนโทรลเลอร์บอร์ดให้อ่านอินพุต เปิดไฟ LED ตอนกดปุ่ม หรือแม้แต่ขับมอเตอร์ให้หุ่นยนต์ได้! ตัวไมโครคอนโทรลเลอร์จะอยู่บนบอร์ด Arduino แล้วเราก็ส่งชุดคำสั่งให้มันทำงานผ่านภาษาโปรแกรม Arduino และสภาพแวดล้อมการพัฒนา (IDE) หรือตัว Web Editor ของมัน พี่最近ติด Arduino มากเลยนะ เพราะมันเปิดโลกโปรเจกต์ได้เยอะแยะ แถมใช้ง่าย เรียนไวอีก! โปรเจกต์นี้ถือเป็นโปรเจกต์ที่สองของพี่กับบอร์ดนี้ ก็ยังถือว่าเป็น มือใหม่หัดขับ อยู่ แต่พี่รักมันมากวว!!! บอร์ดที่พี่ใช้ทำงานนี้ชื่อว่า Arduino UNO นั่นเอง
ส่วนสำคัญส่วนนึงของบอร์ดนี้ก็คือ Digital Pins ไงล่ะ พินพวกนี้สามารถตั้งค่าเป็นเอาต์พุตหรืออินพุตก็ได้ ถ้าเป็นเอาต์พุต มันจะทำหน้าที่เป็นแหล่งจ่ายไฟ/แรงดัน แต่ถ้าเป็นอินพุต มันจะรับสัญญาณเข้ามาเป็นดิจิทัลอินพุต! เราจะใช้พินพวกนี้สร้างตัวแปลงดิจิทัลเป็นอนาล็อกของเรา เพราะเราต้องการ ดิจิทัลอินพุต เพื่อแปลงมันเป็นสัญญาณอนาล็อกต่อเนื่องไงล่ะ!!อีกส่วนสำคัญของบอร์ด UNO คือไฟ LED TX/RX พวกนี้จะบอกว่า UNO กำลังส่ง (TX) หรือรับ (RX) ข้อมูลอยู่ ไฟ TX จะกระพริบตอนส่งข้อมูล ส่วน RX จะกระพริบตอนรับข้อมูล ง่ายๆ แบบนี้เลย
หลักการทำงาน
รูปวงจรด้านบนคือวงจร R-2R ladder โครงสร้างมันดูเหมือนบันไดจริงๆ นะ; ตัวต้านทาน R 3 ตัววางในแนวนอน สลับกับตัวต้านทาน 2R 4 ตัวที่วางในแนวตั้ง วงกลมที่ไฮไลต์สีไว้คือตัวต้านทานสองตัวที่ต่อขนานกัน การต่อตัวต้านทาน 2R สองตัวแบบขนานจะให้ค่าตัวต้านทานสมมูลเป็น R เพราะจากสูตรตัวต้านทานขนาน: 1/2R + 1/2R = 2/2R, กลับเศษส่วนได้ 2R/2 = R
ด้วยวงจรนี้ เราสามารถลดรูปตัวต้านทานในวงกลมสีฟ้าให้เหลือแค่ R ตัวเดียวได้ จากนั้นก็บวกตัวต้านทาน R สองตัวที่ต่ออนุกรมกัน ค่าความต้านทานสมมูลที่ได้ก็จะกลับมาเป็น 2R เหมือนเดิม (เหมือนโครงสร้างเดิมเป๊ะ)
- การคำนวณแบบนี้จะค่อยๆ เกิดขึ้นซ้ำๆ (เห็นได้จากวงกลมไฮไลต์ที่ปรากฏวนไปเรื่อยๆ) จนในที่สุดเราจะเหลือตัวต้านทานเอาต์พุตเป็น R โดยมี Vout เป็นแรงดันเอาต์พุต (ซึ่งก็คือสิ่งที่เราต้องการ) นี่คือจุดที่พี่บอกว่ามันคำนวณง่าย – ค่าความต้านทานเอาต์พุตจะ永远是 R ไม่ว่าจะมีกี่บิตก็ตาม นั่นคือเหตุผลที่การจัดวางแบบบันไดนี้มีประสิทธิภาพมาก
- พี่เลือกทำ DAC แบบ 4-bit (เหมือนในรูปด้านบน) หมายความว่าระบบของเราจะรับข้อมูล 4 บิต (น้ำหนักไบนารี) ผ่านพินดิจิทัลอินพุต 4 พิน (D2, D3, D4, D5) บนบอร์ด จากนั้นระบบ DAC จะส่งแรงดันอนาล็อกออกมา และเราจะส่งค่านี้ไปยังพินอนาล็อก (A0) ของบอร์ด พี่ใช้ตัวต้านทาน 1Kohm สำหรับ R และ 2Kohm สำหรับ 2R จัดไปวัยรุ่น!
ฟิสิกส์ของกำแพงดิจิทัล: 4-Bit DAC
Arduino Uno นั้นไม่มีเอาต์พุตอนาล็อกแท้ๆ หรอกนะ `analogWrite()` ไม่ได้เปลี่ยนแรงดันที่ขาเป็น 3V ได้โดยเวทมนตร์ มันแค่สั่งให้ขากระพริบ 5V เปิด-ปิดเร็วสุดๆ (PWM) ซึ่งใช้กับวงจรเสียงหรือวิทยุที่ไวต่อสัญญาณไม่ได้เลย! โครงการ 4-Bit Digital to Analog Converter (DAC) นี้จะบังคับให้คุณสร้างวงจร "อนาล็อก" ขึ้นมาทั้งหมดจากภายนอก! คุณจะใช้แถวลำดับไบนารี C++ ดิบๆ เพื่อดันแรงดันไฟฟ้าผ่านกำแพงตัวต้านทานที่บัดกรีเองเป็นทอดๆ
การสร้างโทโพโลยี R-2R Ladder
DAC ทำงานโดยการแบ่งแรงดันไฟฟ้าทางกายภาพ
- ระบบ 4-bit หมายความว่าเราต้องใช้ขา Digital ของ Arduino เป๊ะๆ 4 ขา (เช่น `D8, D9, D10, D11` หรือ `D2, D3, D4, D5` ตามที่ใช้ในวงจรต้นแบบ)
- เราจัดเรียงตัวต้านทานเป็นสายโซ่ทางคณิตศาสตร์ขนาดใหญ่บนเบรดบอร์ด
- คุณต้องการตัวต้านทานสองค่าเท่านั้น (`R` และ `2R`): เช่น 1K โอห์ม และ 2K โอห์ม
- ตัวต้านทานจะถูกจัดเรียงเป็นรูป "บันได" ตามแผนภาพวงจรด้านบน กฎฟิสิกส์ใหญ่ๆ ที่ใช้คือ Voltage Divider ขาที่มีน้ำหนักมากสุด (MSB) จะให้แรงดัน `2.5V` ไปที่เอาต์พุต ขาถัดมาให้ `1.25V`, แล้วก็ `0.625V` ไปเรื่อยๆ
สังเคราะห์เมทริกซ์เอาต์พุตดิบ
โปรแกรมเมอร์ควบคุมแรงดันได้ 16 ขั้นตอนเป๊ะๆ (จาก `0b0000` ถึง `0b1111`)!
- ถ้า Arduino เขียน: `0000` = เอาต์พุตจะเป็น `0.0V` เรียบสนิท
- ถ้า Arduino เขียน: `1000` (เฉพาะขาที่มีน้ำหนักมากสุดเป็น HIGH) = เอาต์พุตจะเป็น `2.5V` พอดี
- ถ้า Arduino เขียน: `1111` (ทั้ง 4 ขา HIGH!) = เอาต์พุตจะพุ่งสูงสุดที่ `5.0V`
- กับดักการทำงาน: คุณใช้คำสั่ง `digitalWrite()` ช้าๆ สี่ครั้งไม่ได้ มันจะสร้างสัญญาณไฟฟ้าที่ขรุขระ น่ากลัว ขณะที่โปรเซสเซอร์สั่งงานขาไปทีละขา
- คุณต้องใช้การจัดการบิตแบบดิบ (raw bitmasking) กับรีจิสเตอร์ระดับแกน ATmega! เช่น: `PORTB = (PORTB & 0xF0) | 0x05;` (คำสั่งนี้จะสั่งให้ขาทั้งหมดแสดงค่าเลขฐานสิบ `5` อย่างสมบูรณ์แบบผ่านตาข่ายตัวต้านทานทั้งหมดในสัญญาณนาฬิกาเดียว!)
สิ่งที่ต้องมีสำหรับซินธิไซเซอร์อิเล็กทรอนิกส์
- Arduino Uno/Nano (สำหรับแฮกรีจิสเตอร์ฮาร์ดแวร์ `PORTB` โดยตรง!)
- ตัวต้านทานความแม่นยำสูงอย่างน้อยแปดตัว! (เช่น 10k สี่ตัว และ 20k สี่ตัว ฟิสิกส์จะล้มเหลวราบคาบถ้าค่าความคลาดเคลื่อนมันบาน +/- 10%!)
- มัลติมิเตอร์ดิจิทัล (สำคัญมากๆ สำหรับวัดแรงดันที่ปลายสายโดยตรง เพื่อพิสูจน์ว่าคุณสร้างสัญญาณ `2.5V` สมบูรณ์แบบได้โดยไม่ใช้ PWM!)
ขั้นตอนการทำ
จริงๆ แล้วมีหลายวิธีในการสร้างตัวแปลงดิจิทัลเป็นอนาล็อก แต่การสร้างวงจรที่เรียกว่า R-2R ladder เป็นวิธีที่นิยมและมีประสิทธิภาพ วงจร R-2R Ladder คือการจัดเรียงตัวต้านทานในรูปแบบ "เหมือนบันได" ซึ่งรับน้ำหนักแบบไบนารี (บิต) เป็นอินพุตและแปลงเป็นแรงดันอนาล็อก การใช้ R-2R ladder สำหรับ DAC มีข้อดีหลายอย่าง
ขั้นตอนการทำอยู่ในวิดีโอนี้เลย!