▼
22 ก.พ. 2012
ไดร์เวอร์ง่ายด้วย Arduino
ส่วนที่ 1 (ความเร็วสูงสุดของขั้นบันได)
ไปที่ส่วนที่ 2 (ปรับค่าสูงสุด Stepper Current)
ไปที่ส่วนที่ 3 (เปิดเครื่อง)
คลิกที่นี่เพื่อดูและดาวน์โหลดการออกแบบ PCB ที่ใช้วงจรนี้
สิ่งสำคัญที่ควรทราบเกี่ยวกับ stepper คือความเร็วสูงสุดที่แม่มดสามารถขับเคลื่อนได้
หากต้องการทราบข้อมูลนี้คุณสามารถทำตามLINKนี้ได้
คุณต้อง knwo ข้อมูลจำเพาะของ stepper ของคุณ
สำหรับ stepper ของฉัน:
แรงดันไฟฟ้า: 12v
เหนี่ยวนำ: 46 + -20% mH แล้วฉันจะ 50
ขั้นตอนต่อการปฏิวัติ: มุมองศา = 1.8 º 360 / 1.8 = 200 ขั้นตอน / หมุน
ปัจจุบัน: 0.33 A i ใช้ 135 mA เนื่องจากมี
ไดรเวอร์ง่ายคุณสามารถ ปรับกระแสไฟฟ้าสูงสุด
กับโพลาเรนติโอมิเตอร์
(ฉันจะอธิบายเรื่องนี้ในโพสต์ในอนาคต)
จากนั้นค่อยคำนวณจากลิงก์ก่อนหน้านี้:
T = 50 * 0.135 * 2/12 = 1.125 ms สำหรับขั้นตอนเดียว
การกำหนดค่าเริ่มต้นของ EasyDriver คือขั้นที่แปด:
T = 1.125 / 8 = 0.140 ms = 140 เราสำหรับขั้นตอนเดียว
ให้เราใช้ prescaler ของ 128 สำหรับ Timer2 (ดู coments ในรหัส)
128/16000000 = 0.000008 s-1 = 8 เรา -1 (ความถี่ของโปรเซสเซอร์ ใน
Arduino Uno คือ 16 MHz) ตัว
จับเวลา 2 ทำหน้าที่นับตัวนับทุก 8 ตัวแล้ว 140/8 = 17.5
จากนั้นเราจะตั้งโปรแกรม Counter สำหรับ Timer2 ถึง 18 (18 = ceil (17.5)) เนื่องจากว่าเราประสบความสำเร็จ ของ Timer2 ทุก 18 * 8us = 144 เรา
และความเร็วสำหรับ stepper ของเราจะเป็น: 144 เรา * 1600 ขั้นตอน / การปฏิวัติ = 0.2304 s / การปฏิวัติ
ที่ 1 / 0.2304 = 4.34 Revolutions / s ซึ่งเป็น aproximation กับความเร็วจริง, เนื่องจากมีความล่าช้าเป็นพิเศษระหว่างขั้นตอนที่นำมาใช้โดยโค้ดเอง (อาจล่าช้าเกิน 20 ครั้ง)
หากต้องการดูการทำงานนี้คัดลอกรหัสต่อไปนี้ Arduino IDE ตั้งค่าที่เหมาะสมสำหรับตัวแปรนี้
microSteping
stepsPerRev
ลิตร
วี
ไอแมกซ์
และเรียกใช้
โปรแกรมนี้ยังดำเนินการ desacceleration เร่ง - คุณสามารถเปลี่ยนปริมาณของการเร่งความเร็วโดยเปลี่ยนค่าของตัวแปร 'accelDuring' (ตัวอย่างเช่นจะเร่งตัวเองในระหว่าง 10 ขั้นตอนโดยใช้ความเร็วคงที่และสุดท้ายจะทำการ desaccelerates ในช่วง 10 ขั้นตอน)
ถ้าคุณไม่ต้องการเร่งตั้งให้เป็น 0 (ค่าที่ยอมรับคือ 0 - 255)
//http://www.daycounter.com/Calculators/Stepper-Motor-Calculator.phtml // Rev / sec = V / (L * 2 * Imax) / (ขั้นตอน / รอบ) (Imax en A, L en mili Herns) pe 12 / (46 * 2 * 0.33) / 200 // T = L * Imax * 2 / V (T MiliSegons / ขั้นตอน) # define DIR_PIN 7 #define STEP_PIN 6 # define sbi (sfr, bit ) (sfr | = _BV ( บิต )) // a l'antiga manera cbi () i sbi () ลูกกำลังฟังก์ชั่น obsoletes #define cbi (sfr, bit ) (sfr & = ~ (_BV ( บิต ))) // MS1 MS2 ความละเอียด // LL 00 เต็มขั้น (2 เฟส) // HL 10 ครึ่ง ขั้นตอนที่ // LH 01 ขั้นตอนที่สี่ // HH 11 ขั้นตอนที่แปด // // ต่อนาทีโดยใช้ไดรเวอร์ a la easy MS1 = MS2 = HIGH float microStepping = 8; // Valor establert a la easyDriver (MS1, MS2) stepsPerRev ยาว = 200; // característica del motor float l = 50; // = 46 + - 20% (เอ pitjor dels casos ES 55.2) característicaเดลมอเตอร์ ลอย v = 12; // característicaเดลมอเตอร์ ลอย IMAX = 0.135; / / mesurat amb el tester (ผลหารเฉลี่ยต่อ 2 (hi ฮ่า 2 bobines)) / / amb la EasyDriver podem controlar iMax abm el potenciòmetme ลอย ocr2a; / / valor de OCR2A (นามสกุลเดอลา velocitat whichxima del Stepper) int ocr2aIni; // valor inicial de OCR2A donada l'acceleració int accelDuring = 10; / / Accelera i desaccelera durant 10 ขั้นตอน int downCounter = accelDuring; // el nombre d'ขั้นตอนที่คุณจะได้รับการจัดเตรียมที่เหมาะสม int upCounter = accelDuring; // เอ nombre d'ขั้นตอน que falten ครีบ acabar แมงacceleració int accelDelta; // valor en que varia OCR2A เร่งรัดการเร่งความเร็ว // (โปรดดูที่ 255 a 19 en 10 decremeta de 23 en 23 i começa a 249) stepsLeft ระยะยาว = 0; // nombre d'steps que manque per acabar boolean = false ; // มอเตอร์กำลังทำงานอยู่? การตั้งค่าเป็นโมฆะ () { unsigned int usDelay; // temps d'espera entre ขั้นตอนในเรา อนุกรม เริ่มต้น (115200); pinMode (DIR_PIN, OUTPUT ); pinMode (STEP_PIN, OUTPUT ); usDelay = l * 2000 * iMax / v / microStepping; // temps d'espera entre steps en microsegons (T = L * Imax * 2 / V (T MiliSegons / step)) ocr2a = ceil (( float ) usDelay / 8.0); // l'mes donat l'interval del Timer2 (8 เรา) อนุกรม println (ocr2a); if (accelDuring> 0) { accelDelta = (255 - int (ocr2a)) / accelDuring; // OCR2A พัสระเดลใส่ mes เหมาะสม 255 ครีบ ocr2a // เอลกล้าหาญ que มิ้มการคำนวณต่อลา velocitat Maxima อนุกรม println (accelDelta); if (accelDelta <= 0) { if (ocr2a <255) { // la durada de l 'acceleracióไม่มี pot ser tan gran com esperem accelDelta = 1; ocr2aIni = 255; accelDuring = 255 - ocr2a; / / แม็กซ์เดรซี } else { // ocr2a = 255 ไม่มีการเพิ่มความเร็วในการรับชม accelDelta = 0; accelDuring = 0; ocr2aIni = ocr2a; } } else // acceleració segons la definitionió ocr2aIni = ocr2a + accelDelta * accelDuring ;; // calcula el OCR2A เกี่ยวกับการดำเนินคดีโดยเด็ดขาด } else // no hi ha acceleració ocr2aIni = ocr2a; อนุกรม println (ocr2aIni); setTimer2 (ocr2aIni); อนุกรม พิมพ์ ( "Inter Step Delay:" ); อนุกรม พิมพ์ (usDelay); อนุกรม println ( "us" ); อนุกรม พิมพ์ ( "ความเร็วสูงสุด:" ); อนุกรม พิมพ์ (60000000.0 / (( float ) stepsPerRev * microStepping * (usDelay)))); อนุกรม println ( "RPM" ); อนุกรม พิมพ์ ( "Inter Step Delay programat a Timer2:" ); อนุกรม println (( int ( ceil ((ลอย ) usDelay / 8.0))) * 8); อนุกรม พิมพ์ ( "ความเร็วสูงสุดจริง:" ); อนุกรม พิมพ์ (60,000,000.0 / ((ลอย ) stepsPerRev * * * * * * * * microstepping (( int ( ceil ((ลอย ) usDelay / 8.0))) * 8))); } //// nVoltes ยาว = 1; nSteps ยาว = nVoltes * stepsPerRev * microStepping; void loop () { if (! running) { ล่าช้า (1000); driveStepper (n ก้าว); nSteps = -n ก้าว; } } //// void driveStepper ( long lnSteps) { int dir = (lnSteps> 0)? สูง : ต่ำ ; digitalWrite (DIR_PIN, dir); lnSteps = abs (lnSteps); OCR2A = ocr2aIni; // reinicialitza el contador (permaci accelació) upCounter = accelDuring; downCounter = accelDuring; ทำงาน = true ; stepsLeft = ln ก้าว; } //// void setTimer2 ( int lusDelay) { //http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM // ATmega328P มีตัวจับเวลาสามตัวที่เรียกว่า Timer 0, Timer 1 และ Timer 2 // ตัวจับเวลาแต่ละตัวมีเอาท์พุทสองตัวเปรียบเทียบการลงทะเบียน // แต่ละตัวจับเวลามี prescaler ที่สร้างนาฬิกาจับเวลาด้วยการหาร // นาฬิการะบบด้วยปัจจัย Prescale เช่น 1, 8, 64, 256 หรือ 1024 // โปรดสังเกตว่า Timer 2 มีค่า Prescale ที่แตกต่างจาก Timers อื่น ๆ // Arduino มีนาฬิการะบบของ 16MHz และความถี่นาฬิกาจับเวลาจะเป็น / / ความถี่นาฬิการะบบหารด้วยปัจจัย Prescale / / ตัวจับเวลายังสามารถสร้าง interrupts เมื่อล้นและ / หรือตรงกับทั้งเอาท์พุทลงทะเบียนเปรียบเทียบ / / / TCCRnA และ TCCRnB . ตัวจับเวลา / ตัวนับการควบคุมลงทะเบียนถือบิตควบคุมหลัก / / สำหรับจับเวลา (โปรดสังเกตว่า TCCRnA และ TCCRnB ไม่สอดคล้องกับเอาท์พุท A และ B) // TCCRnA และ TCCRnB มีหลายกลุ่มของบิต: // บิตโหมดโหมดการสร้างคลื่น (WGM): ควบคุมโหมดโดยรวมของตัวจับเวลา // บิต เลือกบิต ( TCCRnA และ TCCRnB) // นาฬิกาเลือกบิต (CS): เหล่านี้ควบคุม prescaler นาฬิกา/ เปรียบเทียบ Match Output บิตโหมด (COMnA): เหล่านี้เปิด / ปิด / invert output / / เปรียบเทียบ จับคู่เอาต์พุต B บิตโหมด (COMnB): เหล่านี้เปิด / ปิด / แปลงกลับเอาต์พุต B // // OCRnA และ OCRnB Output Compare Registers ตั้งค่าระดับที่เอาท์พุต A และ B จะส่งผลต่อ // // TIMSK2 - Timer2 การบันทึกหน้าจอขัดจังหวะ // OCIE2B: Timer2 เอาต์พุตเปรียบเทียบ Match B ขัดจังหวะเปิดใช้งาน // OCIE2A: Timer2 เอาต์พุตเปรียบเทียบ Match A Interrupt เปิดใช้งาน // TOIE2: Timer2 Interflow Overflow เปิดใช้งาน // // Timer 1 เป็นตัวตั้งเวลา 16 บิตและมีโหมดเพิ่มเติม Timer 2 มีค่า Prescaler ที่แตกต่างกัน // // Arduino ใช้ Timer 0 ภายในสำหรับฟังก์ชัน millis () และ delay () // OC0A pin 6 OC0B pin 5 // OC1A pin 9 OC1B pin 10 // OC2A pin 11 OC2B pin 3 CLI (); // plana 10. บิต 7 ล้าง interrupts cbi (TCCR2A, COM2A0); // plana 158 ตาราง 17-2. การทำงานของพอร์ตปกติ OC0A ถูกตัดการเชื่อมต่อ cbi (TCCR2A, COM2A1); / 00 deconecta el pin ตัวจับเวลา del timer2 cbi (TCCR2A, WGM20); / / TCCR2A Regitre ตัวควบคุมเดลจับเวลา 2 sbi (TCCR2A, WGM21); // plana 160 i 149. ล้างตัวจับเวลาบน Compare cbi (TCCR2B, WGM22); / / WGM2 = 010 ==> โหมดการทำงาน Clear Timer on Compare (CTC) // ค่าตัวนับ TCNT2 เพิ่มขึ้นจนกระทั่ง TCNT2 == OCR2A, // และตัวนับ (TCNT2) จะถูกลบออก // repeteix el cilce 0 -> ความกล้าหาญ (valor clocks) sbi (TCCR2B, CS22); / / TCCR2B Regitre B ควบคุมการตั้งเวลา 2 cbi (TCCR2B, CS21); // Plana 162 sbi (TCCR2B, CS20); // CS2 = 101 prescaler = 128 ==> 128 / 16.000.000 = 0.000008 s-1 = 8us-1 / / ที่ใกล้เคียงกับที่ = 8 * 255 = 2040 เรา sbi (TIMSK2, OCIE2A); // Timer2 เอาท์พุทเปรียบเทียบ Match A Interrupt Enable พลานา 163 cbi (ASSR, AS2); // AS2 = 0 clocked จากนาฬิกา I / O // plana 164. Asynchronous Status Register // เมื่อ AS2 เขียนเป็นศูนย์ Timer / Counter2 จะถูกโอเวอร์คล็อกจากนาฬิกา I / O, clkI / O // เมื่อ AS2 ถูกเขียนไปยัง Timer / Counter2 จะถูกโอเวอร์คล็อกจาก Oscillator คริสตัล / / เชื่อมต่อกับ Timer Oscillator 1 (TOSC1) pin OCR2A = lusDelay; // si pe OCR2A = 21 -> 21 * 0.000008 = 168us-1 cridem la funcio ตำรวจ cop cada 168 เรา พลานา 162 TCNT2 = 0; // reset Timer2 counter เซอิ (); // Enable Interrupts } //// void stopTimer2 () { cbi (TIMSK2, OCIE2A); // Timer2 เอาท์พุทเปรียบเทียบ Match A Interrupt Disable plana 163 } //// ISR (TIMER2_COMPA_vect) { / / จับเวลา 2 เอาท์พุทเปรียบเทียบเปรียบเทียบ A ขัดจังหวะ / / คำนิยาม dels พาหะ Arduino \ hardware \ tools \ avr \ avr \ include \ iom328p.h / / นิยามสำหรับ ATmega328P ถ้า (stepsLeft> 0) { if (stepsLeft = = downCounter) { // ha de desaccelerar downCounter--; OCR2A + = accelDelta; // incrementa el temps entre Steps en CS22: 0 เรา (ขั้นตอนที่เหมาะสม es produirà 8 เรา mard tard) } else if (upCounter> 0) { // ha d' accelar upCounter--; OCR2A - = accelDelta; // decrementa el temps entre ขั้นตอนใน CS22: 0 เรา (ขั้นตอนที่เหมาะสม es produirà 8 เรา abans) } digitalWrite (STEP_PIN, HIGH ); / / envia el pols a la EasyDriver ต่อavançarขั้นตอนที่ 1 digitalWrite (STEP_PIN, LOW ); // การเปลี่ยนจากต่ำไปสูงในอินพุต STEP จะทำหน้าที่เป็นตัวแปล // และเพิ่มความเร็วทีละขั้น // ความกว้างของพัลส์ขั้นต่ำ STEP 1.0 μs (plana 7 de 'A3967.pdf') // intrccio NOP triga 1 นาฬิกา (0,0625 us = 62.5 ns) ต่อ ท้าย // la instrucció digitalWrite ha de trigar més de 16 Clocks / / mirar el codi a 'wiring_digital.c' // segons els forums 'digitalWrite ()' ตั้งค่าเริ่มต้น 6 i 9 เรา / / depenent de si el port es PWM o no // http://www.arduino.cc/ cgi-bin / yabb2 / YaBB.pl? NUM = 1230286016 stepsLeft--; } อื่น // para el motor running = false ; } ////
ลิงก์ไปยังโพสต์นี้
สร้างลิงก์