วันศุกร์ที่ 27 กรกฎาคม พ.ศ. 2561

ไดเวอร์ (อ้างอิง) xavierstechno.blogspot.com/2012/02/easy-driver-with-arduino.html?m=1


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 ;
  } ////
  
  

ไม่มีความคิดเห็น:

แสดงความคิดเห็น