avatar_Mucit23

L297 – L298 ile Step Motor Sürücü

Başlatan Mucit23, 23 Ekim 2012, 09:22:39

Mucit23

Merhabalar arkadaşlar.

Bu aralar üzerinde çalıştıtığım motor sürücüsünü sizlerle paylaşmak isterim.  Sistemi yapmaya başlayalı aslında epeyce oluyor. Fakat işlerin yoğunluğundan dolayı anca bitirebildim.

Sürücü genel olarak tasarlandı. Yani herhangi özel bir amaca hizmet etmiyor. Kısacası Step motorların çalışmasını gözlemlemek amacıyla yapıldı diyebilirim. Yapmış olduğum sürücü ile 1.8 veya 7.5 adım açısına sahip step motorlarda kullanılabilir. Motoru Tam ve Yarım sürüş modunda sürebilirsiniz. Ayrıca daha önce set edilen devire tek tuşla çıkartabilirsiniz.  Veya  motoru adım adım hareket ettirebilirsiniz.

Buna benzer birkaç özellik ekledim :)

Başlıktan da anlaşılacağı üzere Sürücü kısmında L297 ve L298 ikilisini kullandım. Bu iki entegre sayesinde step motor üzerinde birçok işlem yapabiliyoruz/

L297 adım motor kontrol entegresidir, Girişine uygulanan kontrol ve clock sinyalleri ile çıkışında adım motorun faz sinyallerini üretmektedir.

L298 ise H-bridge motor sürücü entegresidir. içerisinde iki adet H köprüsü bulunup birçok alanda kullanılabilir. Max 2A/phase akım verebilir.

Ana kontrolcü olarak her zamanki gibi pic16f628 :) ve yapılan işlemleri görüntülemek içinde 2X8 LCD kullandım. L297 nin clock frekansını pic16F628 'in RB3 pini yani Donanımsal PWM modülünden veriyorum. Ayrıca L297'nin Enable, CW-CCW ve HALF/FULL  pinlerinide 16F628 ile kontrol ediyorum. Donanımım genel olarak böyle.

Sistemin Şeması aşağıdaki gibidir.

Sistemi kurarken L297' nin ilk sayfasında verilen şemayı birebir uyguladım. Buna Rağmen sürüş şeklinden pek memnun kaldığım söylenemez. Bu durumda L298 ile birlikte çalışırken L297' nin akım değerini düşürmeme rağmen  akım kontrolünü iyi yapamadı. Düşük devirlerde motoru titretiyor.Bu konu üzerinde epeyce ugraştim ama pek bir gelişme kaydedemedim.

Devrenin beslemesinde Lm2575 kullandığım için 40V a kadar besleme gelirimi verebilirsiniz. Ben testlerimde 39V' un üzerine çıkmadım. Tüm testlerim de bu seviyede yaptım. Buna rağmen yüksek devirlerde gerçekten problem oluyor. 1.8 dereceli motorlarda 200 - 250 rpm e kadar, 7.5 adım açılı motorlarda  ise  300-400 rpm'ye kadar problemsiz çıkabiliyorum. Bu devirlerden sonra motor rezonansa giriyor ve duruyor. Bunu bir türlü aşamadım. Yaptığım sistemdeki en büyük sorunlardan biride bu olacak ki sanırım besleme voltajını dahada arttırmak gerekiyor.

Dediğim gibi Sistemin testlerini yaparken çeşitli step motorlarda denedim. Bunların hepsi 1.8 ve 7.5 adım açısına sahip, yazıcılardan tarayıcılardan söktüğüm ve daha önce CNC için satın almış olduğum bipolar ve unipolar motorlardı. L297 nin Clock palsini 16F62'in HPWM donanımı ile elde ettiğim için 4 Mhz osc frekansı ile min 250Hz alabiliyorum. Maximun frekans ise benim elimde olmasına rağmen şimdilik ben 3333hz ile sınırladım. Bu frekansın yeterli olduğunu düşündüm.

Yeri Gelmişken söylemek isterim. Simülasyon denemelerimi isis ortamında yaptım. İsiste 2x8 LCD bulunmadığı için 2X16 kullandım. Boyut dışında aralarında hiçbir fark yoktur. Niye ekranın yarısını kullandın diye sormayın sakın :)

Sistemin kullanımı şöyledir.

Normal çalışmada ekran görüntüsü yan şekildeki gibidir


Burada üst satırda Motorun devri gösterilir. işlemcinin PWM donanımından çıkan frekansı bildiğimiz için Motoru devrini motoun adım açısını ve sürüş modunu baz alarak hesaplayabiliyoruz. Örneğin. resimdeki gibi 7.5 derecelik bir motoru tam adımda sürdüğümüzü düşünelim. Motor 360 derecelik bir turunu 48 adımda tamamlar. Bu elde edilen değerlerden sonra devri hesaplamanın birkaç yolu var. Örneğin dakikadaki clock sayısını hesaplayıp 1 turdaki adım sayısına bölerseniz devir bilgisini elde etmiş olursunuz. Fakat frekans değeri büyüdükçe sayılarda büyüyeceği için ben dakikada 1 tur döndüğünü varsayarak sn kaç tur döneceğini hesapladım. Bu elde ettiğim katsayıyı frekans değeriyle çarparsanız yine devri elde etmiş olursunuz. Yani Devir=PWM_Freq*(60/1 Turdaki Adım sayısı)

250hz için hesaplarsak 250*(60/48)=312.5 dev/dak olarak bulunur. Aynı hesabı 1.8 derece için yaparsak 250*(60/200)=75 dev/dak olarak bulunur. Eğer Sürüş Modu FULL yerine HALF seçilirse bu değerler yarı yarıya düşer.

Devrede 6 adet buton var. Bunlar Sırasıyla Start, Stop, Up, Down, DRC ve  Set Butonlarıdır.

  • Up Butonu ile motor devri arttırılır. 1.8 derecelik motorlarda max. değer 1041, 7.5 derecelik motorlarda ise max. değer 4339 RPM dir.
  • Down Butonu ise Up butonunun tam tersi iş görür. 1.8 derecede min. RPM değeri 75 devir, 75 Derecelik motorlarda ise 312 devir/dakikadır.
  • Start Butonu Önceden set edilmiş bir devire rampalı bir şekilde çıkılmasını sağlar.
  • Stop Butonu ise Motoru rampalı bir şekilde yavaşlatıp durdurur
  • DRC Butonu Motor devir yönünü değiştirmeye yarar. Motoru yumuşak bir şekilde durdurup devir yönünü değiştirdikten sonra eski devrine yumuşak bir şekilde çıkartır.
  • Set Butonu ise Motorla ilgili parametrelerin girileceği menüye girilmesi sağlanır.

Şimdi Parametrelere bakalım.

İlk Menü Step_Ang Menüsüdür Buradan Motorun Step açısı seçilir. Şimdilik 1.8 ve 7.5 olmak üzere 2 seçenek var. Menüler arası gezme sadece set butonu ile olur.

Bir Sonraki adım Driv_Mod parametresidir. Görevi belli zaten. Motorun Tam adımdamı yoksa Yarım adım modundamı sürüleceğini belirliyorsunuz.

Daha Sonra Soft_Strt RPM Menüsü Gelir. Bu menüde Ana Çalışma modunda Start butonuna bastığınızda motorun hangi devire çıkacağını belirlediğiniz menüdür.

Bir Sonraki Adımda ise Soft_Strt Acc Menüsüne gelirsiniz. Start butonuna bastığınızda motor istenilen devire birden çıkamaz. Belli bir rampayı tırmanarak çıkması gerekir. İşte bu menüde rampaya tırmanış hızını belirlersiniz. 1 ile 10 arasında bir değer vermeniz gerekir. 1 değerini verdiğinizde motor hızlı, 10 değerini verdiğinizde ise motor yavaş bir şekilde istenilen devire çıkar.

Ayarlar Bunlardan ibaret. Bu menüden sonra çıkmak için set butonuna basmanız yeterlidir. Ayarlar kaydedilip ana çalışmaya dönülür.

Yeri gelmişken söyliyeyim. PWM donanımının yapısından dolayı Yüksek frekanslarda PWM çözünürlüğü düşüyor. Aynı zamanda frekans artışındaki lineerlikde bozuluyor. Bu durumdan dolayı frekans yükseldikçe motor daha hızlı hızlanmaya başlıyor. Bu dengesizlik düzetilebilirdim fakat şuanda işlemcinin hafızasında yer kalmadığı için uğraşmadım.

Son olarak birde Step_Mod menüsü vardırki bu menüye girmek için Ana çalışma modunda   Set butonuna yaklaşık 2 sn boyunca ekranda Step_Mod Yazısını görünceye kadar basmanız gerekmektedir. Step Mod özelliği aslında son anda aklıma geldi. Dedim bari yapmışken motoru adım adımda sürebilelim. :) Bu menüdeUp ve Down Butonlarıyla Motoru adım adım hareket ettirebilirsiniz. DRC butonuna basıp motorun sürüş şeklini değiştirebilirsiniz. Menüden çıkmak için yine Set butonuna basmanız gerekir. Genel olarak ayarlar böyle. Yazı sonundaki videoda daha net görebilirsiniz.

Baskı devre aşağıdaki gibidir.


Görüldüğü üzere Beslemede Lm2575 kullandım. Bu yüzden en fazla 40V ile besleyebilirsiniz. L298 max. 46V gelirimle çalışır Eğer LM2575HV serisini kullanırsanız 46V a kadar verebilirsiniz. Baskı devrede LM2575 in altında giriş kondansatörü var. Bu kondansatör min. 50V'luk olması gerekiyor. Yazmayı unutmuşum.

PCB konusunda biraz uğraştım gerçekten. Çizimi devam ettirirken özellikle L297 ve L298 Çevresini tamamlamak bayağı vaktimi aldı. Birçok yerde padler arasından 1-2 yol geçirmem gerekti. Durumun böyle olması tabi PCB basımını birazcık zorlaştırıyor. Bu konuda biraz tecrübeli olmak gerekiyor sanırım.

L298 e Mutlaka soğutucu bağlanmalıdır. Ben denemelerimde aşırı akım yüzünden 1 tanesini bozdum. Çok kolay bozulabilen bir enteğre olduğu için iyi soğutulması gerekiyor. Benim kullandığım soğutucu PCB üzerine çizdiğimle aynıdır. Normalde bir anakart üzerinden sökmüştüm. Dedim bari boşa gitmesin burada değerlendireyim. Öylede oldu. Birde PCB ye Fan yeri koydum. Fakat buradada ufak bir tasarım hatası yapmışım. Fanlar 12V ile çalışır. Eğer cihazı 12V ile besliyorsanız sıkıntı yok ama 30-40V ile besliyorsanız mutlaka fan üzerinde yine LM2575 li bir devre kurarak voltajı sabitlemelisiniz.






Gördüğünüz üzere Soğutucu Oldukça cins bir yapıya sahip. :D  Piyasada bulmanız pek mümkün görünmüyor.

Aşağıda Bu iş için hazırladığım yazılımı görebilirsiniz.
****************************************************************
'*  Name    : Step_Motor_Kontrol.BAS                            *
'*  Author  : [Ferhat YOL]                                      *
'*  Notice  : Rev 1.5                                           *
'*          :                                                   *
'*  Date    : 17.09.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   : [url=http://www.arectron.com]www.arectron.com[/url]                                  *
'*          :                                                   *
'****************************************************************
'---------------------------Device Configuration--------------------------------
DEFINE OSC 4

@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF

TRISA=%00111111
TRISB=$00
PORTA=$00
PORTB=$00

CMCON=7

'------------------------------LCD_Configuration--------------------------------
DEFINE LCD_DREG   PORTB
DEFINE LCD_DBIT   4
DEFINE LCD_RSREG  PORTB
DEFINE LCD_RSBIT  1
DEFINE LCD_EREG   PORTB
DEFINE LCD_EBIT   2
DEFINE LCD_LINES  2
DEFINE LCD_BITS   4
'-----------------------------PWM Configuration---------------------------------   
T2CON = %00000110
PR2=249                    ;Default PWM frequency (250Hz)
DEFINE CCP1_REG   PORTB
DEFINE CCP1_BIT   3
'----------------------input and output configuration---------------------------
symbol  Mot_Start= PORTA.0
SYMBOL  Mot_Stop = PORTA.1
symbol  UP       = PORTA.2
SYMBOL  DOWN     = PORTA.3
symbol  Mot_Drec = PORTA.4
symbol  SET      = PORTA.5
symbol  Mot_CCW  = PORTA.6
SYMBOL  Mot_Mod  = PORTB.0
sYMBOL  Mot_Enb  = PORTA.7
'-------------------------Variables and Constants-------------------------------
PWM_Duty         con 50          ;Value for Duty
MAX_FREQ         CON 17          ;249=500Hz - 18=3333Hz
PWM_Freq         var word        ;PWM Frequency
Calc_Duty        var WORD        ;Calculated Value of Duty
Motor_RPM        var word        ;Value of MotorRPM
Set_Motor_RPM    var word        ;Soft Start Speed Value
Btn_Syc          var WORD        ;
Max_RPM          var word        ;     
Min_RPM          VAR WORD        ;
Mot_Num_Step     var word        ;A round number of steps the motor
Mot_Step_Ang     var byte        ;Motor step angle
Mot_Old_Freq     var byte        ;
Soft_Start_Stage var byte        ;
Index            VAR BYTE
Char             var byte
i                var byte
Char_Adres       var byte
LCD_Adres        var byte        ;LCD adres
LCD_LINE         VAR BYTE
Temp             var BYTE        ;
Driving_Mode     var BIT         ;Motor Driving Mode, 0=Half, 1=Full
PWM_Status       var BIT         ;1=PWM Enable, 0=PWM Disable
Step_Select      var bit

  READ $0,Mot_Step_Ang
  Read $2,Set_Motor_Rpm.LOWBYTE
  READ $3,SET_MOTOR_RPM.HIGHBYTE
  If Set_Motor_Rpm>1100 then Set_Motor_rpm=0
  read $4,Soft_Start_Stage:IF Soft_Start_Stage>10 then Soft_Start_Stage=1
  IF MOT_STEP_ANG<>18 AND Mot_Step_Ang<>75 then Mot_Step_Ang=18

PAUSE 200
GOSUB LCD_CLEAR
GOSUB LOADING
Load_Prog:
  GOSUB LCD_CLEAR
  PWM_STATUS=0:BTN_SYC=0
  read $1,Driving_Mode:If Driving_Mode>1 then Driving_Mode=0
  LCD_LINE=$C0:gosub Mot_Mod_Write
  lcdout $FE,$C5,dec1 MOT_STEP_ANG DIG 1,",", DEC1 MOT_STEP_ANG DIG 0 
Main:

  IF UP=0 THEN
       IF PWM_STATUS=0 THEN
         GOSUB PWM_ON
         GOSUB PWM_DUTY_UPDATE
         GOTO JUMP
       ENDIF
    PR2=PR2-1
    IF PR2<MAX_FREQ THEN
       PR2=MAX_FREQ
       GOSUB PWM_DUTY_UPDATE
       GOTO JUMP
    ENDIF
    WHILE UP=0
      Btn_SYC=Btn_SYC+1
      PAUSE 5
      IF btn_SYC>100 THEN
        btn_SYC=100
        PR2=PR2-1
        IF PR2<MAX_FREQ THEN
          PR2=MAX_FREQ
          GOSUB PWM_DUTY_UPDATE
          GOTO JUMP
        ENDIF
      endIF
      GOSUB PWM_DUTY_UPDATE
      gOSUB Mot_RPM_Calc
    WEND
    btn_syc=0
    GOSUB PWM_Duty_Update
  ENDIF

  IF DOWN=0 and PWM_Status=1  THEN
    PR2=PR2+1
    WHILE DOWN=0
      BTN_SYC=BTN_SYC+1
      PAUSE 5
      IF BTN_SYC>100 THEN
        BTN_SYC=100
        PR2=PR2+1
        IF PR2>249 THEN
        PR2=249:gosub PWM_OFF
        ENDIF
        GOSUB PWM_DUTY_Update
        GOSUB Mot_RPM_Calc
      ENDIF
    WEND
    IF PR2>249 THEN
    PR2=249:gosub PWM_OFF
    ENDIF
    BTN_SYC=0
    GOSUB PWM_DUTY_UPDATE
  endif

  JUMP:WHILE UP=0 OR DOWN=0:PAUSE 1:WEND

  gOSUB Mot_RPM_Calc

  IF PWM_Status=1 then 
    IF Mot_Drec=0 THEN
      GOSUB Motor_Direction
    endIF

    If Mot_Stop=0 tHEN
      GOSUB Motor_Stop
    ENDIF
    ELSE
    IF Mot_Start=0 then
      GOSUB PWM_ON
      GOSUB Motor_Start
    endIF
  endIF

  IF SET=0 THEN
    gosub PWM_OFF
    WHILE SET=0
      Btn_SYC=Btn_SYC+1
      PAUSE 5
      IF btn_SYC>400 THEN
        btn_SYC=0
        GOSUB PWM_OFF
        GOTO STEP_MOD
      endIF
    WEND
    btn_syc=0
    GOTO SET_MENU
  ENDIF

GOTO Main

Mot_Mod_Write:

  IF Driving_Mode=1 then
    FOR i=0 TO 3
      iNDEX=52+i
      GOSUB SET_CHAR
      LCD_ADRES=LCD_LINE+i
      GOSUB LCD_WRITE
    NEXT
    Mot_Mod=0
    ELSE
    FOR i=0 TO 3
      iNDEX=48+i
      GOSUB SET_CHAR
      LCD_ADRES=LCD_LINE+i
      GOSUB LCD_WRITE
    NEXT
    Mot_Mod=1
  endif
return

PWM_Duty_UpDate:                  ;Updated Value of Duty Section
   Calc_Duty=(PR2+1)*pwm_Duty/25
   CCP1CON.4=Calc_Duty.0
   CCP1CON.5=Calc_Duty.1
   CCPR1L=Calc_Duty>>2
return

Mot_RPM_Calc:

IF PWM_Status=1 then
  PWM_Freq=62500/(PR2+1)
else
  PWM_Freq=0
enDIF

IF Mot_Step_Ang=18 then  ; 1.8 Degree Motor(200Step/tour-Full)
  Motor_RPM=(PWM_fREQ*3)/10   ;Mot RPM= Pwm frequency*(60/200)
  IF Driving_Mode=0 THEN mOTOR_rpm=mOTOR_RPM/2   
ENDIF
IF mOT_STEP_ANG=75 THEN   ; 7.5 Degree Motor(48Step/tour-Full) 
  MOTOR_RPM=((pwm_fREQ*12)/10)+((PWM_Freq*5)/100);Mot RPM= Pwm frequency*(60/48)
  IF Driving_Mode=0 THEN mOTOR_rpm=MOTOR_RPM/2
ENDIF   

IF PWM_STATUS=1 THEN 
  LCD_Adres=$80:Gosub LCD_Write_RPM
  ELSE
  char_adres=56
  lcd_line=$80
  gosub LCD_Send_Char
ENDIF

return

Motor_Direction:

    Mot_Old_Freq=PR2
    for PR2=Mot_Old_Freq to 248  '250 Hz
      GOSUB PWM_Duty_Update
      Gosub Mot_RPM_Calc
      LCD_Adres=$80:Gosub LCD_Write_RPM
      pause 10
    next
    Mot_Enb=0
    pause 100
    Mot_CCW= 1 ^ Mot_CCW
    Mot_Enb=1
    for PR2=249 to (Mot_Old_freq+1) step -1
      GOSUB PWM_Duty_Update
      Gosub Mot_RPM_Calc
      LCD_Adres=$80:Gosub LCD_Write_RPM
      pause (SOFT_START_STAGE*10)
    NEXT

return

Motor_Start:
WHILE MOTOR_RPM<SET_MOTOR_RPM
   PR2=PR2-1
   GOSUB PWM_DUTY_UPDATE
   GOSUB Mot_RPM_Calc
   pause (SOFT_START_STAGE*10)
WEND
return

Motor_Stop:

    for PR2=PR2 to 249   '250 Hz
      GOSUB PWM_Duty_Update
      Gosub Mot_RPM_Calc
      LCD_Adres=$80:Gosub LCD_Write_RPM
      pause 10
    next
    PWM_Status=0
    gOSUB PWM_OFF

return

Step_Mod:  ;Step Mod
  GOSUB LCD_CLEAR
  char_adres=24
  lcd_line=$80
  gosub LCD_Send_Char

  LCD_LINE=$C0 
  gosub Mot_Mod_Write
  LCD_ADRES=$C5:CHAR="-"
  GOSUB LCD_WRITE
  LCD_ADRES=$C6:CHAR="|"
  GOSUB LCD_WRITE
  LCD_ADRES=$C7:CHAR="-"
  GOSUB LCD_WRITE
  WHILE SET=0:WEND
Step_Mod_1:

  IF UP=0 THEN
    lcd_adres=$C7:CHAR=">"
    gosub LCD_WRITE
    MOT_CCW=1:MOT_ENB=1
    HIGH PORTB.3
    PAUSEUS 500
    LOW PORTB.3
    WHILE UP=0
      Btn_SYC=Btn_SYC+1
      PAUSE 5
      IF btn_SYC>150 THEN
        btn_SYC=150
        TOGGLE PORTB.3
        PAUSEUS 400
      endIF
    wend
    BTN_SYC=0
    PORTB.3=0
    MOT_ENB=0
    CHAR="-":GOSUB LCD_WRITE
  endif

  IF DOWN=0 THEN
    lcd_adres=$C5:CHAR="<"
    GOSUB LCD_WRITE
    MOT_CCW=0:MOT_ENB=1
    HIGH PORTB.3
    PAUSEUS 500
    LOW PORTB.3
    WHILE DOWN=0
      Btn_SYC=Btn_SYC+1
      PAUSE 5
      IF btn_SYC>150 THEN
        btn_SYC=150
        TOGGLE PORTB.3
        PAUSEUS 400
      endIF
    wend
    BTN_SYC=0
    PORTB.3=0
    MOT_ENB=0
    CHAR="-":GOSUB LCD_WRITE
  endif

  IF Mot_DREC=0 then
    Driving_Mode=1-Driving_Mode
    while Mot_DREC=0:wend
  ENDIF

  gosub Mot_Mod_Write

  IF SET=0 THEN
    WHILE SET=0:WEND
    GOTO LOAD_PROG
  ENDIF

goto Step_Mod_1

SET_MENU:
TEMP=0
  READ $0,Mot_Step_Ang
  read $1,Driving_Mode:If Driving_Mode>1 then Driving_Mode=0
  Read $2,Set_Motor_Rpm.LOWBYTE
  READ $3,SET_MOTOR_RPM.HIGHBYTE
  If Set_Motor_Rpm>4300 then Set_Motor_rpm=0
  read $4,Soft_Start_Stage:IF Soft_Start_Stage>10 then Soft_Start_Stage=1
  IF MOT_STEP_ANG<>18 AND Mot_Step_Ang<>75 then Mot_Step_Ang=18
  GOSUB LCD_CLEAR
    char_adres=0
    lcd_line=$80
    gosub LCD_Send_Char 
;    lcdout $FE,$80,"Step Ang"
MENU:
SELECT CASE TEMP
  CASE 0  ;Motor Step Ang

      IF UP=0 OR DOWN=0 THEN
        STEP_SELECT= 1 ^ STEP_SELECT
        WHILE UP=0 OR DOWN=0:PAUSE 1:WEND
        IF STEP_SELECT=1 THEN
          MOT_STEP_ANG=75
        ELSE
          MOT_STEP_ANG=18
        ENDIF
      ENDIF

        LCDOUT $FE,$C1,">",dec1 MOT_STEP_ANG DIG 1,",", DEC1 MOT_STEP_ANG DIG 0

      IF SET=0 THEN
        TEMP=1
        WHILE SET=0:PAUSE 1:WEND
        GOSUB LCD_CLEAR
        char_adres=8
        lcd_line=$80
        gosub LCD_Send_Char
        INDEX=64:GOSUB SET_CHAR
        LCD_ADRES=$C1:GOSUB LCD_WRITE
        LCD_LINE=$C2
      ENDIF

  CASE 1   ;Motor Driving Mod

    IF UP=0 OR DOWN=0 THEN
      DRIVING_MODE=1 ^ dRIVING_MODE
      WHILE UP=0 OR DOWN=0:PAUSE 1:WEND
    ENDIF

    GOSUB MOT_mOD_WRITE

    IF SET=0 THEN
        TEMP=2
        WHILE SET=0:PAUSE 1:WEND
        IF Mot_Step_Ang=18 THEN
          IF Driving_Mode=1 then
           Min_RPM=75:Max_RPM=1000
          ELSE
           Min_rpm=37:max_rpm=500
          endif
        ELSE
          IF Driving_Mode=1 then
           Min_RPM=312:Max_RPM=3300
          ELSE
           Min_rpm=156:max_rpm=1650
          endif
        endif
          IF SET_MOTOR_RPM<MIN_RPM OR SET_MOTOR_RPM>MAX_RPM THEN SET_MOTOR_RPM=MIN_RPM
          GOSUB LCD_CLEAR
          char_adres=16
          lcd_line=$80
          gosub LCD_Send_Char
    ENDIF

  CASE 2 ;Soft Start RPM

  Motor_RPM=Set_Motor_RPM
  LCD_Adres=$C0:Gosub lcd_Write_RPM

  IF UP=0 THEN
    Set_Motor_RPM=Set_Motor_RPM+1
    IF SET_Motor_RPM=>Max_RPM then
      SET_MOTOR_RPM=MAX_RPM
      GOTO EXITIF
    ENDIF
      WHILE UP=0
        BTN_SYC=BTN_SYC+1
        PAUSE 5
          IF BTN_SYC=>100 THEN
            BTN_SYC=100
            SET_MOTOR_RPM=SET_MOTOR_RPM+1
            IF SET_Motor_RPM=>Max_RPM then
              SET_MOTOR_RPM=MAX_RPM
              GOTO EXITIF
            ENDIF
            Motor_RPM=Set_Motor_RPM
            LCD_Adres=$C0:Gosub LCD_Write_rpm
            PAUSE 10
          ENDIF
      WEND
      BTN_SYC=0
  ENDIF

  IF DOWN=0 THEN
    Set_Motor_RPM=Set_Motor_RPM-1
    IF SET_Motor_RPM<=Min_Rpm Then
      SET_MOTOR_RPM=MIN_RPM
      GOTO EXITIF
    ENDIF
      WHILE DOWN=0
        BTN_SYC=BTN_SYC+1
        PAUSE 5
          IF BTN_SYC=>100 THEN
            BTN_SYC=100
            SET_MOTOR_RPM=SET_MOTOR_RPM-1
            IF SET_Motor_RPM<=Min_Rpm Then
              SET_MOTOR_RPM=MIN_RPM
              GOTO EXITIF
            ENDIF
            Motor_RPM=Set_Motor_RPM
            LCD_Adres=$C0:Gosub LCD_Write_RPM
            PAUSE 10
          ENDIF
      WEND
      BTN_SYC=0
  ENDIF
  EXITIF:

    IF SET=0 THEN
        TEMP=3:Motor_RPM=0
        WHILE SET=0:PAUSE 1:WEND
        GOSUB LCD_CLEAR
        char_adres=16
        lcd_line=$80
        gosub LCD_Send_Char
    ENDIF

  CASE 3

    lcdout $FE,$C0,"Acc=",dec2 Soft_Start_Stage

    IF UP=0 THEN
      Soft_Start_Stage=Soft_Start_Stage+1
      IF SOFT_START_STAGE>10 THEN SOFT_START_STAGE=10
      WHILE UP=0:WEND
    ENDIF

    IF DOWN=0 THEN
      Soft_Start_Stage=Soft_Start_Stage-1
      IF SOFT_START_STAGE=0 THEN SOFT_START_STAGE=1
      WHILE DOWN=0:WEND
    ENDIF

    IF SET=0 THEN
      GOTO Save_the_Settings
    endIF

END SELECT
GOTO MENU 

Save_the_Settings:
  WRITE $0,Mot_Step_ang:pause 10
  WRITE $1,DRIVING_MODE:PAUSE 10
  WRITE $2,Set_Motor_RPM.LOWBYTE:pause 10
  WRITE $3,SET_MOTOR_RPM.HIGHBYTE:PAUSE 10
  WRITE $4,Soft_Start_Stage:pause 10
  WHILE SET=0:WEND
goto LOAD_PROG

PWM_ON:         ;PWM ON..
  CCP1CON.2=1
  CCP1CON.3=1
  Mot_ENB=1
  PWM_Status=1
RETURN

PWM_OFF:        ;PWM OFF
  CCP1CON.2=0
  CCP1CON.3=0
  MOT_ENB=0
  PWM_Status=0
  PR2=249
  GOSUB PWM_Duty_Update
RETURN

LOADING:
CHAR="*"
FOR i=0 TO 7
  LCD_ADRES=$80+i
  GOSUB LCD_WRITE
  PAUSE 100
NEXT
FOR i=0 TO 7
  LCD_ADRES=$C0+i
  GOSUB LCD_WRITE
  PAUSE 100
NEXT

FOR i=0 to 7
  INDEX=32+i
  GOSUB SET_CHAR
  LCD_ADRES=$80+i
  GOSUB LCD_WRITE
  PAUSE 100
next

FOR i=0 TO 7
  iNDEX=40+i
  GOSUB SET_CHAR
  LCD_ADRES=$C0+i
  GOSUB LCD_WRITE
  PAUSE 100
NEXT
PAUSE 1500
RETURN

LCD_CLEAR:
  LCDOUT $FE,1
RETURN

LCD_SEND_CHAR:
  FOR i=0 TO 7
    iNDEX=cHAR_Adres+i
    GOSUB SET_CHAR
    LCD_ADRES=LCD_Line+i
    GOSUB LCD_WRITE
  NEXT
RETURN

Set_Char: ;Reading Character
   lookup INDEX,["Step_AngDriv_ModSoftStrtStep_Modwww.arectron.comHalfFullRPM=---->"],CHAR
return
   ;Start Adres
   ;Step_Ang=0
   ;Driv_Mod=8
   ;SoftStrt=16
   ;Step_Mod=24
   ;[url=http://www.arectron.com=]www.arectron.com=[/url]32
   ;Half=48, Full=52
   ;RPM=----=56,>=64
   ;Acc= =65
LCD_Write:
  LCDOUT $FE,LCD_Adres,CHAR
return

LCD_Write_RPM:
    LCDOUT $FE,LCD_Adres,"RPM=",dec4 Motor_RPM
return
end


Yazılımda bayağı bi uğraştırdı. Aslında yazılımın hiç  zor bir tarafı yok. Herşey açık yapılan iş belli. Sorun lanet olası şu 16F628 'in hafızasının az olması. :D Çok güzel abileri var ama elimde çok sayıda olduğu için değerlendirmek elimden çıkarmak istiyorum. Yapılan işlemleri hafızaya sığdırtmak için 40 türlü dereden su getiriyorum :) Ama bu işinde iyi bir yanı var. Hafızada 1byte alanın hesabı yapmak zorunda kalınca kod optimizasyonunda kendimi bayağı geliştirdim :)

Birde video çektim. Videodaki motor 1.8 derecelik ve 2.2nm lik bir step motor. Eski bir cihazdan sökmüştüm. Elimde buna benzer birçok motor var. Bende birçok test yaptım.

Ekteki videoda sistemin tüm özelliklerini görebilirsiniz.

Step Motor Driver

Videodaki motor 6 uclu unipolar bir motordu. Fakat motorun ortak uclarına enerji verince düşük devirlerde çok akım çektiği için bende motoru bipolar olarak çalıştırdım. Yani sürücüye sadece motorun faz ucları bağlı.

Step Motor High rpm Test

Buradaki videoda ise motoru 1000 rpm ye kadar çıkardım. Ama genelde bu devirlerde çalışmıyor. Rezonans frekansını geçtikten sonra motor milini hafif elimle çevirirsem hemen senkronizasyon yakalanıyor ve motor dönmeye başlıyor.
7.5 derecelik motorlarla da max devir olan 4339 dev/dak kadar çıkabildim. Tabi yukarıda bahsettiğim teknikle. Yoksa aynı durum onlar içinde geçerli.

Yaşadığım problemlere rağmen benim için step motorlar konusunda çok iyi bir tecrübe kaynağı oldu.

Şu rezonans meselesini nasıl çözülür Bu konuda yorum ve önerilerinizi beklemekteyim.

İlgili Dosyaları aşağıdaki linkten indirebilirsiniz.
http://yadi.sk/d/LaSPee950L9o1
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

umitco

  Eline , emeğine sağlık , çok güzel bir çalışma olmuş. Ben BDX transistörle basit bir sürücü yapmaya çalışmıştım ama çok ısınma oluyordu ve devir yükseltemiyordum. Birde senin çalışmayı deneyeceğim. Gerçi lcd , butonları denemede kullanmayacağım ama motoru sürmede devre ve program işime yarayacak. Eğer isis dosyan simule edebiliyorsa bunuda ekleyebilirmisin..

xoom

Güzel çalışma olmuş eline emeğine sağlık..

Mucit23

Teşekkür ederim. İsis dosyasını akşama eklerim.
Birde şu yüksek devire çıkamama meselesini çözebilirsem çok güzel olacak. Bu konuda umarım değerli hocalarımız yorum yaparlar.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

mierdogan

L298 yerine mosfet olsa daha güçlü bir sürücü olmazmıydı?

Birde voltaj ve kullanılan MCU motorun hızını direkt etkilediği söyleniyor voltajdan eminim ama mcu daha hızlı olmaı derken kastedilen nedir bir fikrim yok.

Emeğinize sağlık
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

Mucit23

Iyi bir sürücü yapmak istersem eğer bu tür paket haline getirilmiş hazır entegreler kullanmam kesinlikle. kullanacagim yere, Calisma voltajina göre ve Çekilen  akıma göre tüm bolumleri ayrı ayrı tasarlardım. Ayrıca L297 ve L298 kullanmazdım. Zaten L297 bir mikrodenetleyici fiyatında. L298 ise yine nispeten pahalı bir entegre. Ona verilecek parayla çok güçlü köprüler kurulur.

Mikrodenetleyicinin hızlı olması şu yönde iyi. Bazı profesyonel step sürücüleri inceledim. Bazılarında L297 gibi chopper işlemini yerine getiren bazı entegreler kullanılmıyordu. Bu işlemi mikrodenetleyiciye yaptırmışlardı. Hakikaten seri üretim bir cihaz yapsam özel bir durum yok ise eğer neden L297 gibi entegre kullanayimki. Onun yaptığı işi bir mikrodenetleyici ye çok rahat bir şekilde yaptırabilirim. Eğer motor hızlı çalışacaksa mikrodenetleyicinin de hızlı olması gerekir.

Sanırım Mikrodenetleyici bu yüzden hızlı olması gerekiyor
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

enginkanat

Herkesin Kurban Bayramını kutlarım.
Benim elimde 2 adet L298 var. L297 kullanmadan da unipolar step sürebilirmiyim sizce, Input girişlerine sırasıyla kodları göndersem istediğim sonucu elde edebiirmiyim.
Mesela yarım adım, ileri geri, belirli bir mesafeye gitme gibi.
portb=%10010000
portb=%11000000
portb=%01100000
portb=%00110000
kodları ile motor 1 adımı mı sağlamış oluyor, yoksa yani ben 10 adım git dersem yukarıdaki dört satırı 10 defamı kullanacağım, ayrıca her satır arasına pause komutu koymam gerekiyormu? Pause komutu motor hızı ile ilgilimi yoksa işlemci hızından dolayı motorun tepki verme süresi içinmi kullanılabilir

Mucit23

Yukarıda verdigin her kod motoru 1 adım ilerletir
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

KAZIMUGUR

#8
@Mucit23 , kaç yaşındasın ?
Muhtemelen L297-98 senden yaşlıdır.
Çok aradın mı onları ?

İyi bir chooper olmadan hız yapamazsın.
Yükselen devirle birlikde akımı sabit tutup gerilimi arttıran sistem olmazsa olmaz.
Haliyle ne kadar yüksek devir o kadar giriş dinamiği.

Chopper için ayrık çözümler var.

[IMG]http://imageshack.us/a/img191/2646/chopper1a.jpg[/img]
]

Uploaded with ImageShack.us

----
Yukarıdaki satırlardan L297-98 e gıcık olduğum anlaşılmıştır.
L298 yerine L6201-3 gibi çeşitler olsada olup olacakları bellidir.

Allegro da çok güzel oyuncaklar var.
Bunların son modelleri ile @göktuğ a zorla kitler yaptırıyorum yakında bitirir sanırım.
1/16 microstepe kadar mükemmel oyuncaklar...


http://www.allegromicro.com/en/Products/Motor-Driver-And-Interface-ICs/Bipolar-Stepper-Motor-Drivers.aspx

Mucit23

Daha önce hiç step sürücü yapmamıştım. Bana tecrübe oldu işte.

Birdaha sürücü yaparsam Chopper işlemini mikrodenetleyiciye yaptıracağım. Kuracağım donanıma yazacagim yazılıma göre daha iyi sonuçlar alacağımı umuyorum.

Aslında L298 ile L298 i yakıncaya kadar aram iyiydi. Yanınca komple soğudum.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

KAZIMUGUR

Alıntı yapılan: Mucit23 - 25 Ekim 2012, 16:32:34
... Chopper işlemini mikrodenetleyiciye yaptıracağım. Kuracağım donanıma yazacagim yazılıma göre daha iyi sonuçlar alacağımı umuyorum...

Umduğunu bulamayan hayal kırıklığı yaşar !
Elektronikcinin hayal kırıklığına değil sonuca ihtiyacı olur.

TB6560AHQ 3.5A kadar mükemmel bir çözümdür.
Derli toplu her şeyi içinde.
Benzeri çözümler için Allegro da en fazla 2A var.
Ama Allegro ların bazılarında  mosları dışarıdan bağlayabilme gibi harika bir seçenek var.
Benzeri işi yapacak hazır çözümler 100$ dan başlar.

Bu söz ettiğim oyuncakların pdf lerini incelersen chopper i - microstep i nasıl yapmışlar temelden anlarsın ve muhtemelen o işleri mcu ya yaptırmakdan vazcayarsın , muhtemelen yani...

Mucit23

Hocam sizin tecrubeleriniz benim için önemli. Bakalım ne özellikleri varmış bu tb6560 ın.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Unutmuşum isis şemasını verecektim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

xoom

Konuyu hortlatmak istiyorum.. Bir ara Step motorlarla uğraşmak istemiştim ama iş yoğunluğundan zaman ayıramamıştım. Şimdi artık Step motoru öğrenmek istiyorum ve ilk başta bir step motor sürücü tasarlamak istiyorum. Mesajlardan da görüldüğü üzere step motor sürücüleriyle uğraşanlar var.. Bana iyi bir step sürücü tasarımı lazım (Mümkünse PCB çizimide olsun çünkü çizim bile çok etkiliyor )
Bu step sürücü ile önce sağa sola döndürmeyi ( ki bunu hemen yaparım)
daha sonra devir ayarı yapmak istiyorum yani en azından 1000 devir görsem yeterli..
Programlamayı CCS C ile yapmak istiyorum..
bahsettiğiniz chopper - microstep olayıda sürücüde olursa mükemmel olur.. o kadar anlamıyorum bu step sürücülerden netten bir çok devre indirdim ama yinede şunu yaparsan iyi olur diye tavsiye istiyorum sadece. Teşekkürler.

Powered by EzPortal