- ส่วนประกอบที่จำเป็น
- คำอธิบายพินของเซอร์โวมอเตอร์
- แผนภูมิวงจรรวม
- การควบคุมเซอร์โวมอเตอร์ด้วย AVR ATmega16
- การเขียนโปรแกรม Atmega16 โดยใช้ USBasp
เซอร์โวมอเตอร์ใช้กันอย่างแพร่หลายในกรณีที่ต้องการการควบคุมที่แม่นยำเช่นหุ่นยนต์เครื่องจักรกลอัตโนมัติแขนหุ่นยนต์เป็นต้นอย่างไรก็ตามขอบเขตของเซอร์โวมอเตอร์ไม่ได้ จำกัด อยู่เพียงเท่านี้และสามารถใช้งานได้หลากหลาย หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับพื้นฐานทฤษฎีและหลักการทำงานของเซอร์โวมอเตอร์ตามลิงค์
ก่อนหน้านี้เราได้เชื่อมต่อ Servo Motor กับไมโครคอนโทรลเลอร์หลายตัว:
- การเชื่อมต่อเซอร์โวมอเตอร์กับ ARM7-LPC2148
- การเชื่อมต่อเซอร์โวมอเตอร์กับ MSP430G2
- การเชื่อมต่อเซอร์โวมอเตอร์กับ STM32F103C8
- การเชื่อมต่อเซอร์โวมอเตอร์กับไมโครคอนโทรลเลอร์ PIC โดยใช้ MPLAB และ XC8
- การเชื่อมต่อ Servo Motor กับ Arduino Uno
- เซอร์โวมอเตอร์เชื่อมต่อกับไมโครคอนโทรลเลอร์ 8051
ในบทช่วยสอนนี้เราจะเชื่อมต่อไมโครเซอร์โวมอเตอร์กับไมโครคอนโทรลเลอร์ Atmega16 AVRโดยใช้ Atmel Studio 7.0 เซอร์โวมอเตอร์ได้รับการจัดอันดับให้ทำงานใน 4.8-6V เราสามารถควบคุมมุมการหมุนและทิศทางของมันได้โดยใช้สัญญาณพัลส์เทรนหรือ PWM โปรดทราบว่าเซอร์โวมอเตอร์ไม่สามารถเคลื่อนที่ได้สำหรับการหมุน 360 องศาเต็มรูปแบบดังนั้นจึงใช้ในกรณีที่ไม่จำเป็นต้องหมุนต่อเนื่อง มุมการหมุนคือ 0 -180 องศาหรือ (-90) - (+90) องศา
ส่วนประกอบที่จำเป็น
- SG90 Tower Pro ไมโครเซอร์โวมอเตอร์
- Atmega16 ไมโครคอนโทรลเลอร์ IC
- 16Mhz คริสตัลออสซิลเลเตอร์
- ตัวเก็บประจุ 100nF สองตัว
- ตัวเก็บประจุ 22pF สองตัว
- ปุ่มกด
- สายจัมเปอร์
- เขียงหั่นขนม
- USBASP v2.0
- LED (สีใดก็ได้)
คำอธิบายพินของเซอร์โวมอเตอร์
- สีแดง = แหล่งจ่ายไฟบวก (4.8V ถึง 6V)
- สีน้ำตาล = พื้นดิน
- สีส้ม = สัญญาณควบคุม (พิน PWM)
แผนภูมิวงจรรวม
เชื่อมต่อทุกองค์ประกอบดังแสดงในแผนภาพด้านล่างเพื่อหมุนเซอร์โวมอเตอร์ที่ใช้ไมโครคอนโทรลเลอร์ตระกูล AVR มีพิน PWM สี่พินเราสามารถใช้พิน PWM ของ Atmega16 ได้ ในบทช่วยสอนนี้เราใช้ Pin PD5 (OC1A) ในการสร้าง PWM PD5 เชื่อมต่อโดยตรงกับสายสีส้มของเซอร์โวมอเตอร์ซึ่งเป็นขาสัญญาณอินพุต เชื่อมต่อไฟ LED สีใดก็ได้สำหรับไฟแสดงสถานะ นอกจากนี้ให้เชื่อมต่อปุ่มกดหนึ่งปุ่มในพินรีเซ็ตเพื่อรีเซ็ต Atmega16 เมื่อจำเป็น เชื่อมต่อ Atmega16 กับวงจรออสซิลเลเตอร์คริสตัลที่เหมาะสม ระบบทั้งหมดจะใช้พลังงานจากแหล่งจ่าย 5V
การตั้งค่าเสร็จสมบูรณ์จะมีลักษณะดังนี้:
การควบคุมเซอร์โวมอเตอร์ด้วย AVR ATmega16
เช่นเดียวกับ Stepper Motor เซอร์โวมอเตอร์ไม่จำเป็นต้องมีไดรเวอร์ภายนอกเช่นไดรเวอร์มอเตอร์ ULN2003 หรือ L293D เพียงแค่ PWM ก็เพียงพอแล้วที่จะขับเคลื่อนเซอร์โวมอเตอร์และการสร้าง PWM จากไมโครคอนโทรลเลอร์ก็ทำได้ง่ายมาก แรงบิดของเซอร์โวมอเตอร์นี้คือ 2.5 กก. / ซม. ดังนั้นหากคุณต้องการแรงบิดที่มากขึ้นเซอร์โวนี้จะไม่เหมาะสม
ดังที่เราทราบว่าเซอร์โวมอเตอร์แสวงหาพัลส์ทุกๆ 20 มิลลิวินาทีและความยาวของพัลส์บวกจะกำหนดมุมการหมุนของเซอร์โวมอเตอร์
ความถี่ที่ต้องการเพื่อให้ได้พัลส์ 20ms คือ 50Hz (f = 1 / T) ดังนั้นสำหรับเซอร์โวมอเตอร์นี้ข้อกำหนดระบุว่าสำหรับ 0 องศาเราต้องการ 0.388ms สำหรับ 90 องศาเราต้องการ 1.264ms และ 180 องศาเราต้องการพัลส์ 2.14ms
ในการสร้างพัลส์ที่ระบุเราจะใช้ Timer1 ของ Atmega16 ความถี่ของ CPU คือ 16Mz แต่เราจะใช้เพียง 1Mhz เนื่องจากเราไม่มีอุปกรณ์ต่อพ่วงที่เชื่อมต่อกับไมโครคอนโทรลเลอร์มากนักและไมโครคอนโทรลเลอร์ก็ไม่ได้โหลดมากนักดังนั้น 1Mhz จะทำงานได้ Prescaler ถูกตั้งค่าเป็น 1 ดังนั้นนาฬิกาจะถูกแบ่งเป็น 1Mhz / 1 = 1Mhz (1uS) ซึ่งดีมาก Timer1จะใช้เป็นโหมด Fast PWM เช่นโหมด 14 คุณสามารถใช้โหมดต่างๆของตัวจับเวลาเพื่อสร้างรถไฟชีพจรที่ต้องการ ข้อมูลอ้างอิงได้รับด้านล่างและคุณสามารถค้นหาคำอธิบายเพิ่มเติมได้ในเอกสารข้อมูลทางการของ Atmega16
ในการใช้ Timer1 เป็นโหมดPWM ที่รวดเร็วเราจะต้องมีค่า TOP ของ ICR1 (Input Capture Register1) หากต้องการค้นหาค่า TOP ให้ใช้สูตรที่ระบุด้านล่าง:
f pwm = f cpu / nx (1 + ด้านบน)
สิ่งนี้สามารถทำให้ง่ายขึ้นเพื่อ
TOP = ( f cpu / ( f pwm xn)) - 1
โดยที่ N = มูลค่าของ Prescaler set
f cpu = ความถี่ของ CPU
f pwm =ความกว้างพัลส์เซอร์โวมอเตอร์ซึ่งเป็น 50Hz
ตอนนี้คำนวณค่า ICR1 เนื่องจากเรามีค่าทั้งหมดที่ต้องการ
N = 1, f cpu = 1MHz, f pwm = 50Hz
เพียงใส่ค่าในสูตรด้านบนเราก็จะได้
ICR1 = 2542
ซึ่งหมายความว่าจะบรรลุระดับสูงสุดคือ 180 0 ICR1 ควรเป็น 1999
สำหรับคริสตัล 16MHz และ Prescaler ตั้งค่าเป็น 16 เราจะมี
ICR1 = 4999
ตอนนี้เรามาดูภาพร่างกันดีกว่า
การเขียนโปรแกรม Atmega16 โดยใช้ USBasp
รหัส AVR ที่สมบูรณ์สำหรับการควบคุมเซอร์โวมอเตอร์ได้รับด้านล่าง รหัสเป็นเรื่องง่ายและสามารถเข้าใจได้ง่าย
ที่นี่เราได้เข้ารหัส ATmega16 เพื่อหมุนเซอร์โวมอเตอร์จาก 0 0ไป 180 0และกลับมาอีกครั้งจาก 180 0ไป 0 0 การเปลี่ยนแปลงนี้จะเสร็จสมบูรณ์ใน 9 ขั้นตอน ได้แก่ 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0 สำหรับความล่าช้าเราจะใช้ไลบรารีภายในของ Atmel Studio เช่น
เชื่อมต่อ USBASP v2.0 ของคุณและปฏิบัติตามคำแนะนำในการเชื่อมโยงนี้ในการเขียนโปรแกรมไมโครคอนโทรลเลอร์ตระกูล AVR ATmega16 ใช้ USBASP และ Atmel สตูดิโอ 7.0 เพียงแค่สร้างร่างและอัปโหลดโดยใช้ toolchain ภายนอก
รหัสที่สมบูรณ์พร้อมวิดีโอสาธิตได้รับด้านล่าง เรียนรู้เพิ่มเติมเกี่ยวกับเซอร์โวมอเตอร์โดยการรับรู้ความสำคัญใน Robotics