สารบัญ:

Arduino Timers: 8 โครงการ: 10 ขั้นตอน (พร้อมรูปภาพ)
Arduino Timers: 8 โครงการ: 10 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Timers: 8 โครงการ: 10 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Timers: 8 โครงการ: 10 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Arduino Timer Control Relay Devices 2024, พฤศจิกายน
Anonim
Arduino Timers: 8 โครงการ
Arduino Timers: 8 โครงการ

Arduino Uno หรือ Nano สามารถสร้างสัญญาณดิจิตอลที่แม่นยำบนหมุดเฉพาะ 6 ตัวโดยใช้ตัวจับเวลาในตัวสามตัว พวกเขาต้องการเพียงไม่กี่คำสั่งในการตั้งค่าและไม่ต้องใช้รอบ CPU เพื่อรัน!

การใช้ตัวจับเวลาอาจเป็นเรื่องน่ากลัวหากคุณเริ่มต้นจากแผ่นข้อมูลแบบเต็มของ ATMEGA328 ซึ่งมี 90 หน้าสำหรับคำอธิบายโดยเฉพาะ! คำสั่ง Arduino ในตัวหลายคำสั่งใช้ตัวจับเวลาอยู่แล้ว เช่น millis(), delay(), tone(), AnalogWrite() และ servo library แต่หากต้องการใช้พลังเต็มที่ คุณจะต้องตั้งค่าผ่านรีจิสเตอร์ ฉันแบ่งปันมาโครและฟังก์ชันบางอย่างที่นี่เพื่อให้ง่ายและโปร่งใสยิ่งขึ้น

หลังจากภาพรวมคร่าวๆ ของตัวจับเวลาแล้ว ให้ทำตาม 8 โครงการเจ๋งๆ ที่อาศัยการสร้างสัญญาณด้วยตัวจับเวลา

ขั้นตอนที่ 1: ส่วนประกอบที่จำเป็น

ส่วนประกอบที่จำเป็น
ส่วนประกอบที่จำเป็น

ในการสร้างทั้ง 8 โครงการ คุณจะต้อง:

  • Arduino Uno หรือเข้ากันได้
  • โล่ต้นแบบพร้อมมินิโปรโตบอร์ด
  • สายจัมเปอร์เขียงหั่นขนม 6 สาย
  • จัมเปอร์เขียงหั่นขนมสั้น 6 ชิ้น (ทำด้วยตัวเองจากลวดเชื่อมแกนแข็ง 10 ซม.)
  • สายจระเข้2ตัว
  • 1 สีขาว 5 มม. LED
  • ตัวต้านทาน 220 โอห์ม
  • ตัวต้านทาน 10kOhm
  • โพเทนชิโอมิเตอร์ 10kOhm
  • ตัวเก็บประจุเซรามิก 1muF 2 ตัว
  • ตัวเก็บประจุ 10muF อิเล็กโทรไลต์ 1 ตัว
  • 2 ไดโอด 1n4148 หรือใกล้เคียง
  • ไมโครเซอร์โวมอเตอร์ 2 ตัว SG90
  • ลำโพง 8 โอห์ม 1 ตัว
  • ลวดเคลือบบาง 20 ม. (0.13 มม.)

ขั้นตอนที่ 2: ภาพรวมของ Arduino Timers สำหรับการสร้างสัญญาณ

Timer0 และ timer2 เป็นตัวจับเวลาแบบ 8 บิต ซึ่งหมายความว่าสามารถนับได้มากที่สุดตั้งแต่ 0 ถึง 255 Timer1 เป็นตัวจับเวลาแบบ 16 บิต ดังนั้นจึงสามารถนับได้ถึง 65535 ตัวจับเวลาแต่ละตัวมีขาออกที่เกี่ยวข้องกันสองพิน: 6 และ 5 สำหรับตัวจับเวลา0, 9 และ 10 สำหรับตัวจับเวลา1, 11 และ 3 สำหรับตัวจับเวลา2 ตัวจับเวลาจะเพิ่มขึ้นในแต่ละรอบนาฬิกาของ Arduino หรือในอัตราที่ลดลงตามปัจจัยก่อนสเกลซึ่งก็คือ 8, 64, 256 หรือ 1024 (32 และ 128 ได้รับอนุญาตสำหรับตัวจับเวลาด้วย 2) ตัวนับเวลาตั้งแต่ 0 ถึง 'TOP' แล้วทำซ้ำอีกครั้ง (PWM แบบเร็ว) หรือลงด้านล่าง (PWM ที่ถูกต้องในเฟส) ค่าของ 'TOP' จึงเป็นตัวกำหนดความถี่ พินเอาต์พุตสามารถตั้งค่า รีเซ็ต หรือพลิกค่าของ Output Compare Register ได้ ดังนั้นขาเอาต์พุตจะกำหนดรอบการทำงาน เฉพาะตัวจับเวลา1 เท่านั้นที่มีความสามารถในการตั้งค่าความถี่และรอบการทำงานอย่างอิสระสำหรับพินเอาต์พุตทั้งสอง

ขั้นตอนที่ 3: LED Blink

Image
Image
LED Blink
LED Blink
LED Blink
LED Blink

ความถี่ต่ำสุดที่สามารถเข้าถึงได้ด้วยตัวจับเวลา 8 บิตคือ 16MHz/(511*1024)=30, 6Hz เพื่อให้ LED กะพริบด้วย 1Hz เราต้องใช้ตัวจับเวลา1 ซึ่งสามารถเข้าถึงความถี่ที่เล็กกว่า 256 เท่า 0.12 Hz

เชื่อมต่อ LED กับขั้วบวก (ขายาว) กับพิน 9 และเชื่อมต่อแคโทดกับตัวต้านทาน 220 โอห์มกับกราวด์ อัปโหลดรหัส ไฟ LED จะกะพริบที่ 1Hz โดยมีรอบการทำงาน 50% ฟังก์ชัน loop() ว่างเปล่า: ตัวจับเวลาเริ่มต้นที่ setup() และไม่ต้องดำเนินการใดๆ เพิ่มเติม

ขั้นตอนที่ 4: LED Dimmer

Image
Image
ไฟ LED หรี่
ไฟ LED หรี่
ไฟ LED หรี่
ไฟ LED หรี่

การปรับความกว้างพัลส์เป็นวิธีที่มีประสิทธิภาพในการควบคุมความเข้มของ LED ด้วยไดรเวอร์ที่เหมาะสม จึงเป็นวิธีที่นิยมใช้ในการควบคุมความเร็วของมอเตอร์ไฟฟ้า เนื่องจากสัญญาณเปิดอยู่ 100% หรือปิด 100% จึงไม่สูญเสียพลังงานไปกับความต้านทานแบบอนุกรม โดยพื้นฐานแล้วมันเหมือนกับการกะพริบไฟ LED เร็วกว่าที่ตาจะติดตามได้ โดยหลักการแล้ว 50Hz นั้นเพียงพอแล้ว แต่อาจดูเหมือนสั่นเล็กน้อย และเมื่อ LED หรือดวงตาขยับ อาจส่งผลให้เกิด 'เส้นทาง' ที่ไม่ต่อเนื่องที่น่ารำคาญ การใช้พรีสเกล 64 พร้อมตัวจับเวลา 8 บิต เราจะได้ 16MHz/(64*256)=977Hz ซึ่งเหมาะสมกับวัตถุประสงค์ เราเลือก timer2 เพื่อให้ timer1 ยังคงใช้งานได้สำหรับฟังก์ชันอื่นๆ และเราจะไม่รบกวนฟังก์ชัน Arduino time() ซึ่งใช้ timer0

ในตัวอย่างนี้ รอบการทำงาน และด้วยเหตุนี้ความเข้มจึงถูกควบคุมโดยโพเทนชิออมิเตอร์ LED ดวงที่สองสามารถควบคุมได้อย่างอิสระด้วยตัวจับเวลาเดียวกันที่ขา 3

ขั้นตอนที่ 5: ตัวแปลงดิจิทัลเป็นอนาล็อก (DAC)

Image
Image
ตัวแปลงดิจิตอลเป็นอนาล็อก (DAC)
ตัวแปลงดิจิตอลเป็นอนาล็อก (DAC)
ตัวแปลงดิจิตอลเป็นอนาล็อก (DAC)
ตัวแปลงดิจิตอลเป็นอนาล็อก (DAC)

Arduino ไม่มีเอาต์พุตอนาล็อกที่แท้จริง โมดูลบางตัวใช้แรงดันอนาล็อกเพื่อควบคุมพารามิเตอร์ (แสดงคอนทราสต์ เกณฑ์การตรวจจับ ฯลฯ) ด้วยตัวเก็บประจุและตัวต้านทานเพียงตัวเดียว คุณสามารถใช้ตัวจับเวลา1 เพื่อสร้างแรงดันไฟฟ้าแอนะล็อกที่มีความละเอียด 5mV หรือดีกว่าได้

ตัวกรองสัญญาณความถี่ต่ำสามารถ 'เฉลี่ย' สัญญาณ PWM เป็นแรงดันอนาล็อกได้ ตัวเก็บประจุเชื่อมต่อผ่านตัวต้านทานไปยังขา PWM คุณสมบัติถูกกำหนดโดยความถี่ PWM และค่าของตัวต้านทานและตัวเก็บประจุ ความละเอียดของตัวจับเวลา 8 บิตจะเป็น 5V/256=20mV ดังนั้นเราจึงเลือกใช้ Timer1 เพื่อให้ได้ความละเอียด 10 บิต วงจร RC เป็นฟิลเตอร์กรองความถี่ต่ำลำดับแรกและจะมีระลอกคลื่นบ้าง มาตราส่วนเวลาของวงจร RC ควรมากกว่าระยะเวลาของสัญญาณ PWM มากเพื่อลดการกระเพื่อม ช่วงเวลาที่เราได้รับสำหรับความแม่นยำ 10 บิตคือ 1024/16MHz= 64mus หากเราใช้ตัวเก็บประจุ 1muF และตัวต้านทาน 10kOhm RC=10ms การกระเพื่อมจากจุดสูงสุดสู่จุดสูงสุดอยู่ที่ 5V*0.5*T/(RC)=16mV สูงสุด ซึ่งถือว่าเพียงพอแล้วที่นี่

โปรดทราบว่า DAC นี้มีอิมพีแดนซ์เอาต์พุตที่สูงมาก (10kOhm) ดังนั้นแรงดันไฟฟ้าจะลดลงอย่างมากหากดึงกระแสไฟ เพื่อหลีกเลี่ยงปัญหาดังกล่าว มันสามารถบัฟเฟอร์ด้วย opamp หรือสามารถเลือกชุดค่าผสมของ R และ C อื่นได้ เช่น 1kOhm กับ 10muF

ในตัวอย่าง เอาต์พุต DAC ถูกควบคุมด้วยโพเทนชิออมิเตอร์ แชนเนล DAC อิสระที่สองสามารถรันด้วยตัวจับเวลา1 บนพิน 10

ขั้นตอนที่ 6: เครื่องเมตรอนอม

Image
Image
เครื่องเมตรอนอม
เครื่องเมตรอนอม
เครื่องเมตรอนอม
เครื่องเมตรอนอม

เครื่องเมตรอนอมช่วยติดตามจังหวะเมื่อเล่นเพลง สำหรับพัลส์ที่สั้นมาก เอาต์พุตตัวจับเวลาของ Arduino สามารถป้อนโดยตรงไปยังลำโพง ซึ่งจะทำให้มีเสียงคลิกที่ได้ยินชัดเจน ด้วยโพเทนชิออมิเตอร์ ความถี่ในการตีสามารถควบคุมได้ตั้งแต่ 40 ถึง 208 ครั้งต่อนาที ใน 39 ขั้นตอน จำเป็นต้องใช้ Timer1 เพื่อความแม่นยำที่ต้องการ ค่าของ 'TOP' ซึ่งกำหนดความถี่ ถูกแก้ไขภายในฟังก์ชัน loop() และต้องให้ความสนใจ! คุณเห็นที่นี่ว่าโหมด WGM แตกต่างจากตัวอย่างอื่นๆ ที่มีความถี่คงที่: โหมดนี้ด้วย TOP ที่ตั้งค่าโดยการลงทะเบียน OCR1A มีการบัฟเฟอร์สองเท่าและป้องกัน TOP ที่หายไปและเกิดความผิดพลาดที่ยาวนาน อย่างไรก็ตาม นี่หมายความว่าเราสามารถใช้เอาต์พุตพินได้เพียง 1 พินเท่านั้น

ขั้นตอนที่ 7: สเปกตรัมเสียง

Image
Image
สเปกตรัมเสียง
สเปกตรัมเสียง
สเปกตรัมเสียง
สเปกตรัมเสียง

มนุษย์สามารถได้ยินความถี่เสียงมากกว่า 3 ระดับ ตั้งแต่ 20Hz ถึง 20kHz ตัวอย่างนี้สร้างคลื่นความถี่เต็มด้วยโพเทนชิออมิเตอร์ ตัวเก็บประจุ 10muF วางอยู่ระหว่างลำโพงและ Arduino เพื่อป้องกันกระแสไฟตรง Timer1 สร้างคลื่นสี่เหลี่ยม โหมดการสร้างรูปคลื่นที่นี่คือ PWM ที่ถูกต้องตามเฟส ในโหมดนั้น ตัวนับจะเริ่มนับถอยหลังเมื่อถึงด้านบน ซึ่งส่งผลให้พัลส์ที่มีค่าเฉลี่ยคงที่ แม้ว่ารอบการทำงานจะแตกต่างกันไป อย่างไรก็ตาม มันยังส่งผลให้เกิดช่วงเวลาที่ (เกือบ) เป็นสองเท่า และมันเพิ่งเกิดขึ้นที่พรีสเกล 8 นั้น timer1 ครอบคลุมสเปกตรัมที่ได้ยินทั้งหมดโดยไม่จำเป็นต้องเปลี่ยนพรีสเกล นอกจากนี้ เนื่องจากค่าของ TOP กำลังเปลี่ยนแปลงขณะเดินทาง การใช้ OCR1A เป็นตัวบนช่วยลดจุดบกพร่อง

ขั้นตอนที่ 8: เซอร์โวมอเตอร์

Image
Image
เซอร์โวมอเตอร์
เซอร์โวมอเตอร์
เซอร์โวมอเตอร์
เซอร์โวมอเตอร์

มีไลบรารีเซอร์โวที่ทรงพลัง แต่ถ้าคุณมีเซอร์โวเพียงสองตัวที่จะขับ คุณก็อาจทำโดยตรงด้วยตัวจับเวลา1 เช่นกัน ซึ่งจะทำให้ CPU ใช้หน่วยความจำน้อยลง และหลีกเลี่ยงการขัดจังหวะ เซอร์โว SG90 ยอดนิยมใช้สัญญาณ 50Hz และความยาวพัลส์จะกำหนดตำแหน่ง เหมาะสำหรับจับเวลา1. ความถี่ได้รับการแก้ไข ดังนั้นทั้งเอาต์พุตบนพิน 9 และพิน 10 สามารถใช้บังคับเซอร์โวได้อย่างอิสระ

ขั้นตอนที่ 9: Voltage Doubler and Inverter

แรงดันไฟดับเบิ้ลและอินเวอร์เตอร์
แรงดันไฟดับเบิ้ลและอินเวอร์เตอร์
แรงดันไฟดับเบิ้ลและอินเวอร์เตอร์
แรงดันไฟดับเบิ้ลและอินเวอร์เตอร์
แรงดันไฟดับเบิ้ลและอินเวอร์เตอร์
แรงดันไฟดับเบิ้ลและอินเวอร์เตอร์

บางครั้งโครงการของคุณต้องการแรงดันไฟฟ้าที่สูงกว่า 5V หรือแรงดันลบ อาจเป็นการเรียกใช้ MOSFET เพื่อเรียกใช้องค์ประกอบ piezo เพื่อขับเคลื่อน opamp หรือรีเซ็ต EEPROM หากการดึงกระแสไฟมีขนาดเล็กเพียงพอ สูงถึง ~5mA ปั๊มชาร์จอาจเป็นวิธีแก้ปัญหาที่ง่ายที่สุด: เพียง 2 ไดโอดและตัวเก็บประจุสองตัวที่เชื่อมต่อกับสัญญาณพัลซิ่งจากตัวจับเวลาทำให้ Arduino 5V เป็น 10V เพิ่มขึ้นสองเท่า ในทางปฏิบัติ มีไดโอด 2 หยด ดังนั้นในทางปฏิบัติจะเหมือนกับ 8.6V สำหรับตัวทวีคูณ หรือ -3.6V สำหรับอินเวอร์เตอร์

ความถี่ของคลื่นสี่เหลี่ยมควรจะเพียงพอที่จะปั๊มประจุที่เพียงพอผ่านไดโอด ตัวเก็บประจุ 1muF จะเคลื่อนที่ 5muC ของการเปลี่ยนแปลงเมื่อแรงดันไฟฟ้าเปลี่ยนแปลงระหว่าง 0 ถึง 5V ดังนั้นสำหรับกระแส 10mA ความถี่ต้องมีอย่างน้อย 2kHz ในทางปฏิบัติ ความถี่ที่สูงขึ้นจะดีกว่า เนื่องจากช่วยลดการกระเพื่อม ด้วยการนับเวลา 2 จาก 0 ถึง 255 โดยไม่มีพรีสเกล ความถี่คือ 62.5kHz ซึ่งทำงานได้ดี

ขั้นตอนที่ 10: การถ่ายโอนพลังงานแบบไร้สาย

Image
Image
การถ่ายโอนพลังงานแบบไร้สาย
การถ่ายโอนพลังงานแบบไร้สาย
การถ่ายโอนพลังงานแบบไร้สาย
การถ่ายโอนพลังงานแบบไร้สาย

ไม่ใช่เรื่องแปลกที่จะชาร์จนาฬิกาอัจฉริยะโดยไม่ต้องใช้สายเคเบิล แต่ก็สามารถเป็นส่วนหนึ่งของโครงการ Arduino ได้อย่างง่ายดาย ขดลวดที่มีสัญญาณความถี่สูงสามารถถ่ายโอนพลังงานไปยังอีกขดลวดที่อยู่ใกล้เคียงผ่านการเหนี่ยวนำโดยไม่ต้องสัมผัสทางไฟฟ้า

ขั้นแรกเตรียมขดลวด ฉันใช้ม้วนกระดาษขนาดเส้นผ่านศูนย์กลาง 8.5 ซม. และลวดเคลือบเส้นผ่านศูนย์กลาง 0.13 มม. เพื่อทำ 2 ม้วน: ม้วนหลัก 20 รอบ ม้วนรอง 50 รอบ การเหนี่ยวนำตัวเองของขดลวดประเภทนี้ที่มีขดลวด N และรัศมี R คือ ~5muH * N^2 * R ดังนั้นสำหรับ N=20 และ R=0.0425 ให้ L=85muH ซึ่งได้รับการยืนยันโดยผู้ทดสอบส่วนประกอบ เราสร้างสัญญาณที่มีความถี่ 516kHz ส่งผลให้มีอิมพีแดนซ์ 2pi*f*L=275Ohm ซึ่งสูงพอที่ Arduino จะไม่เกิดกระแสเกิน

เพื่อให้ขดลวดทำงานได้อย่างมีประสิทธิภาพสูงสุด เราต้องการใช้แหล่งจ่ายไฟฟ้ากระแสสลับที่แท้จริง มีเคล็ดลับที่สามารถทำได้: เอาต์พุตสองตัวของตัวจับเวลาสามารถรันในเฟสตรงข้าม โดยการกลับเอาต์พุตตัวใดตัวหนึ่ง เพื่อให้คล้ายกับคลื่นไซน์มากยิ่งขึ้น เราใช้ PWM ที่ถูกต้องตามเฟส ด้วยวิธีนี้ระหว่างพิน 9 ถึง 10 แรงดันไฟฟ้าจะสลับกันระหว่างทั้ง 0V, พิน 9 +5V, ทั้ง 0V, พิน 10 +5V เอฟเฟกต์จะแสดงในรูปภาพจากการติดตามขอบเขต (ด้วยพรีสเกล 1024 ขอบเขตของเล่นนี้ไม่มีแบนด์วิดท์มากนัก)

ต่อคอยล์หลักกับพิน 9 และ 10 ต่อ LED เข้ากับคอยล์ทุติยภูมิ เมื่อนำขดลวดทุติยภูมิมาใกล้ขดลวดปฐมภูมิ ไฟ LED จะสว่างขึ้น

แนะนำ: