การใช้งาน Digital Input / Output

Download all demo files: DigitIO.7z

โดยปกติ การใช้งาน Microcontroller จำเป็นต้องมีการรับส่งข้อมูลระหว่างอุปกรณ์ภายนอกหรือผู้ใช้งานกับ Microcontroller ดังรูป 1-1 การรับส่งข้อมูลสามารถทำได้โดยใช้ Input/Output (I/O) โดย Input มีหน้าที่รับข้อมูลจากโลกภายนอกเพื่อประมวลผลหรือเก็บไว้ในในหน่วยความจำ และ Output มีหน้าที่ส่งข้อมูลออกสู่โลกภายนอก โดยข้อมูลนั้นอาจจะมาจากการประมวลผลหรือหน่วยความจำโดยตรง

รูป 1-1 การรับ-ส่งข้อมูลระหว่างโลกภายนอกกับ Microcontroller

รูป 1-1 การรับ-ส่งข้อมูลระหว่างโลกภายนอกกับ Microcontroller

Digital I/O เป็นรูปแบบหนึ่งของการรับส่งสัญญาณที่ได้เป็น 2 สถานะในเชิงตรรกะ ได้แก่

  • สถานะ Logic LOW แทนด้วยเลข 0
  • สถานะ Logic HIGH แทนด้วยเลข 1

ดังนั้น โดยทั่วไป Digital I/O จึงใช้รับส่งข้อมูลกับอุปกรณ์ที่สัญญาณมีเพียง 2 สถานะ เช่น Digital Output นำไปใช้ควบคุมการเปิด-ปิดอุปกรณ์จำพวก Relay หรือหลอดไฟ LED ว่าจะเปิดหรือปิด ขณะที่ Digital Input ใช้อ่านข้อมูลจากอุปกรณ์เช่น  สวิตช์ หรือปุ่มกด ว่าอยู่ในสถานะเปิดหรือปิด เป็นต้น (I/O อีกประเภทหนึ่งคือ Analog I/O)

ในทางอิเล็กทรอนิกส์ จะใช้ระดับแรงดันไฟเป็นตัวกำหนดสถานะของสัญญาณว่าเป็นสถานะ HIGH หรือ LOW กล่าวคือ เมื่อระดับแรงดันไฟมากกว่าระดับที่กำหนดจะเป็นสถานะ HIGH และเมื่อระดับแรงดันไฟน้อยกว่าระดับที่กำหนดจะเป็นสถานะ LOW รูป 1-2 แสดงระดับของขาอินพุตเอาน์พุตของ STM32F4 [1, p.110]

สำหรับขาพอร์ตที่ใช้เทคโนโลยี TTL

  • เป็นสถานะ LOW เมื่อระดับแรงดันต่ำกว่า 0.8 V
  • เป็นสถานะ HIGH เมื่อระดับแรงดันต่ำกว่า 2.0V

สำหรับขาพอร์ตที่ใช้เทคโนโลยี CMOS การกำหนดสถานะจะขึ้นอยู่กับระดับแรงดันของไฟเลี้ยง (VDD) เช่น เมื่อไฟเลี้ยง VDD = 3.3V

  • เป็นสถานะ LOW เมื่อระดับแรงดันต่ำว่า 0.99V (จาก 0.33×3.3)
  • เป็นสถานะ HIGH เมื่อระดับแรงดันสูงกว่า 2.31V (จาก 0.7×3.3)

ระดับแรงดันไฟที่กำหนดสถานะ HIGH หรือ LOW ของ Microcontroller แต่ละชนิดอาจต่างกันและควรอ้างอิงจาก Datasheet

เหตุผลหลักที่ต้องมี Hysteresis หรือช่องว่างระหว่างเกณฑ์ HIGH และ LOW ก็เพื่อเพิ่มความทนทานต่อสัญญาณรบกวน (Noise) เช่น ถ้าเรากำหนดง่ายๆ ว่าให้เกณฑ์ HIGH คือมากกว่า 0.5V และ LOW คือน้อยกว่า 0.5V เมื่อมีสัญญาณรบกวนที่ทำให้ระดับของสัญญาณแกว่งอยู่ระหว่าง 0.49-0.51V ก็จะทำให้สถานะของสัญญาณเปลี่ยนแปลงกลับไปกลับมาตาม Noise (±0.01V) มากกว่าสัญญาณจริง ซึ่งเมื่อเปรียบเทียบกับเทคโนโลยี TTL ซึ่งช่วงห่างระหว่างเกณฑ์ HIGH และ LOW เท่ากับ 2-0.8 =1.2V ก็จะทำให้สามารถทนต่อสัญญาณรบกวนได้ดีกว่า

รูป 1-2 ระดับแรงดันขาอินพุตเอาน์พุตของ STM32F407xx

รูป 1-2 ระดับแรงดันขาอินพุตเอาน์พุตของ STM32F407xx

วงจรอินพุต

แต่ละขาอินพุตของ STM32F4 สามารถกำหนดเป็นแบบใดแบบหนึ่งจากสามแบบคือ Pull-Up, Pull-Down และ Floating (นอกจากนี้ ขาบางขา เฉพาะที่เป็น 5V Tolerance สามารถรับไฟแรงดัน 5.0V ได้ ไม่จำเป็นต้องต่อวงจรปรับแรงดันภายนอกเพิ่มเติม ผู้ใช้สามารถตรวจสอบว่าขาใดเป็น 5V Tolerance ได้จาก Datasheet)

วงจรอินพุตแบบ Pull-Up

รูป 1-3 แสดงผลการตั้งขาอินพุตเป็นแบบ Pull-Up กล่าวคือ ตัวต้านทาน Pull-Up ซึ่งต่ออยู่กับ VDD หรือแหล่งจ่ายไฟ จะถูกเชื่อมกับจุดอ่านค่าสถานะโดยอัตโนมัติภายใน Microcontroller ขณะที่ตัวต้านทาน Pull-Down จะไม่ถูกเชื่อมต่อเพื่อรักษาระดับของแรงดัน ให้คงที่ในสถานะ HIGH หรือ “1” ตลอดเวลา และเมื่อกด Switch จะทำให้สถานะเป็น LOW หรือ “0” จึงเรียกว่า Active Low เพราะเมื่อมีการทำงาน (สวิตช์ถูกกด) ขาของ Microcontroller มีค่าเป็น LOW วงจรแบบ Pull-Up เป็นที่นิยมมากกว่า เพราะทนต่อสัญญาณรบกวนได้ดี

รูป 1-3 วงจรของขาอินพุตเมื่อกาหนดแบบ Pull-Up

รูป 1-3 วงจรของขาอินพุตเมื่อกาหนดแบบ Pull-Up

วงจรอินพุตแบบ Pull-Down

รูป 1-4 แสดงผลการตั้งขาอินพุตแบบ Pull-Up กล่าวคือ ตัวต้านทาน Pull-Down ซึ่งต่ออยู่กับ Ground จะถูกเชื่อมกับจุดอ่านค่าสถานะโดยอัตโนมัติภายใน Microcontroller ขณะที่ตัวต้านทาน Pull-Up จะไม่ถูกเชื่อมต่อเพื่อรักษาระดับของแรงดันให้คงที่ในสถานะ LOW หรือ “0” ตลอดเวลา และเมื่อกด Switch จะทำให้สถานะเป็น HIGH หรือ “1” จึงเรียกว่า Active High เพราะเมื่อมีการทำงาน (สวิตช์ถูกกด) ขาของ Microcontroller มีค่าเป็น HIGH

รูป 1-4 วงจรการทางานของขาอินพุตเมื่อกาหนดแบบ Pull-Down

รูป 1-4 วงจรการทางานของขาอินพุตเมื่อกาหนดแบบ Pull-Down

วงจรอินพุต Floating

สำหรับการตั้งค่าขาแบบ Floating มีแนวคิดเหมือน Pull-Up/Pull-Down แต่แตกต่างตรงที่จะไม่ต่อตัวต้านทาน Pull-Up และ Pull-Down ที่อยู่ภายใน และผู้ใช้จะต้องต่อตัวต้านทาน Pull-Up หรือ Pull-Down เองภายนอก จึงเหมาะสำหรับการต่ออุปกรณ์บางประเภทที่มีวงจร Pull-Up หรือ Pull-Down ภายนอกให้อยู่แล้ว


วงจรเอาน์พุต

วงจรเอาน์พุตของ STM32F4 มีอยู่ 2 ชนิด คือ Push-Pull และ Open-Drain โดยผู้ใช้สามารถเลือกใช้งานได้อย่างใดอย่างหนึ่ง

วงจรเอาน์พุตแบบ Push-Pull

เมื่อตั้งค่าขาของ STM32F4 เป็นเอาน์พุตแบบ Push-Pull วงจรภายในแต่ละขาของ Microcontroller ซึ่งประกอบด้วย MOSFET สองชนิดได้แก่ P-MOS ซึ่งเชื่อมระหว่าง VDD กับขาเอาน์พุต เพื่อทำหน้าจ่ายกระแส (Source Current) กับ N-MOS ซึ่งเชื่อมระหว่างขาเอาน์พุตกับ Ground เพื่อทำหน้ารับกระแส (Sink Current) ดังรูป 1‑5 จะถูกควบคุมการเชื่อมต่อโดยอัตโนมัติ ดังนี้

  • เมื่อต้องการเอาน์พุตสถานะเป็น HIGH หรือ “1” ระบบจะเปิดการทำงานของ P-MOS และปิดการทำงานของ N-MOS ดังนั้นขาเอาน์พุตจึงมีระดับแรงดัน VDD หรือ สถานะ HIGH
  • เมื่อต้องการเอาน์พุตสถานะเป็น LOW หรือ “0” ระบบจะเปิดการทำงานของ N-MOS และปิดการทำงานของ P-MOS ดังนั้นขาเอาน์พุตจึงมีระดับแรงดัน Ground หรือ สถานะ LOW

จากรูป 1‑5 เมื่อต่อหลอดไฟ LED ระหว่างขาเอาน์พุตและ Ground โดยมีตัวต้านทานเพื่อจำกัดกระแส หลอดไฟ LED จะทำงานเมื่อสถานะของเอาน์พุตเป็น “1” (Active High Output) เพราะขาเอาน์พุตมีระดับแรงดัน VDD จึงทำให้มีกระแสไฟจ่ายออกจาก Microcontroller ผ่านหลอดไฟ LED สู่ Ground

รูป 1 5 วงจรเอาน์พุตของ STM32F4 แบบ Push-Pull และทำงานแบบ Current Sourcing

รูป 1 5 วงจรเอาน์พุตแบบ Push-Pull และทำงานแบบ Current Sourcing

เมื่อต่อหลอดไฟ LED ระหว่างขาเอาน์พุตและแหล่งจ่ายไฟ VDD ภายนอก โดยมีตัวต้านทานเพื่อจำกัดกระแส ดังรูป 1‑6 หลอดไฟ LED จะทำงานเมื่อสถานะของเอาน์พุตเป็น “0” (Active Low Output) เพราะกระแสสามารถจาก VDD ไหลผ่านหลอดไฟ LED เข้าขาเอาน์พุตที่มีสถานะเป็น Ground

รูป 1-6 วงจรเอาน์พุตแบบ Push-Pull และทำงานแบบ Current Sinking

รูป 1-6 วงจรเอาน์พุตแบบ Push-Pull และทำงานแบบ Current Sinking

ข้อดีของ Output แบบ Push-Pull คือสามารถเปลี่ยนสถานะได้เร็ว จึงเหมาะกับงานที่ต้องเปิดปิดขาด้วยความถี่สูง อีกทั้งยังสามารถขับกระแสให้อุปกรณ์ได้โดยตรง แต่มีข้อจำกัดคือสามารถรับ-จ่ายกระแสได้จำกัด ซึ่งผู้ใช้งานควรศึกษาข้อมูลทางไฟฟ้าเกี่ยวกับการขับกระแสและแรงดันสูงสุดจาก Datasheet ของ Microcontroller แต่ละประเภท ข้อมูลเหล่านี้มีความสำคัญมาก เพื่อป้องกันอุปกรณ์เสียหายและเพิ่มความเชื่อถือได้ของระบบ ยกตัวอย่างเช่น แต่ละขาของ STM32F4 สามารถ Sink / Source กระแสได้สูงสุด 25mA ยกเว้น PC13-PC15 จ่ายได้ 3mA [1, p. 77] และสามารถรับ-จ่ายสูงสุดทุกขารวมกันได้ไม่เกิน 150mA ดังแสดงในรูป 1‑7 ดังนั้น เมื่อต้องการขับหลอด LED ด้วย I/O แบบ Push-Pull (สมมุติว่า VDD = 3.3V) อาจใช้ R 660 โอห์ม (จาก R = V/I = 3.3/5m = 660) เพื่อจำกัดการจ่ายกระแสที่ 5mA ซึ่งยังคงเพียงพอให้ LED สว่าง และไม่เกินเกณฑ์สูงสุด 25mA เป็นต้น

รูป 1-7 STM32F415xx-417xx Absolute maximum ratings: Current characteristics [2, p. 73]

รูป 1-7 STM32F415xx-417xx Absolute maximum ratings: Current characteristics [2, p. 73]


วงจรเอาน์พุตแบบ Open-Drain

เมื่อตั้งค่าขาเอาน์พุตของ STM32F4 เป็นแบบ Open-Drain วงจรภายในแต่ละขาของ Microcontroller จะถูกควบคุมการเชื่อมต่อโดยอัตโนมัติ ดังนี้

  • เอาน์พุตริจิสเตอร์ จะปิดการทำงานของ P-MOS ไม่ว่าอยู่สถานะใด
  • เมื่อต้องการถ้าเอาน์พุตสถานะเป็น LOW หรือ “0” ระบบจะเปิดการทำงานของ N-MOS ดังนั้นขาเอาน์พุตจึงมีระดับแรงดัน Ground
  • เมื่อต้องการเอาน์พุตสถานะเป็น HIGH หรือ “1” ระบบจะปิดการทำงานของ N-MOS และทำให้ขา เอาน์พุต เป็นสถานะ High Impedance

ดังนั้นการใช้งานขาเอาน์พุตแบบ Open-Drain ต้องต่ออุปกรณ์กับแหล่งจ่ายไฟภายนอก Vext ดังรูป 1‑8 ซึ่งอุปกรณ์จะทำงานเมื่อสถานะของเอาน์พุตเป็น “0”

รูป 1-8 วงจรเอาน์พุตแบบ Open-Drain

รูป 1-8 วงจรเอาน์พุตแบบ Open-Drain

เนื่องจากวงจร Open-drain ไม่ได้ใช้ไฟเลี้ยงจาก Microcontroller จึงมีข้อดีคือเหมาะกับการใช้งานกับอุปกรณ์ที่ต้องใช้ไฟเลี้ยงภายนอก ซึ่งอาจจะมีระดับไฟที่สูงกว่า VDD อย่างไรก็ตามผู้ใช้ควรตรวจสอบการรับกระแสไฟไม่ให้เกินกว่าค่าสูงสุด (25mA) และเหมาะสำหรับต่ออุปกรณ์แบบระบับบัส เช่น I2C เป็นต้น


การทดลองดิจิตอล I/O

อุปกรณ์การทดลอง

การทดลอง Digital I/O นั้นเลือกใช้อุปกรณ์พื้นฐานได้แก่ หลอดไฟ LED ใช้แสดงสถานะของ Digital Output และใช้ปุ่มสวิตซ์แบบกดติดปล่อยดับ และ Dip Switch เป็นอุปกรณ์สร้างสัญญาณ Logic เพื่อป้อนเป็นสัญญาณ Input ให้กับ Digital Input ซึ่งสามารถหาได้ง่ายและราคาถูก

บอร์ด aMG F4 Connect 2 ซึ่งพัฒนาโดยบริษัท  Aimagin สามารถใช้งานกับบอร์ด STM32F4DISCOVERY และบอร์ด FiO2 มีหลอดไฟ LED 4 ดวง ปุ่มสวิตซ์แบบกดติดปล่อยดับไว้ 3 ปุ่ม และ DIP-Switch 8 ขา ดังรูป 2‑1

บอร์ดทดลอง STM32F4DISCOVERY ผลิตโดยบริษัท STMicroelectronic เป็นบอร์ดทดลองที่ใช้Microcontroller ตระกูล STM32F4 รุ่น STM32F407V6T6 ขนาด 100 ขา (Pin) ซึ่งสามารถใช้งานแบบ Digital I/O ได้สูงสุดถึง 82 ขา โดยแบ่งออกเป็น 5 Ports ได้แก่ PA, PB, PC, PD, PE และ PH ในแต่ละ Port ประกอบด้วย 16 ขา ยกเว้น PH ที่มี 2 ขา แต่ละขาสามารถกำหนดให้เป็นขาอินพุต หรือขาเอาน์พุต ยกตัวอย่างเช่น ถ้าต้องการให้ขา PD1 เป็นขาอินพุตแบบ Pull-Up และขา PD7 เป็นขาเอาน์พุตแบบ Push-Pull ก็สามารถทำได้ (รายละเอียดตามวิธีดูขาของ Microcontroller) ขณะที่บอร์ด FiO2 ใช้ Microcontroller รุ่น STM32F417IG ซึ่งมีขาเยอะกว่ามาก แต่โดยหลักการทำงานแล้วเหมือนกันทุกประการ

ในการใช้งานบอร์ด STM32F4DISCOVERY มีข้อควรระวังคือ ขาของ Microcontroller บางขาอาจถูกผูกติดอยู่กับอุปกรณ์อื่นๆ บนบอร์ดอยู่แล้วดังนั้นจึงควรศึกษาจาก Datasheet อย่างละเอียดว่าขาใดว่างอยู่บ้าง

รูป 2-1 อุปกรณ์บน aMG F4 Connect 2 สำหรับการทดลอง Digital I/O

รูป 2-1 อุปกรณ์บน aMG F4 Connect 2 สำหรับการทดลอง Digital I/O

รูป 2-2 แสดงภาพวงจรที่ต่ออยู่กับ หลอด LED ในรูป 2-1

รูป 2-2 วงจรหลอด LED ที่อยู่บนบอร์ด aMG F4 connect 2

รูป 2-2 วงจรหลอด LED ที่อยู่บนบอร์ด aMG F4 connect 2


ถาม 
จากรูป 2-2 Port label LED 1 ถึง LED 4 ต่ออยู่กับขา PD12 ถึง PD15 ของ Microcontroller หากเราต้องการขับ LED เหล่านี้ ควรเลือกวงจรเอาน์พุต Push-Pull หรือ Open-Drain? ทำไม?

ตอบ Output แบบ Push-Pull เพราะจะต้องใช้ Microcontroller เป็นตัวจ่าย/ขับกระแส

รูป 2-3 วงจรสวิตซ์แบบกดติดปล่อยดับ บนบอร์ด aMG F4 connect 2

รูป 2-3 วงจรสวิตซ์แบบกดติดปล่อยดับ บนบอร์ด aMG F4 connect 2


ถาม 
จากรูป 2-3 Port label PUSH SW 1 ถึง PUSH SW 3 ต่ออยู่กับขา PB2, PB15 และ PD7 ของ Microcontroller หากเราต้องการอ่านค่า Switch เหล่านี้ ควรเลือกวงจรอินพุต แบบใด Pull-Up, Pull-Down หรือ Floating ทำไม?

ตอบ Input แบบ Floating เพราะมี Pull-Down Resistor ภายนอกอยู่แล้ว

รูป 2-4 วงจรสวิตซ์แบบ DIP บนบอร์ด aMG F4 connect 2

รูป 2-4 วงจรสวิตซ์แบบ DIP บนบอร์ด aMG F4 connect 2


ถาม 
จากรูป 2-3 Port label DIP SW 1 ถึง DIP SW 8 ต่ออยู่กับขา PE3- PE6 และ PG10 – PG13 ของ Microcontroller หากเราต้องการอ่านค่า Switch เหล่านี้ ควรเลือกวงจรอินพุต แบบใด Pull-Up, Pull-Down หรือ Floating ทำไม?

ตอบ Input แบบ Floating เพราะมี Pull-Down Resistor ภายนอกอยู่แล้ว


การใช้งาน Digital Output Blockset­

เมื่อเราต้องการกำหนดให้ขาของ Microcontroller เป็น Digital Output เราต้องใช้กล่อง Digital Output Block

กล่องดังกล่าวจะอยู่ใน Simulink library >> Waijung Blockset >>  STM32F4 target >> On Peripheral Chip >> I/O โดย Digital Output block มีลักษณะและคุณสมบัติดังแสดงในรูป 2-5

รูป 2-5 ลักษณะและการตั้งค่าของ Digitial Output Block

รูป 2-5 ลักษณะและการตั้งค่าของ Digitial Output Block


การทดลองเปิด-ปิด LED 1 ดวง (Blinking LED)

การทดลองนี้มีจุดประสงค์เพื่อให้ผู้เรียนทำการทดลองควบคุมการเปิดปิดของหลอด LED โดยใช้สัญญาณจาก Pulse Generator block เป็นตัวกำหนดช่วงเวลาของการเปิดปิดดังแสดงในรูป 2-6 (Exp1_1BlinkingLED.mdl)

รูป 2-6 Simulink Model สำหรับการทดลองเปิด-ปิดหลอด LED 1 ดวง

รูป 2-6 Simulink Model สำหรับการทดลองเปิด-ปิดหลอด LED 1 ดวง

ตาราง 2-1 Simulink Block ที่ใช้ในการทดลอง Blinking LED

ตาราง 2-1 Simulink Block ที่ใช้ในการทดลอง Blinking LED

ในการตั้งค่า Parameters ของ Pulse Generator block นั้นมีตัวแปรที่สำคัญคือ Period หรือช่วงเวลาของ waveform ในหน่วยวินาที  และ Pulse Width ซึ่งเป็นตัวกำหนดช่วง ON โดยคิดเป็น % ของ Period ยกตัวอย่างเช่น ต้องการเปิดหลอด LED 1 วินาที และ ปิด 3 วินาที แล้วทำซ้ำอีกครั้ง  ดังนั้น Period ของสัญญาณควบคุมเปิด-ปิดในหนึ่งรอบการทำงานควรตั้งไว้ที่ 4 วินาที (เวลาที่ ON LED + เวลาที่ OFF LED)  และ Pulse Width สามารถคิดเป็น % ได้ดังนี้

% Pulse Width = (ช่วงเวลาที่ ON) x 100 / Period

        = (1) x 100 / 4 = 25 %

เราสามารถจำลองการทำงานของ Pulse Generator block หลังจากตั้งค่าได้โดย เลือกเมนู Simulation แล้วเลือก Run หรือกดที่ Icon ดังรูป 2‑7 จากนั้น Double Click ที่ Scope ซึ่งจะแสดงผลกราฟสัญญาณดังรูป 2‑8 ในช่วง Simulation นั้นยังไม่มีการกระพริบของหลอด LED เพราะ Program ยังไม่ได้ Download ลงใน STM32F4 target ข้อดีของการจำลองการทำงานคือ ผู้ใช้สามารถตรวจสอบความถูกต้องของ Program และแก้ไขก่อนนำมาใช้งานจริงเพื่อลดความผิดพลาด

รูป 2-7 Icon บนหน้าต่าง Simulink สำหรับ simulation และ download

รูป 2-7 Icon บนหน้าต่าง Simulink สำหรับ simulation และ download

รูป 2-8 การตั้งค่า Pulse generator block และผลจำลองการทำงานของการทดลอง Blinking LED

รูป 2-8 การตั้งค่า Pulse generator block และผลจำลองการทำงานของการทดลอง Blinking LED

หลังจากตรวจสอบความถูกต้องแล้ว การ Download โปรแกรมสามารถทำได้โดย กด CTRL+D หรือ กดที่ icon Update Diagram ก่อน แล้วกด CTRL+B หรือกดที่ icon Build and Download ดังรูป 2‑7 เมื่อ download โปรแกรมลงในบอร์ดแล้ว หลอด LED ชื่อ LD6 บนบอร์ด STM32F4DISCOVERY และ LED4 บนบอร์ด aMG F4 Connect จะเปิด 1 วินาทีและ ปิด  3 วินาที และวนกลับทำงานซ้ำ ผู้ใช้สามารถทดลองเพิ่มเติมโดยการตั้งค่า Amplitude, Period และ Pulse Width แบบต่างๆ แล้วสังเกตการเปลี่ยนแปลงของกราฟบน Scope และ การกระพริบของหลอด LED ว่าจะต้องสอดคล้องกัน

การทดลองควบคุมหลอดไฟวิ่ง LED 4 ดวง

จุดประสงค์การทดลอง เพื่อให้ผู้ใช้งานสามารถควบคุมการเปิดปิดของหลอด LED ทั้ง 4 ดวงแบบไฟวิ่ง โดยใช้สัญญาณจาก Pulse Generator จำนวน 4 block เป็นตัวกำหนดช่วงเวลาของการเปิดปิด ตามขั้นตอนดังรูป 2-9 (Exp1_2RunningLED.mdl)

Blink sequence

Blink sequence

รูป 2-9 Simulink Model สำหรับการทดลองไฟวิ่ง LED 4 ดวง

รูป 2-9 Simulink Model สำหรับการทดลองไฟวิ่ง LED 4 ดวง

ตาราง 2-2 Simulink Block ที่ใช้ในการทดลองควบคุมหลอดไฟวิ่ง

ตาราง 2-2 Simulink Block ที่ใช้ในการทดลองควบคุมหลอดไฟวิ่ง

โดยแต่ละ Step ห่างกัน 250 ms หรือ 0.25 วินาทีหลังจากทำงานครบ step8 ให้โปรแกรมเริ่มกลับไปทำงานที่ step1 เมื่อสังเกตจากตารางจะพบว่า หลอด LED แต่ละดวงจะเปิดค้าง 1 วินาที หลังจากนั้นปิดค้างไว้อีก 1 วินาที ดังนั้น Parameters ของ Pulse Generator Block ควรมี period 2 วินาที และ pulse width 50%

สำหรับ  LED2 ซึ่งควบคุมโดย Block Signal2 เริ่มต้นการทำงานช้ากว่า LED1 1 step ดังนั้น Phase Delay ของ Signal2 Block ควรมีค่า 0.25 ในขณะเดียวกัน LED3 เริ่มต้นการทำงานช้ากว่า LED1 2 steps ดังนั้น Phase Delay ของ Signal3 Block ควรมีค่า 0.25 x 2 = 0.5 สุดท้าย LED 4 เริ่มต้นการทำงานช้ากว่า LED1 3 steps ดังนั้น Phase Delay ของ Signal4 Block ควรมีค่า 0.25 x 2 = 0.75

จากตัวอย่างขั้นต้น Block จาก Simulink/source Library เช่น Counter Free Running Block หรือ Pulse Generator Block จะถูกใช้เป็นสัญญาณควบคุมการเปิด-ปิดเอาน์พุต เมื่อต้องการสัญญาณจากภายนอกเช่น สวิตซ์ ผู้ใช้สามารถใช้ Block Digital Input เพื่อรับสัญญาณ ซึ่งอยู่ใน Simulink library >> STM32F4 target >> On Peripheral Chip >> I/O เช่นกัน

วิธีการใช้งาน Digital Input Blockset

สำหรับ Blockset ที่ใช้ควบคุม Digital I/O ของบอร์ด STM32F4DISCOVERY นั้นอยู่ใน Simulink Library >> Waijung Blockset >> STM32F4 target >> On Peripheral Chip >> I/O โดย Digital Input block มีลักษณะและคุณสมบัติดังนี้

รูป 2-10 ลักษณะและการตั้งค่าของ Digital Input Block

รูป 2-10 ลักษณะและการตั้งค่าของ Digital Input Block

นอกจากนี้ ผู้ใช้สามารถกำหนด Sampling time และ Enable custom port labels เพื่อให้ผู้ใช้สามารถตั้งชื่อ Input port ยกตัวอย่างเช่น ชื่ออุปกรณ์หรือสวิตซ์

การทดลองควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด

จุดประสงค์การทดลอง

  • เพื่อให้ผู้ใช้สามารถเขียนโปรแกรมอ่านค่าจากสวิตซ์ปุ่มกดโดยใช้ Digital Input Block
  • เพื่อให้ผู้ใช้เข้าใจการทำงานแบบ Jog และสามารถนำไปประยุกต์ใช้งานจริงได้
  • เพื่อให้ผู้ใช้สามารถอ่านค่าจากสวิตซ์ปุ่มกดและสั่ง Output แบบ Toggle
  • เพื่อให้ผู้ใช้สามารถเปรียบเทียบการทำงานแบบ Toggle และแบบ Jog
รูป 2-11 Simulink model สำหรับการทดลองเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด

รูป 2-11 Simulink model สำหรับการทดลองเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด

ตาราง 2-3 Simulink block ที่ใช้ในควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด

ตาราง 2-3 Simulink block ที่ใช้ในควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด

เมื่อผู้ใช้ Download model ลงใน STM32F4DISCOVERY แล้ว หลอดไฟ LED ทั้ง 4 ดวงจะติดเมื่อกดปุ่ม SW3 ค้าง และดับเมื่อปล่อย ดังนั้นการทำงานแบบ Jog คือการเขียนโปรแกรมให้ส่งค่า Output ตลอดเวลาขณะกดปุ่มค้าง และหยุดส่งเมื่อปล่อย ซึ่งเหมาะสำหรับงานควบคุมเครื่องจักรแบบ Manual ยกตัวอย่างเช่น การควบคุมเครนหรือปั่นจั่น เป็นต้น

Debounce คืออะไร

การใช้สวิตซ์เป็นอุปกรณ์สร้างสัญญาณ Logic ให้กับ Digital Input นั้นอาจจะเกิดสัญญาณแกว่งเนื่องจากการเด้งของหน้าสัมผัสช่วงเปลี่ยนสถานะ หรือช่วงหน้าสัมผัสกำลังจะติด หรือกำลังจากกัน โดยจะเกิดเป็นรูป Pulse หลายๆลูกดังรูป 2‑12 ซึ่งจะเกิดขึ้นในช่วงเวลาสั้นๆ โดยประมาณ 0.01 วินาที (หรือ 100msec) ปรากฏการณ์ดังกล่าวจะทำให้การทำงานของโปรแกรมผิดพลาดได้

รูป 2-12 การแกว่งของสัญญาณจากสวิตซ์

รูป 2-12 การแกว่งของสัญญาณจากสวิตซ์

ปัญหาที่เกิดขึ้นสามารถแก้ไขได้โดยต่อ RC circuit เพื่อลดการแกว่งของสัญญาณ (Debouncing) เนื่องจากการแกว่งของสัญญาณมีช่วงเวลาเกิดขึ้นไม่แน่นอน การหาค่าของตัวเก็บประจุที่เหมาะสมจึงทำได้ยาก ดังรูป 2‑13 แสดงการใช้วงจร RC สำหรับ Debouncing สัญญาณจากสวิตซ์ปุ่มกด และสัญญาณผลลัพธ์ด้วยตัวเก็บประจุค่าต่างๆ ยิ่งค่าของตัวเก็บประจุมากขึ้น จะมี Delay ของสัญญาณมากขึ้น

รูป 2-13 วงจร Debouncing โดยใช้ RC circuit

รูป 2-13 วงจร Debouncing โดยใช้ RC circuit

นอกจากการ Debouncing ด้วย Hardware แล้ว ผู้ใช้สามารถเขียนโปรแกรมแก้ปัญหาได้ ซึ่งนอกจากจะลดการใช้วงจร RC แล้วยังสามารถกำหนดช่วงเวลาได้ ใน Waijung Blockset มี Debounce block ซึ่งอยู่ใน Simulink Library: Waijung Blockset >> STM32F4 Target >> On-chip Peripherals >> IO โดยการตั้งค่า Parameter ของ Debounce block มีดังนี้

Mode สามารถเลือกได้ Normal, Single End และ Toggle Latch ซึ่งผู้ใช้สามารถเปลี่ยน Mode การทำงานแล้วสังเกตการเปิด-ปิดหลอด LED เมื่อกดปุ่ม Debounce count สำหรับการทำงานแบบ Toggle คือการเขียนโปรแกรมให้ส่งค่า Output ตลอดเวลาขณะกดปุ่มหนึ่งครั้ง และหยุดส่งเมื่อกดปุ่มอีกครั้ง ดังนั้นโปรแกรมควรมีการตรวจสอบสถานะของ Output และส่ง Output ค่าใหม่ เมื่อมีการกดปุ่ม การทำงานแบบ Toggle เหมาะสำหรับการเปิด-ปิด อุปกรณ์ไฟฟ้า

การรับค่าอินพุตแบบ Toggle นั้นผู้ใช้สามารถเพิ่ม Debounce Block ระหว่าง Digital Input และ Digital Output ดังรูป 2‑14

รูป 2-14 Simulink model สำหรับการทดลองเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด (Toggle mode)

รูป 2-14 Simulink model สำหรับการทดลองเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบปุ่มกด (Toggle mode)

แบบฝึกหัด

  1. จงอธิบายข้อแตกต่างการเปิด-ปิดหลอด LED ในโหมดการทำงาน Normal, Single End และ Toggle Latch
  2. จงอธิบายการเปิด-ปิดหลอด LED เมื่อเพิ่มค่า Debounce Count ในโหมดการทำงาน Normal


การทดลองควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบ Dip Switch

จุดประสงค์

  • เพื่อให้ผู้ใช้สามารถรับค่าจาก Dip Switch
  • เพื่อให้ผู้ใช้สามารถเขียนโปรแกรมการควบคุมเปิด-ปิดหลอด LEDแบบต่างๆ โดยเลือกโหมดการทำงานผ่าน Dip Switch
รูป 2-15 Simulink Model สำหรับการทดลองควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบ Dip Switch

รูป 2-15 Simulink Model สำหรับการทดลองควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบ Dip Switch

ตาราง 2-4 Simulink block ที่ใช้ในการทดลองควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบ Dip Switch

ตาราง 2-4 Simulink block ที่ใช้ในการทดลองควบคุมเปิด-ปิดหลอด LED ด้วยสวิตซ์แบบ Dip Switch

จากไฟล์ตัวอย่าง (Exp1_5DipSwLED.mdl) ในการทดลองนี้ควบคุมเปิด-ปิด LED ด้วย Dip Switch หมายเลข 1 ซึ่งต่อที่ขา PE3 โดยสัญญาณจะเข้าไปที่ Switch Block ซึ่งจะเลือกตามเงื่อนไข (เป็นจริงเมื่อสัญญาณอินพุตไม่เท่ากับ 0) จากรูป 2‑15 เมื่อเงื่อนไขเป็นจริง สัญญาณจาก Pulse Generator เป็นตัวควบคุมการเปิดปิดหลอด LED และเมื่อเงื่อนไขเป็นเท็จ สัญญาณจากสวิตซ์ปุ่มกดเป็นตัวควบคุมการเปิดปิดหลอด LED

เมื่อเลือก Dip Switch ที่ตำแหน่ง ON หลอด LED จะกระพริบทุกๆ 0.5 วินาที เมื่อเลือก Dip Switch ที่ตำแหน่ง OFF หลอด LED จะติดเมื่อผู้ใช้กดปุ่มสวิตซ์ SW3 การทดลองนี้สามารถนำไปประยุกต์ใช้กับงานที่มีหลายโหมดการทำงานเช่น โหมดการทำงานแบบ Automatic หรือ Manual


แบบฝึกหัดท้ายบท Digital I/O

1. จงออกแบบโปรแกรมไฟวิ่ง LED 4 ดวงทีละดวง โดยใช้ counter และ bit operation (สามารถดู Model จาก digital output demo stm32f4_digital_output_demo.mdl)

คำอธิบายเพิ่มเติม  การตั้งค่า Parameter ของ Counter ให้ตั้งค่าดังนี้ number of bits (n): 16 และ sampling time: 0.5 เมื่อ program เริ่มทำงาน counter จะเริ่มนับทุกๆ 500m วินาทีโดยเริ่มต้นจาก 0 ไปจนถึงค่า 2n-1 ซึ่งเป็นค่าสูงสุด หลังจากนั้น counter จะเริ่มนับจาก 0 อีกครั้ง ค่าของ counter ถูกนำไป AND กับค่าคงที่ 3 เพื่อให้ค่าการนับอยู่ในช่วง 0 ถึง 3 เท่านั้น  หลังจากนั้นใช้ block compare to constant เพื่อกำหนดการเปิดปิดโดยให้ LED1 LED2 LED3 LED4 เปิด เมื่อค่าเท่ากับ 0, 1, 2 และ 3 ตามลำดับ

2. ออกแบบโปรแกรมควบคุมไฟวิ่ง LED 4 ดวง ตาม timing chart ดังนี้ โดยให้แต่ละ Step ห่างกัน 0.5 วินาที หลังจากทำงานครบ step 4 ให้โปรแกรมเริ่มกลับไปทำงานที่ Step 1

Image 016

Image 017

3. จงออกแบบโปรแกรมควบคุมหลอดไฟ LED 4 ดวง โดยมีโหมดการทำงานดังนี้

Image 018


คำถามที่ถูกถามบ่อย (FAQ)

1. STM32F4DISCOVERY, FiO2 มี I/O กี่ขา? (ดูรายละเอียดได้ที่ วิธีดูขาของ Microcontroller)
ตอบ  สำหรับผู้ใช้ STM32F4DISCOVERY ซึ่งใช้ไมโครคอนโทรเลอร์เบอร์ STM32F407VGT6 หรือผู้ใช้ FiO2 ซึ่งใช้ไมโครคอนโทรเลอร์เบอร์ STM32F417IGT6 สามารถดูข้อมูลคุณสมบัติต่างๆได้จาก Datasheet Product Specification ตัวอย่างเช่น จำนวน GPIO หรือขาอินพุตเอาน์พุตของSTM32F407Vx มีทั้งหมด 82 ขา [1, p. 14] STM32F417Ix มีทั้งหมด 140 ขา [2, p. 14]

รูป 4-1 แสดงจำนวนขา I/O ทั้งหมดของ STM32F40xxx รุ่นต่างๆ

รูป 4-1 แสดงจำนวนขา I/O ทั้งหมดของ STM32F40xxx รุ่นต่างๆ

2. ขา I/O สามารถรับไฟได้เท่าไร?
ตอบ  ผู้ใช้ควรตรวจสอบชนิดและโครงสร้างของขา I/O ได้จาก Datasheet
Digital I/O ทั่วไปสามารถรับไฟได้ 5.0V (5V tolerance I/O) โดยต้องต่อ R ที่มีค่าเหมาะสม เพื่อป้องกันกระแสไฟเกินกว่ากำหนด โดยขาที่เป็นอะนาลอกอินพุต ห้ามต่อไฟเกิน 3.3 V โดยเด็ดขาด ขาไฟเลี้ยง 1.8 V ถึง 3.6 V

3. ขา I/O สามารถจ่ายไฟได้เท่าไร?
ตอบ ไม่เกิน 3.6 V และจ่ายกระแสได้ไม่เกิน 25 mA ยกเว้น PC13-PC15 จ่ายกระแสได้สูงสุด 3mA

รูป 4-2 ตารางแสดงคุณสมบัติการรับ-ขับกระแสสูงสุดของ STM32F4 [1, p. 77]

รูป 4-2 ตารางแสดงคุณสมบัติการรับ-ขับกระแสสูงสุดของ STM32F4 [1, p. 77]

เอกสารอ้างอิง 

  1. STMicroelectronics. (2013, Jun).  STM32F407xx Product-Specifications [Online]. Available: http://www.st.com/web/en/resource/technical/document/datasheet/DM00037051.pdf
  2. STMicroelectronics. (2013, Jun). STM32F417xx Datasheet – production data [Online]. Available: http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00035129.pdf
  3. STMicroelectronics. (2013, Feb). RM0090: STM32F40xxx Reference Manual [Online]. Available: http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00031020.pdf