แผงวงจรพ่วง (Peripheral Board)

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

เราประกอบแผงวงจรนี้เพื่อใช้เป็นวงจรทดสอบและเรียนรู้การใช้งานไมโครคอนโทรลเลอร์ โดยต่อผ่านสายแพเข้ากับ JP2 (พอร์ท C) ของแผงวงจรหลัก วงจรพ่วงประกอบไปด้วยวงจรย่อยสามวงจร ได้แก่ (1) วงจรแสดงผล LED สามสี (2) วงจรสวิตช์อินพุท และ (3) วงจรวัดแสง

Peri-schem.png

วงจรแสดงผล LED สามสี

เป็นการเชื่อมแต่ละสัญญาณของ PC0..PC2 เข้ากับขาแอโนด (A) ของ LED และต่อด้านแคโทด (K) ผ่านตัวต้านทานลงสู่กราวนด์ ดังนั้นการใช้งานจึงต้องตั้งค่าในรีจีสเตอร์ DDRC ให้ขาทั้งสามทำหน้าที่เป็นเอาท์พุท และส่งลอจิก 1 มายังแต่ละขาผ่านทางรีจีสเตอร์ PORTC เพื่อให้หลอด LED ติด

ตัวอย่างโปรแกรมด้านล่างเป็นการตั้งค่าให้ PC0..PC2 เป็นเอาท์พุท และสั่งให้ขา PC0 และ PC1 มีลอจิกเป็น 1 และ PC2 มีลอจิก 0 โดยที่ไม่กระทบกับค่าในบิตอื่น ๆ ของรีจีสเตอร์ สังเกตว่าเราอาศัยคำสั่งประเภท read-modify-write ซึ่งได้แก่ |= และ &=

DDRC  |= 0b00000111;    // ให้ PC0-PC2 เป็นเอาท์พุท บิตอื่นไม่เปลี่ยน
PORTC |= 0b00000011;    // ให้ PC0,PC1 มีลอจิก 1 บิตอื่นไม่เปลี่ยน
PORTC &= ~(0b00000100); // ให้ PC2 มีลอจิก 0 บิตอื่นไม่เปลี่ยน

หมายเหตุ: คำสั่ง a |= b มีการทำงานเทียบเท่ากับ a = a|b

วงจรสวิตช์อินพุท

วงจรนี้ทำหน้าที่เป็นลอจิกอินพุทโดยต่อสวิตช์แบบกดติด-ปล่อยดับเข้ากับขา PC3 และต่ออีกด้านหนึ่งลงกราวนด์โดยตรง นั่นคือหากสวิตช์โดนกดจะทำให้ขา PC3 มีศักย์เป็นกราวนด์

การใช้งานเพื่อให้อ่านค่าลอจิกเข้ามาอย่างถูกต้องต้องดำเนินการดังนี้

  • ตั้งค่าบิตที่ 3 ของรีจีสเตอร์ DDRC ให้เป็น 0 เพื่อกำหนดให้ PC3 เป็นอินพุท
  • ตั้งค่าบิตที่ 3 ของรีจีสเตอร์ PORTC ให้เป็น 1 เพื่อเปิดใช้งาน pull-up resistor ในวงจร I/O ของไมโครคอนโทรลเลอร์ ซึ่งเสมือนว่าเป็นการต่อขา PC3 ผ่านตัวต้านทานหนึ่งตัวเข้ากับ VCC อันจะทำให้ศักย์ของขา PC3 มีค่าเป็น 5V (ลอจิก 1) หากขาถูกปล่อยลอย
  • อ่านสถานะลอจิกของขา PC3 ผ่านทางบิตที่ 3 ของรีจีสเตอร์ PINC

ตัวอย่างโปรแกรม

DDRC  &= ~(0b00001000);  // ให้ PC3 เป็นอินพุท บิตอื่นไม่เปลี่ยนแปลง
PORTC |= 0b00001000;     // เปิดใช้ pull-up resister ที่ขา PC3
if (PINC & ~(0b00001000))
    // สวิตช์ถูกกด
else
    // สวิตช์ไม่ถูกกด

วงจรวัดแสง

วงจรส่วนนี้อาศัยอุปกรณ์ที่เรียกว่า Light Dependent Resister (LDR) หรือเรียกอีกอย่างว่า photoresistor ซึ่งเป็นตัวต้านทานที่มีค่าผันแปรตามแสง โดยทั่วไปแล้ว LDR มักจะให้ค่าความต้านทานต่ำ (เข้าใกล้ค่าศูนย์) เมื่อแสงมาก และให้ค่าความต้านทานสูง (เข้าใกล้ค่าอนันต์) เมื่อแสงน้อย

เนื่องจากไมโครคอนโทรลเลอร์ไม่สามารถอ่านค่าความต้านทานได้โดยตรง แต่สามารถวัดค่าแรงดันที่เปลี่ยนแปลงที่ขาอินพุทได้ ดังนั้นเราจึงต้องนำเอาอุปกรณ์ LDR มาต่อเป็นวงจรที่ให้ค่าแรงดันผันแปรไปตามแสง จากรูป (3) ด้านบนเรานำเอา LDR มาต่ออนุกรมกับ R4 และจ่ายไฟเลี้ยงคร่อมอุปกรณ์ทั้งคู่ สมมติว่า LDR1 ให้ค่าความต้านทานเป็น เราสามารถคำนวณหาความต่างศักย์ที่สัญญาณ PC4 จากกฎการแบ่งแรงดันได้ดังนี้

โปรแกรมทดสอบแผงวงจรพ่วง

เพื่อตรวจสอบว่าแผงวงจรพ่วงที่ทำขึ้นมาใช้งานได้ถูกต้อง โหลดโปรแกรม testperi.hex (ซอร์สโค้ด) และใช้คำสั่ง avrdude เพื่อเขียนแฟลชบนบอร์ด หากวงจรไม่มีความผิดพลาด โปรแกรมควรมีพฤติกรรมดังนี้

  • LED 3 ดวงบนบอร์ดพ่วงทำหน้าที่เป็นตัววัดแสง โดยจะติดทีละดวงเท่านั้น สีแดงจะติดเมื่อแสงมืด และสีเขียวจะติดเมื่อไฟสว่าง ส่วนสีเหลืองจะติดเมื่อแสงปานกลาง
  • เมื่อกดและปล่อยสวิตช์บนบอร์ดพ่วง (ไม่ใช่สวิตช์รีเซ็ตบนบอร์ดหลัก) LED สีเขียวบนบอร์ดหลักจะติดและดับสลับกันไป

บทความที่เกี่ยวข้อง