PWM: จำลองพินอะนาล็อกด้วยบอร์ด Arduino ของคุณ

สัญญาณ PWM

ด้วยพินดิจิตอลและอนาล็อกซึ่งคุณสามารถใช้บนบอร์ด 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

บัส Arduino I2C

ตอนนี้คุณรู้แล้วว่ามันทำงานอย่างไรมาดูกรณีเฉพาะของ 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

Arduino PWM schematic พร้อม LED

หากคุณต้องการดูว่า 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  
   } 
} 
ฉันแนะนำให้คุณเล่นกับค่าและดู ผลลัพธ์เกี่ยวกับแสงหรือโวลต์มิเตอร์. โปรแกรมสามารถรับค่าตั้งแต่ 0 ถึง 9 เพื่อให้คุณเห็นว่าทุกอย่างแตกต่างกันอย่างไร สำหรับข้อมูลเพิ่มเติมฉันแนะนำให้คุณ หลักสูตร arduino ที่เรามีให้ดาวน์โหลดฟรี ...

ความคิดเห็นฝากของคุณ

แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   โฮเซ dijo

    สวัสดี. ก่อนอื่นฉันต้องขอขอบคุณสำหรับเวลาที่ทุ่มเทให้กับคำอธิบายใหม่ล่าสุดนี้
    ฉันต้องการสอบถามคุณ ฉันพยายามรันโค้ดบนโปรตีอุส 8 อีมูเลเตอร์สำหรับ Arguino Mega ฉันเชื่อมต่อโวลต์มิเตอร์กับพิน 6 Proteus เชื่อมต่อกับพอร์ตอนุกรม แต่ฉันไม่รู้ว่าจะแตกต่างกันอย่างไรเพื่อให้แรงดันไฟฟ้าที่แตกต่างกันออกไป ฉันต้องทำการปรับเปลี่ยนโค้ดเล็กน้อยเพื่อให้คอมไพล์ ขอบคุณมากสำหรับความช่วยเหลือของคุณ