สารบัญ:

ขับเคลื่อนสเต็ปเปอร์มอเตอร์ด้วยไมโครโปรเซสเซอร์ AVR: 8 ขั้นตอน
ขับเคลื่อนสเต็ปเปอร์มอเตอร์ด้วยไมโครโปรเซสเซอร์ AVR: 8 ขั้นตอน

วีดีโอ: ขับเคลื่อนสเต็ปเปอร์มอเตอร์ด้วยไมโครโปรเซสเซอร์ AVR: 8 ขั้นตอน

วีดีโอ: ขับเคลื่อนสเต็ปเปอร์มอเตอร์ด้วยไมโครโปรเซสเซอร์ AVR: 8 ขั้นตอน
วีดีโอ: Stepper Motor Interfacing with AVR Microcontroller 2024, กรกฎาคม
Anonim
ขับเคลื่อนสเต็ปเปอร์มอเตอร์ด้วยไมโครโปรเซสเซอร์ AVR
ขับเคลื่อนสเต็ปเปอร์มอเตอร์ด้วยไมโครโปรเซสเซอร์ AVR

มีสเต็ปเปอร์มอเตอร์ที่ถูกกำจัดจากเครื่องพิมพ์ / ดิสก์ไดรฟ์ / ฯลฯ อยู่รอบ ๆ หรือไม่?

การตรวจสอบด้วยโอห์มมิเตอร์ ตามด้วยรหัสไดรเวอร์ง่ายๆ บนไมโครโปรเซสเซอร์ แล้วคุณจะก้าวอย่างมีสไตล์

ขั้นตอนที่ 1: ทำความรู้จักกับ Steppers

ทำความรู้จักกับ Steppers
ทำความรู้จักกับ Steppers
ทำความรู้จักกับ Steppers
ทำความรู้จักกับ Steppers

โดยพื้นฐานแล้ว คุณจะต้องหาว่าสายไฟเล็กๆ ทั้งหมดไปอยู่ที่ไหน

ขั้นแรกให้หาว่าเป็นมอเตอร์แบบขั้วเดียวหรือแบบไบโพลาร์ ดูที่ Jones on Steppers สำหรับพื้นหลังที่ลึกกว่า จากนั้นที่ไซต์ของ Ian Harries เพื่อดูวิธีง่ายๆ ในการหามอเตอร์ที่ไม่รู้จัก อ่านสักนิด แล้วร่วมชมคำแนะนำเกี่ยวกับมอเตอร์ตัวนี้ที่ฉันได้ราคาถูกมา (ตอนนี้ลดราคาอยู่ 0.99 เหรียญ ตัวเล็ก ค่อนข้างเบา แต่มีแรงบิดไม่มาก ยังไม่รู้ว่าจะดีสำหรับอะไร)

ขั้นตอนที่ 2: ค้นหา Common Ground

หาจุดร่วม
หาจุดร่วม
หาจุดร่วม
หาจุดร่วม

คุณมีสายไฟห้า (หรือสี่หรือหก) มอเตอร์ของคุณจะมีสองส่วน และคุณสามารถบอกได้ด้วยการดูว่าแต่ละเส้นเป็นของด้านใด

หากคุณดูสายไฟเพียงสี่เส้น คุณโชคดี -- เป็นมอเตอร์แบบไบโพลาร์ สิ่งที่คุณต้องทำคือหาว่าสายสองคู่ใดมาต่อกัน หากคุณมีมอเตอร์แบบขั้วเดียวหรือมีสายไฟมากกว่า 4 เส้น คุณจะต้องแยกโอห์มมิเตอร์ออก สิ่งที่คุณกำลังมองหาคือสายสามัญ (กราวด์) สำหรับแต่ละครึ่ง คุณสามารถบอกได้ว่าขั้วใดเป็นกราวด์ในมอเตอร์แบบไบโพลาร์ เพราะมีความต้านทานเพียงครึ่งเดียวต่อขั้วใดขั้วหนึ่งมากกว่าที่ขั้วทั้งสองขั้วทำกัน ภาพเป็นบันทึกของฉันจากการต่อสายไฟเข้ากับสายไฟและสังเกตความต้านทาน (หรือถ้าเชื่อมต่อเลย) คุณจะเห็นว่าสีขาวเป็นพื้นสำหรับทั้งสามตัวล่าง b/c มีความต้านทานครึ่งหนึ่งต่อสีแดงหรือสีน้ำเงินที่พวกเขามีต่อกัน (มอเตอร์ตัวนี้แปลกและไม่มีจุดศูนย์กลางบนขดลวดแม่เหล็กด้านบน เหมือนกับเป็น half-bipolar, half-unipolar บางทีคุณอาจใช้สิ่งนี้เพื่อตรวจจับการหมุนในขดลวดสีแดง-ขาว-น้ำเงินเมื่อขดลวดดำ-เหลือง กำลังขับคอยล์อยู่)

ขั้นตอนที่ 3: คิดออกคำสั่งก้าว

คิดออกคำสั่งก้าว
คิดออกคำสั่งก้าว

ฉันจะขับมอเตอร์นี้เป็นแบบไบโพลาร์ ดังนั้นฉันจึงไม่สนใจสายกราวด์สีขาว ฉันมีเพียงสี่สายที่ต้องกังวล

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

ขั้นตอนที่ 4: นำมอเตอร์ไปทดลองขับ

นำมอเตอร์ไปทดลองขับ
นำมอเตอร์ไปทดลองขับ

หากคุณยังไม่ได้เตรียมเครื่องมือสำหรับการเขียนโปรแกรมไมโครโปรเซสเซอร์ คุณอาจทำได้แย่กว่า Ghetto Development Kit หรือโปรแกรมเมอร์ PIC อื่นๆ ต่อสายไฟเข้ากับ microproc ของคุณโดยตรงแล้วเบิร์นด้วยรหัสต่อไปนี้:

/* เล่นกับการขับเคลื่อนสเต็ปเปอร์มอเตอร์ขนาดเล็ก */

/* รวมฟังก์ชันการหน่วงเวลา */ #define F_CPU 1000000UL #include /* การกำหนดพินสำหรับ ATTiny2313 */ /* ลำดับตามเข็มนาฬิกา */ #define BLUE _BV(PB0) #define BLACK _BV(PB1) #define RED _BV(PB2) #define สีเหลือง _BV(PB3) #define DELAY 200 /* มิลลิวินาทีระหว่างขั้นตอน */ int main(เป็นโมฆะ){ DDRB = 0xff; /* เปิดใช้งานเอาต์พุตบนพิน B ทั้งหมด */ PORTB = 0x00; /* ตั้งค่าทั้งหมดเป็น 0v */ while(1){ /* main loop ที่นี่ */ PORTB = BLUE; _delay_ms(DELAY); PORTB = สีดำ; _delay_ms(DELAY); PORTB = สีแดง; _delay_ms(DELAY); PORTB = สีเหลือง; _delay_ms(DELAY); } } รหัสนั้นง่ายแค่ไหน? ง่ายจริงๆ ทั้งหมดที่ทำได้คือให้คำจำกัดความที่ดี ฉันจึงสามารถอ้างถึงสายไฟตามสีแทนชื่อพินได้ จากนั้นจึงเปิดสลับตามลำดับโดยมีการหน่วงเวลาที่สามารถปรับได้ระหว่างนั้น สำหรับผู้เริ่มต้น ฉันเลือกการหน่วงเวลาครึ่งวินาทีระหว่างขั้นตอนต่างๆ ดูวิดีโอสั้น ๆ สำหรับผลลัพธ์ หากคุณอยู่ในเกมจริงๆ ให้นับจำนวนก้าวต่อรอบเพื่อหาความละเอียดเชิงมุมแบบก้าวเดียวของมอเตอร์ (ใช่แล้ว ป.ล. ขับแบบไม่โหลดที่ 3.6v ง่าย ๆ ดูแบตเตอรี่ในวิดีโอ)

ขั้นตอนที่ 5: แกว่งไปมา

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

int main (เป็นโมฆะ) {const uint8_t ล่าช้า = 50; const uint8_t ตามเข็มนาฬิกา = {สีน้ำเงิน สีดำ สีแดง สีเหลือง}; uint8_t ฉัน; DDRB = 0xff; /* เปิดใช้งานเอาต์พุตบนพิน B ทั้งหมด */ PORTB = 0x00; /* ตั้งค่าทั้งหมดเป็น 0v */ while(1){ /* main loop here */ for (i=0; i<=3; i++){ /* เลื่อนดูสีตามเข็มนาฬิกา */ PORTB = ตามเข็มนาฬิกา; _delay_ms(ล่าช้า); } for (i=3; i>=0; i--){ /* เลื่อนดูสี ccw */ PORTB = ตามเข็มนาฬิกา; _delay_ms(ล่าช้า); } }} ดูวิดีโอที่มีชีวิตชีวาสำหรับการกลับไปกลับมา

ขั้นตอนที่ 6: ฉันไม่เคยครึ่งก้าวเพราะฉันไม่ใช่ครึ่งก้าว…

นอกจากเนื้อเพลงของ Quest แล้ว การขยับมอเตอร์ของคุณไปครึ่งหนึ่งก็อยู่ตรงที่ คุณจะได้รับกระแสไฟสูงสุด แรงบิดที่เร็วขึ้น และความละเอียดเชิงมุมเป็นสองเท่า สรุปสั้นๆ: แทนที่จะใช้สีน้ำเงิน สีดำ สีแดง สีเหลือง สีเหลือง สีเหลือง+สีน้ำเงิน ผลที่ได้คือครึ่งหนึ่งของเวลาที่คุณใช้แม่เหล็กทั้งสองอย่างพร้อมกัน และในช่วงเวลาที่ทั้งสองชุดทำงาน มอเตอร์จะชี้ไปครึ่งทางระหว่างทั้งสอง ทำให้มุมระหว่าง "ขั้น" เล็กลง และทำให้มอเตอร์หมุนได้อย่างราบรื่นมากขึ้น คุณสามารถบอกได้จากวิดีโอ? ฉันไม่แน่ใจ… ตอนนี้ส่วนของโค้ดที่ทำ half-stepping มีลักษณะดังนี้:

เป็นโมฆะ halfStepping (ล่าช้า uint16_t, ทิศทาง uint8_t ) { uint8_t i; สำหรับ (i=0; i<=3; i++) { PORTB = ทิศทาง; /* ส่วนขดลวดเดี่ยว */ _delay_ms(ดีเลย์); PORTB |= ทิศทาง[i+1]; /* เพิ่มในครึ่งขั้นตอน */ _delay_ms(delay); }} คำสั่ง PORTB แรกตั้งค่าขั้วเดียวเป็นค่าบวก และส่วนที่เหลือทั้งหมดเป็นค่าลบ จากนั้นก็รอ จากนั้นคำสั่ง PORTB ที่สองจะตั้งค่าขั้วที่สอง (บนขดลวดอีกอัน) ให้เป็นค่าบวก โดยเข้ายึดขดลวดทั้งสองเพื่อ 1.4x ของแรงบิด (และ 2x ของกระแสไฟฟ้า) รายชื่อโปรแกรมเต็มรูปแบบแนบมาด้านล่าง ขณะนี้มีการกำหนดอาร์เรย์สองชุด (ตามเข็มนาฬิกา ทวนเข็มนาฬิกา) และทั้งสองมีองค์ประกอบ 5 องค์ประกอบเพื่อให้รายการ i+1 ในฟังก์ชัน halfStepping

ขั้นตอนที่ 7: เพิ่มไดรเวอร์มอเตอร์

เพิ่มไดรเวอร์มอเตอร์
เพิ่มไดรเวอร์มอเตอร์
เพิ่มไดรเวอร์มอเตอร์
เพิ่มไดรเวอร์มอเตอร์
เพิ่มไดรเวอร์มอเตอร์
เพิ่มไดรเวอร์มอเตอร์

จนถึงตอนนี้ดีมาก

ปัญหาเดียวคือมอเตอร์ดูเหมือนจะไม่มีแรงบิดมากพอ ซึ่งอาจเป็นเพราะไมโครโปรเซสเซอร์จะจ่ายไฟเพียง ~50mA ต่อพินเท่านั้น ขั้นตอนต่อไปที่ชัดเจนคือการเชื่อมต่อกับไดรเวอร์มอเตอร์เพื่อให้มีน้ำผลไม้มากขึ้น แต่แล้วค่อยคิดอีกทีว่า ฉันแค่ขับมันด้วย 5v และความต้านทานของขดลวดอยู่ที่ ~ 125 โอห์ม ซึ่งหมายความว่ามอเตอร์ดึงเพียง 40mA ต่อพินเท่านั้นและควรขับเคลื่อนด้วยชิป AVR (อ้วน!) เพื่อให้ได้แรงดันไฟที่มากขึ้นในการขับมอเตอร์ ฉันจึงต่อเข้ากับชิป SN754410 H-bridge วงจรค่อนข้างง่าย แต่ละพินจาก AVR จะไปที่อินพุต และพินเอาต์พุตที่สอดคล้องกันจะไปที่มอเตอร์ ชิปต้องการ 5v สำหรับส่วนลอจิกและสามารถรับแรงดันไฟฟ้าได้มากขึ้นในส่วนมอเตอร์ การใช้งาน 11.25v (แบตเตอรี่ 3.6v สามก้อน) ช่วยได้เล็กน้อย แรงบิดมากขึ้นอย่างเห็นได้ชัดกับนิ้วของฉัน แต่ก็ยังไม่ใช่โรงไฟฟ้า ไม่เลวสำหรับมอเตอร์ที่มีขนาดเล็กกว่านิกเกิล และตอนนี้วงจรได้กลายเป็นไดร์เวอร์สเต็ปเปอร์มอเตอร์แบบไบโพลาร์เอนกประสงค์ เพิ่มเมื่อ 29 พ.ย.: เมื่อคืนขับมอเตอร์ที่ 12v ชั่วขณะหนึ่งและเริ่มร้อนขึ้น ฉันไม่แน่ใจว่ามันเป็นปัญหาความถี่เรโซแนนซ์หรือว่ามันเป็นกระแสมากเกินไปสำหรับขดลวด ไม่ว่าจะด้วยวิธีใด โปรดใช้ความระมัดระวังหากคุณกำลังขับมอเตอร์ขนาดเล็กที่มีแรงดันไฟฟ้าสูงกว่านี้

ขั้นตอนที่ 8: จุดจบ

แล้วฉันได้เรียนรู้อะไร? การขับสเต็ปเปอร์มอเตอร์ด้วย AVR (และชิป H-bridge) นั้นค่อนข้างง่าย แม้ในโหมดครึ่งก้าว "แฟนซี"

ยังไม่แน่ใจว่าฉันจะทำอย่างไรกับสเต็ปเปอร์มอเตอร์ตัวเล็ก ข้อเสนอแนะใด ๆ

แนะนำ: