ด้วยพินดิจิตอลและอนาล็อกซึ่งคุณสามารถใช้บนบอร์ด Arduino ของคุณคุณสามารถรับหรือส่งสัญญาณไฟฟ้าเพื่อควบคุมหรือรับข้อมูลจากโครงการอิเล็กทรอนิกส์ของคุณ นอกจากนี้ยังมีสัญญาณอื่น ๆ ที่น่าสนใจในจานประเภทนี้และนั่นก็คือ พีดับเบิ้ลยูเอ็ม, ที่สามารถเลียนแบบสัญญาณอนาล็อกโดยไม่ต้องเป็นอนาล็อก นั่นคือเป็นพินดิจิทัลที่สามารถทำหน้าที่ในลักษณะคล้ายกัน (ไม่เหมือนกัน) เป็นสัญญาณแอนะล็อก
สัญญาณประเภทนี้ใช้งานได้จริงเมื่อคุณไม่เพียง แต่ต้องการใช้สัญญาณดิจิตอลสูงและต่ำนั่นคือ 1 หรือ 0 เปิดและปิด แต่คุณต้องการอธิบายเพิ่มเติม สัญญาณที่ค่อนข้างซับซ้อนกว่า ตัวอย่างเช่นสามารถปรับความเร็วของไฟล์ มอเตอร์ DCหรือความเข้มแสงของแสงสำหรับโซลินอยด์ ฯลฯ
ระบบอนาล็อกกับระบบดิจิตอล
วงจรอิเล็กทรอนิกส์สามารถแบ่งออกเป็นสองตระกูลใหญ่หรือประเภท: ดิจิตอลและอนาล็อก. เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์ดิจิทัลเรากำลังใช้ปริมาณที่มีค่าไม่ต่อเนื่องนั่นคือระบบไบนารีที่แสดงด้วยสัญญาณไฟฟ้าของแรงดันไฟฟ้าต่ำหรือสูงเพื่อตีความสถานะของบิตเหล่านั้นที่ได้รับการจัดการ ในทางกลับกันเมื่อพูดถึงวงจรอะนาล็อกจะมีการใช้ปริมาณที่มีค่าต่อเนื่อง
ภายในระบบดิจิทัลสามารถพบได้ในทางกลับกัน ประเภทผสมและประเภทตามลำดับ. นั่นคืออดีตคือสิ่งที่เอาต์พุตของระบบขึ้นอยู่กับสถานะของอินพุตเท่านั้น ในทางกลับกันในองค์ประกอบตามลำดับจะมีองค์ประกอบหน่วยความจำรวมอยู่ด้วยและผลลัพธ์จะขึ้นอยู่กับสถานะปัจจุบันของอินพุตและสถานะก่อนหน้าที่จัดเก็บไว้
ในกรณีของอะนาล็อกจะไม่มีกลุ่มใหญ่หรือตัวแปรสองกลุ่มนี้เนื่องจากที่นี่เป็นสัญญาณต่อเนื่องซึ่งจะขึ้นอยู่กับ สัญญาณ ระบบปัจจุบัน ตัวอย่างเช่นในลำโพงสัญญาณที่คุณจ่ายจะขึ้นอยู่กับเสียงที่คุณต้องการสร้างซ้ำ เช่นเดียวกับไมโครโฟนซึ่งจะสร้างสัญญาณอนาล็อกขึ้นอยู่กับเสียงที่ได้รับ แน่นอนว่าคุณได้เห็นเซ็นเซอร์อื่น ๆ อีกมากมายที่เราได้อธิบายไว้ในบล็อกนี้และทำงานด้วยสัญญาณอะนาล็อก (ดังนั้นจึงต้องมีการสร้างสูตรเพื่อให้สามารถคำนวณหรือกำหนดค่าในภาพร่าง Arduino IDE ได้ในภายหลัง ) ...
ลักษณะเหล่านี้ของคนอื่น ๆ ทำให้บางคนมี ข้อดีและข้อเสียตามปกติในเกือบทุกอย่าง ตัวอย่างเช่นดิจิทัลมักจะมีราคาถูกกว่าเร็วกว่าพัฒนาง่ายกว่าข้อมูลสามารถจัดเก็บได้ง่ายขึ้นมีความแม่นยำมากขึ้นสามารถตั้งโปรแกรมได้ไม่เสี่ยงต่อผลกระทบของเสียง แต่ก็เป็นความจริงเช่นกันเมื่อใช้อะนาล็อกคุณสามารถใช้งานกับสัญญาณที่ซับซ้อนมากขึ้นได้
ปอ ejemploฮอลล์เอฟเฟกต์เซนเซอร์แบบดิจิตอลสามารถตรวจจับได้เฉพาะสนามแม่เหล็กที่อยู่ใกล้ ๆ แต่เซ็นเซอร์เอฟเฟกต์ Hall แบบอะนาล็อกสามารถทำเช่นนั้นได้และยังกำหนดความหนาแน่นของสนามแม่เหล็กดังกล่าวด้วยสัญญาณอะนาล็อกที่สร้างขึ้นที่เอาต์พุต เมื่อรู้วิธีตีความสัญญาณของแรงดันไฟฟ้าที่สูงขึ้นหรือต่ำลงคุณสามารถรู้ขนาดนั้นได้อย่างง่ายดาย คุณมีตัวอย่างอื่น ๆ ในขนาดของธรรมชาติมากมายที่คุณสามารถวัดเชิงปริมาณด้วยระบบอะนาล็อกเช่นอุณหภูมิเวลาความดันระยะทางเสียง ฯลฯ
สัญญาณอนาล็อกกับสัญญาณดิจิตอล
ที่ถูกกล่าวว่าก สัญญาณอนาล็อก มันจะเป็นแรงดันไฟฟ้าหรือกระแสไฟฟ้าที่แปรผันตามเวลาและต่อเนื่อง หากสร้างกราฟสัญญาณแอนะล็อกจะเป็นคลื่นไซน์ความถี่เดียว
ในฐานะที่เป็น สัญญาณดิจิตอลคือแรงดันไฟฟ้าที่แตกต่างกันไปในลักษณะทีละขั้นตามเวลา นั่นคือหากแสดงในกราฟจะเป็นสัญญาณขั้นตอนที่ไม่แปรผันอย่างต่อเนื่อง แต่จะเปลี่ยนไปในขั้นตอนหรือการเพิ่มทีละไม่ต่อเนื่อง
คุณควรทราบว่ามีวงจรที่จะเปลี่ยนจากสัญญาณแอนะล็อกเป็นสัญญาณดิจิทัลหรือในทางกลับกัน เหล่านี้ ตัวแปลง พวกเขารู้จักกันในชื่อ DAC (Digital-to-Analog Converter) และ ADC (Analog-to-Digital Converter) และพบได้บ่อยในอุปกรณ์ต่างๆที่เราใช้ในปัจจุบันเช่นทีวีคอมพิวเตอร์เป็นต้น ด้วยพวกเขาคุณสามารถแปลงสัญญาณดิจิทัลที่ใช้โดยอุปกรณ์เหล่านี้เป็นระดับอิเล็กทรอนิกส์เพื่อทำงานร่วมกับอุปกรณ์ต่อพ่วงหรือชิ้นส่วนอื่น ๆ ที่ทำงานในระบบอนาล็อก
ปอ ejemploลำโพงหรือไมโครโฟนที่มีสัญญาณอะนาล็อกที่ทำงานร่วมกับการ์ดเสียงหรือการ์ดกราฟิกดิจิทัลที่มีชิป RAMDAC ที่มีชื่อเสียงสำหรับพอร์ตจอภาพแอนะล็อก ... ใน Arduino ตัวแปลงประเภทนี้ยังใช้สำหรับหลายโครงการดังที่เราจะเห็น ...
PWM คืออะไร?
แม้ว่า PWM (Pulse-Width Modulation) หรือการมอดูเลตความกว้างพัลส์ มีฐานดิจิทัลรูปร่างของสัญญาณคล้ายสัญญาณอนาล็อก "สี่เหลี่ยมจัตุรัส" อนุญาตให้ใช้พัลส์ดิจิทัลเพื่อเปลี่ยนสัญญาณเพื่อจำลองระบบอนาล็อกตามที่ฉันได้แสดงความคิดเห็นไปแล้วก่อนหน้านี้ ในความเป็นจริงถ้าคุณดูชื่อมันให้เบาะแสแล้วว่ามันทำอะไรได้บ้างผ่านความกว้างของพัลส์ดิจิทัล
ซึ่งเป็นประโยชน์สำหรับ แพลตฟอร์มฮาร์ดแวร์ เนื่องจากมีระบบอัตโนมัติหรือส่วนประกอบอิเล็กทรอนิกส์มากมายที่คุณสามารถเพิ่มลงในโครงการของคุณได้ ไม่สามารถให้สัญญาณอะนาล็อกที่แท้จริงได้แต่พวกเขาใช้ PWM นี้ในการทำงาน พวกเขาไม่สามารถใช้สัญญาณอะนาล็อกที่แยกออกจากกันได้นั่นคือไปที่การกระโดดแรงดันไฟฟ้าเพื่อให้มีลักษณะคล้ายกับสัญญาณดิจิทัล สิ่งที่พวกเขาทำได้คือใช้เอาต์พุตดิจิตอล -Vcc หรือ Vcc ของประเภทดิจิทัลเพื่อสร้างสัญญาณที่แปลกประหลาดนี้ ...
ดังนั้น PWM จึงเป็น "เคล็ดลับ" ชนิดหนึ่งที่ Arduino และระบบอื่น ๆ สามารถทำงานร่วมกับสัญญาณประเภทนี้ได้ พวกเขาไม่ได้เป็นอนาล็อกหรือเป็นดิจิทัลแบบเดิม ๆ. เพื่อให้เป็นไปได้พวกเขาจะให้เอาต์พุตดิจิทัลทำงานในช่วงเวลาที่กำหนดหรือปิดขึ้นอยู่กับความสนใจตลอดเวลา นี่ยังห่างไกลจากสิ่งที่จะเป็นสัญญาณนาฬิกาดิจิทัลหรือรหัสไบนารีซึ่งพัลส์มีความกว้างเท่ากัน
ในโครงการของคุณกับ Arduino คุณสามารถตรวจสอบสัญญาณ PWM ประเภทนี้ซึ่งความถี่คงที่ของทริกเกอร์พัลส์จะคงอยู่ตลอดเวลา แต่ ความกว้างของพัลส์เหล่านี้แตกต่างกันไป. ในความเป็นจริงเรียกว่า Duty Cycle เมื่อสัญญาณถูกเก็บไว้ที่ระดับสูงเมื่อเทียบกับจำนวนรอบทั้งหมด ดังนั้น Duty Cycle จะได้รับเป็น%
โปรดจำไว้ว่าใน PWM คุณจะไม่ทำงานเหมือนสัญญาณอะนาล็อกระหว่างค่าแรงดันไฟฟ้าต่างๆและความผันผวนระหว่างค่าเหล่านี้ ในกรณีของ PWM จะเป็นสัญญาณสี่เหลี่ยมในรูปแบบดิจิตอลและ ซึ่งมีค่าสูงสุดคือ Vcc. ตัวอย่างเช่นหากคุณทำงานกับแหล่งจ่ายไฟ 3V คุณสามารถให้พัลส์ 3V หรือ 0V แต่ไม่ใช่ 1V หรือค่ากลางอื่น ๆ ตามที่จะเกิดขึ้นในอะนาล็อกจริง สิ่งที่จะแตกต่างกันไปในกรณีนั้นคือความกว้างของพัลส์ซึ่งเราสามารถรักษา 30% ที่ค่า Vcc ที่สูงนั้นหรือ 60% เพื่อให้ได้พลังงานมากขึ้น
แต่โปรดระวังเพราะหากอุปกรณ์รองรับขีด จำกัด Vcc และเกิน PWM อาจเสียหายได้ ดังนั้นจึงจำเป็นต้องเคารพค่าของเอกสารข้อมูลทางเทคนิคที่ผู้ผลิตให้มาเสมอ นอกจากนี้ในอุปกรณ์บางอย่างเช่นมอเตอร์กระแสตรง รีเลย์แม่เหล็กไฟฟ้า ฯลฯ การถอนแรงดันไฟฟ้าหลังจากรอบการทำงานอาจหมายความว่าโหลดอุปนัยอาจทำให้เกิดความเสียหายได้ นั่นคือเหตุผลที่ การคุ้มครอง ทันเวลา.
PWM บน Arduino
ตอนนี้คุณรู้แล้วว่ามันทำงานอย่างไรมาดูกรณีเฉพาะของ PWM ในโลก Arduino ...
PWM: pinout บน Arduino
บนบอร์ด Arduino คุณจะพบพินหลายตัวที่ใช้ฮาร์ดแวร์ PWM คุณสามารถระบุได้บน PCB เนื่องจากมีไฟล์ สัญลักษณ์ ~ (หัวเล็ก) พร้อมกับหมายเลขพิน นอกจากนี้ยังสามารถทำได้โดยซอฟต์แวร์ในรหัส Arduino แต่จะทำให้ไมโครคอนโทรลเลอร์มากเกินไปซึ่งเป็นสิ่งที่ไร้สาระเมื่อสามารถทำได้โดยกำเนิดและด้วยฮาร์ดแวร์
- Arduino UNO, มินิและนาโน- คุณมีเอาต์พุต PWM 6 บิต 8 ตัวบนพิน 3, 5, 6, 9, 10 และ 11 ซึ่งจะมี ~ อยู่หน้าตัวเลข
- Arduino Mega- บนบอร์ด Arduino ที่ทรงพลังที่สุดนี้คุณมีเอาต์พุต PWM 15 บิต 8 บิต อยู่บนหมุด 2 ถึง 13 และ 44 ถึง 46
- Arduino เนื่องจาก: ในกรณีนี้จะมีเอาต์พุต PWM 13 8 บิต พวกเขาอยู่บนพิน 2 ถึง 13 บวกเอาต์พุตอะนาล็อกอีกสองตัวที่แยกโดย DAC ที่มีความละเอียด 12 บิต
เมื่อคุณพูดถึงความละเอียด 8 บิตหรือ 12 บิตเป็นต้นในเอาต์พุต PWM ประเภทนี้คุณกำลังอ้างถึงห้องสำหรับการซ้อมรบที่คุณมี ด้วย 8 บิตมี 256 ระดับ ซึ่งคุณสามารถเปลี่ยนแปลงได้และ 12 บิตจะสูงถึง 4096 ระดับ
ควบคุมด้วยตัวจับเวลา
สำหรับการควบคุม PWM ฮาร์ดแวร์ Arduino จะใช้ตัวจับเวลา สำหรับมัน. ตัวจับเวลาปัจจุบันแต่ละตัวสามารถให้บริการเอาต์พุต PWM 2 หรือ 3 เอาต์พุต การลงทะเบียนเปรียบเทียบสำหรับแต่ละเอาต์พุตจะเติมเต็มระบบนี้ดังนั้นเมื่อเวลาถึงค่าของรีจิสเตอร์สถานะหรือค่าของเอาต์พุตจะเปลี่ยนไปเพื่อหยุดรอบการทำงานเหล่านั้น แม้ว่าจะมีเอาต์พุตสองตัวที่ควบคุมโดย Timer เดียวกัน แต่ทั้งสองสามารถมี Duty Cycles ที่แตกต่างกันแม้ว่าจะมีความถี่เดียวกันก็ตาม
ในกรณีของตัวจับเวลาที่เชื่อมโยงกับพิน PWM แต่ละตัวจะแตกต่างกันไป ขึ้นอยู่กับประเภทของบอร์ด Arduino ที่คุณมี:
- Arduino UNO, มินิและนาโน:
- จับเวลา 0 - 5 และ 6
- จับเวลา 1 - 9 และ 10
- จับเวลา 2 - 3 และ 11
- Arduino Mega:
- จับเวลา 0 - 4 และ 13
- จับเวลา 1 - 11 และ 12
- จับเวลา 2 - 9 และ 10
- จับเวลา 3 - 2, 3 และ 5
- จับเวลา 4 - 6, 7 และ 8
- จับเวลา 5 - 44, 45 และ 46
รีจิสเตอร์ที่กำหนดไว้ล่วงหน้าจะแบ่งเวลาด้วยจำนวนเต็มและตัวจับเวลาจะทำส่วนที่เหลือเพื่อควบคุมเอาต์พุต PWM ที่เกี่ยวข้อง การแก้ไขค่ารีจิสทรีสามารถเปลี่ยนความถี่ได้ ความถี่ นอกจากนี้ยังจะแตกต่างกันไปขึ้นอยู่กับตัวจับเวลาและแผ่น:
- Arduino UNO, มินิและนาโน:
- Timer0: ช่วยให้สามารถกำหนดขนาดล่วงหน้าได้ที่ 1, 8, 64, 256 และ 1024 ความถี่คือ 62.5 Khz
- Timer1: ด้วยค่าที่ตั้งไว้ล่วงหน้า 1, 8, 64, 256 และ 1024 ด้วยความถี่ 31.25 Khz
- Timer2: เท่ากับ Timer1 เพียง แต่เพิ่ม Prescaling เป็น 32 และ 128 เพิ่มเติมจากรุ่นก่อนหน้า
- Arduino Mega:
- Timer0, 1, 2: เหมือนกับด้านบน
- ตัวจับเวลา 3, 4 และ 5: ด้วยความถี่ 31.25 Khz และกำหนดไว้ล่วงหน้าเป็น 1, 8, 64, 256 และ 1024
ความไม่ลงรอยกันและความขัดแย้ง
ตัวจับเวลา ที่เกี่ยวข้องกับเอาต์พุตไม่ได้มีไว้สำหรับฟังก์ชันนั้นเท่านั้นยังใช้โดยผู้อื่น ดังนั้นหากฟังก์ชันอื่นถูกใช้คุณจะต้องเลือกระหว่างอย่างใดอย่างหนึ่งคุณไม่สามารถใช้ทั้งสองอย่างพร้อมกันได้ ตัวอย่างเช่นสิ่งเหล่านี้คือความเข้ากันไม่ได้ที่คุณจะพบในโครงการของคุณ:
- ห้องสมุด Servo: เมื่อคุณใช้เซอร์โวมอเตอร์ตัวจับเวลาจะถูกใช้อย่างเข้มข้นซึ่งอาจนำไปสู่ความขัดแย้ง ใช้ Timer1 สำหรับ UNO, Nano และ Mini โดยเฉพาะกล่าวคือคุณไม่สามารถใช้พิน 9 และ 10 ได้ในขณะที่คุณใช้ร่างกับไลบรารีนั้น ในเมกะจะขึ้นอยู่กับจำนวนเซอร์โว ...
- SPI: หากใช้การสื่อสาร SPI บนบอร์ด Arduino จะใช้พิน 11 สำหรับฟังก์ชัน MOSI นั่นคือสาเหตุที่ไม่สามารถใช้พิน PWM ได้
- โทน: ฟังก์ชั่นนี้ใช้ Timer2 ในการทำงาน ดังนั้นหากใช้คุณกำลังทำให้พิน 3 และ 11 (หรือ 9 และ 10 สำหรับ Mega) ไร้ประโยชน์
การทดสอบภาคปฏิบัติกับ Arduino
หากคุณต้องการดูว่า PWM ทำงานอย่างไรบน Arduino ในสถานที่สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือเชื่อมต่อโอกาสในการวัดของ โวลต์มิเตอร์หรือมัลติมิเตอร์ (ในฟังก์ชั่นวัดแรงดันไฟฟ้า) ระหว่างพิน PWM ที่คุณเลือกใช้กับพินกราวด์หรือ GND ของบอร์ด Arduino ด้วยวิธีนี้บนหน้าจอของอุปกรณ์วัดคุณจะสามารถดูได้ว่าแรงดันไฟฟ้าเปลี่ยนแปลงไปอย่างไรด้วยเอาต์พุตที่เป็นดิจิตอลด้วยเคล็ดลับ PWM นี้
คุณสามารถเปลี่ยนโวลต์มิเตอร์ / มัลติมิเตอร์เป็น LED เพื่อดูว่าความเข้มของแสงแตกต่างกันอย่างไรโดยใช้มอเตอร์กระแสตรงหรือองค์ประกอบอื่น ๆ ที่คุณต้องการ ฉันทำให้มันง่ายขึ้นในแผนภาพด้วย Fritzing ด้วย LED โดยไม่ต้องมีอีกต่อไป แต่รู้ว่ามันสามารถแสดงถึงเคล็ดลับของมัลติมิเตอร์ได้ ...
หากคุณใช้ LED โปรดจำความต้านทานที่แคโทดและ GND
ไปยัง ซอร์สโค้ด ในการควบคุมไมโครคอนโทรลเลอร์บอร์ด Arduino เพื่อให้ทุกอย่างทำงานได้คุณควรใส่สิ่งนี้ลงใน Arduino IDE (ในกรณีนี้ฉันใช้ PWM พิน 6 ของ Arduino UNO):
const int analogOutPin = 6; byte outputValue = 0; void setup() { Serial.begin(9600); pinMode(ledPIN , OUTPUT); bitSet(DDRB, 5); // LED o voltímetro bitSet(PCICR, PCIE0); bitSet(PCMSK0, PCINT3); } void loop() { if (Serial.available()>0) { if(outputValue >= '0' && outputValue <= '9') { outputValue = Serial.read(); // Leemos la opción outputValue -= '0'; // Restamos '0' para convertir a un número outputValue *= 25; // Multiplicamos x25 para pasar a una escala 0 a 250 analogWrite(ledPIN , outputValue); } } } ISR(PCINT0_vect) { if(bitRead(PINB, 3)) { bitSet(PORTB, 5); // LED on } else { bitClear(PORTB, 5); // LED off } }
สวัสดี. ก่อนอื่นฉันต้องขอขอบคุณสำหรับเวลาที่ทุ่มเทให้กับคำอธิบายใหม่ล่าสุดนี้
ฉันต้องการสอบถามคุณ ฉันพยายามรันโค้ดบนโปรตีอุส 8 อีมูเลเตอร์สำหรับ Arguino Mega ฉันเชื่อมต่อโวลต์มิเตอร์กับพิน 6 Proteus เชื่อมต่อกับพอร์ตอนุกรม แต่ฉันไม่รู้ว่าจะแตกต่างกันอย่างไรเพื่อให้แรงดันไฟฟ้าที่แตกต่างกันออกไป ฉันต้องทำการปรับเปลี่ยนโค้ดเล็กน้อยเพื่อให้คอมไพล์ ขอบคุณมากสำหรับความช่วยเหลือของคุณ