اطلاعیه

Collapse
No announcement yet.

کمک در مورد سروو موتور

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : کمک در مورد سروو موتور

    نوشته اصلی توسط pama
    روشی که فرمودید جهت قطع و وصل شدن تغذیه ی سرووها عملی هست منتها بنا به گفته ی دوستان یک ایرادی در کار بوجود میاد...
    اون هم این هست که این کار به مرور زمان، باعث شل شدن فنر متصل به شافت خروجی سروو و نا کارآییه سرووها ، خواهد شد.
    اگر شما بعد از اینکه برای اولین بار یک شرط تحقق پیدا کرده تغذیه سروو مربوطه رو وصل کنید به صورت منطقی و عملی عوارض این کار هیچ تفاوتی با وصل کردن تغذیه در ابتدای کار نداره. توجه داشته باشید قرار نیست شما تغذیه رو در حین کار قطع و وصل کنید. فقط یک بار اونهم بعد از اولین باری که شرط یک سروو برقرار شد تغذیه رو متصل میکنید. پس این کار فرقی با وصل کردن عادی تغذیه نداره. در ضمن در مورد عوارض یاد شده هم به دلیل نداشتن اطلاعات در این مورد نمیتونم رد یا تائید کنم.

    دیدگاه


      پاسخ : کمک در مورد سروو موتور

      سلام.
      بسیار متشکرم جناب مهندس از حضور و پاسختون.

      بنده هم واقعا گیج شدم، اصلا نمیدونم باید چی بگم!!
      اما چیزی که هست اینه که بنده حتما روش شما رو تست میکنم، و یه مدت با این روش دستگاه رو آزمایش میکنم که آیا واقعا آسیب میبینه یا خیر...

      ولی به نظر بنده هم دلیل شما کاملا منطقی هستو هیچ دلیلی برای ردّ اون وجود نداره...
      پس حتما امتحان میکنم :agree:

      جناب perfect یک سوال دیگه!!
      اون هم این که اگر ما بخوایم 2 سروو از این 7 سروو مدام با تغییر فرکانس زاویشون تغییر کنه و بقیه ی سرووها، شرط حرکتشون برای حرکت به زاویه ای معلوم، با شرط اون 2 سروو به اشتراک گذاشته بشه، یا به عبارتی مثلا سرووی 5 با 3 IF اول، هر بار در یک زاویه و سرووی 6 با 4 تا IF بعدی، هر بار با تحقق هر شرط در زاویه ی مربوط به اون شرط قرار بگیره، و مثلا بقیه ی سرووها با تحقق شرط 2 برن در زاویه ی مربوط به اون شرط، آیا باید برنامه به این نحو تغییر کنه؟!

      یا اصلا نه فعلا ساده تر شه، چون عقلم به انجام این کاری که الان گفتم قد نداد!!
      فقط 2 سروو مدام با تغییر شرط زاویشون هم تغییر کنه:

      کد:
        
       DEFINE OSC 8
      @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
       
      servo5 var byte 
      servo6 var byte 
      
      a var byte
      f var word
      flag var bit
      
      ON INTERRUPT GOTO _interrupt
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      
      
        TRISD=$00
        PORTD=$00
        TRISc.0=1
        TRISB=0
       ;;;;;;;;;       
       TMR1L=0
       TMR1H=0
       T1CON=$03 ;turn on timer1 in counter mode
      ;;;;;;;;;  
      
       PIR1.1=0 ; TMR2IF=0
       TMR2=0
       PR2=249
       PIE1.1=1 ; Enable timer2 interrupt
       T2CON=$4F
      ;;;;;;;;;
      
        INTCON.6=1  ;PEIE=1
        INTCON.7=1  ;GIE=1 , enable global interrupt
        
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
          
       servo5=125
       servo6=125
         
      again:
      
      if flag=1 then 
       
       if f <= 25 then
       servo5 = 250
       endif
      
        if f >= 26 and f <= 40 then
       servo5 = 200
       
       endif
       
        if f >= 41 and f <= 60 then
       servo5 = 150
       endif
      
       if f >= 61 and f <= 80 then
       servo6 =100
       endif
      
       if f >= 81 and f <= 100 then
       servo6 =50
       endif
      
       if f >= 101 and f <= 115 then
       servo6 = 25
       endif
      
       if f >= 116 then
       servo6 = 0
       endif
       
       
      flag=0 
      endif 
         
      goto again
      
      
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      
        DISABLE 
      _interrupt:            ; interrupt service
      
      if PIR1.1=1 then     ; if TMR2IF=1 then
       
       a=a+1
       
       if a>=50 then 
       F.byte1=TMR1H
       F.byte0=TMR1L      
       TMR1L=0
       TMR1H=0
       T1CON=$03
       a=0 
       flag=1
       PORTB=f
       endif  
         
                
           PORTD = $10
           PAUSEUS 990 
           INTCON.2=0
           TMR0 = 255-servo5
           OPTION_REG = OPTION_REG & $c0 
           OPTION_REG = OPTION_REG | $02 
           while INTCON.2=0
           wend   
           PORTD=$00
           ;;;;;;;;;;;;;;;;;;;;;;;;;;
            PORTD=$10;
            PAUSEUS 990 
            INTCON.2=0
            TMR0 = 255-servo5 
            OPTION_REG = OPTION_REG & $c0 
            OPTION_REG = OPTION_REG | $02 
            while INTCON.2=0
            wend
             PORTD=$00    
           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
            PORTD=$10;
            PAUSEUS 990 
            INTCON.2=0
            TMR0 = 255-servo5
            OPTION_REG = OPTION_REG & $c0 
            OPTION_REG = OPTION_REG | $02
            while INTCON.2=0
            wend
             PORTD=$00
           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
            PORTD=$20;
            PAUSEUS 990  
            INTCON.2=0
            TMR0 = 255-servo6 
            OPTION_REG = OPTION_REG & $c0 
            OPTION_REG = OPTION_REG | $02
            while INTCON.2=0
            wend
             PORTD=$00
           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
            PORTD=$20
            PAUSEUS 990  
            INTCON.2=0
            TMR0 = 255-servo6
            OPTION_REG = OPTION_REG & $c0 
            OPTION_REG = OPTION_REG | $02
            while INTCON.2=0
            wend
             PORTD=$00
           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
            PORTD=$20
            PAUSEUS 990  
            INTCON.2=0
            TMR0 = 255-servo6 
            OPTION_REG = OPTION_REG & $c0 
            OPTION_REG = OPTION_REG | $02
            while INTCON.2=0
            wend
             PORTD=$00
           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
            PORTD=$20
            PAUSEUS 990  
            INTCON.2=0
            TMR0 = 255-servo6
            OPTION_REG = OPTION_REG & $c0 
            OPTION_REG = OPTION_REG | $02
            while INTCON.2=0
            wend
            PORTD=$00
           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
         PIR1.1=0  ; clear TMR2IF
         endif 
            
        RESUME     ;return from interrapt 
        ENABLE 
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      
      end
      جناب مهندس بنده مجددا کجا رو اشتباه کردم که با این برنامه 2 سروو با تغییر شرط زوایاشون تغییر نکرد؟!

      واقعا شرمنده ام از وقتی که از شما سر این کار هدر میره....
      زندگی برگ بودن در مسیر باد نیست
      امتحان ریشه هاست
      ریشه هم هرگز اسیر باد نیست
      زندگی چون پیچک است
      انتهایش میرسد پیش خدا!

      دیدگاه


        پاسخ : کمک در مورد سروو موتور

        برنامه به نظر درسته و باید با تغییر فرکانس دو سروو 5 و 6 تغییر زاویه بدن. به طوری که از فرکانس 60 به بالا فقط سروو6 تغییر میکنه و کمتر از اون فقط سروو5 تغییر میکنه. در برنامه اشکالی نمیبینم. اتصالات سروو رو چک کنید.
        ببینید سرووها به خروجی های سروو 5 و 6 متصل هستند.

        دیدگاه


          پاسخ : کمک در مورد سروو موتور

          متشکرم.
          بله جناب مهندس، اتصالات درستند، چون الان دویاره همون برنامه ی قبلی رو برای 7 سروو چک کردم، عملکرد سرووها درست بودند، اما بعد از اون با برنامه ی جدید تست شد، نتیجه این شد که هر 2 سروو در یک زاویه ای که در منتها الیه سمت چپ هست قرار میگیره و با تغییر فرکانس هیچ اتفاقی براشون نمی افته.
          به نظر شما نباید یک فکری به حال اون 7 تا روتین کنترل سروو که در انتها وجود داره بشه؟!
          یا اینکه مثلا برای سروو5 اینکه در 3 شرط اول گفته میشه به زاویه های تعریف شده برن، و در هر 3 بعد از IF مقدار جدید هر بار در SERVO5 قرار میگیره، و در روتین کنترل سرووها هم 3 تای اولی هر 3 برای SERVO5 تعریف شدند، آیا باعث نمیشه که همه چی قاطی بشه و نباید بعد از هرIF یه کاری بکنیم که برای رفتن به زاویه ی مربوط به اون شرط، دقیقا به روتین کنترلی مربوط به خودش بره و با اون 2 تای دیگه که مربوط به این سروو هست قاطی نشه؟!

          اگه حرف خیلی خنده دار و بی ربطی زدم، واقعا معذرت میخوام :redface:
          زندگی برگ بودن در مسیر باد نیست
          امتحان ریشه هاست
          ریشه هم هرگز اسیر باد نیست
          زندگی چون پیچک است
          انتهایش میرسد پیش خدا!

          دیدگاه


            پاسخ : کمک در مورد سروو موتور

            متوجه تغییر در روتین وقفه نشده بودم. شما نباید روتین وقفه رو دستکاری میکردید. روتین وقفه رو به حالت اول برگردونید. نیازی نبود تغییری در اون ایجاد کنید. هر قسمت از روتین باید یکی از 7 سروو رو کنترل کنه.

            دیدگاه


              پاسخ : کمک در مورد سروو موتور

              ok
              بله دقیقا همونطوری بود که شما فرمودید.
              برنامه رو درستش کردم و سرووها کاملا درست عمل کردند.
              بسیار متشکرم ازتون. :agree:

              حالا اگر بخوایم به هر شرط علاوه بر حرکت یک سروو، حرکت یک سرووی دیگه به هر زاویه ی دیگه ای رو اضافه کنیم باید بعد از اون شرط به اون سرووی مورد نظر مقدار بدیم، درست عرض میکنم؟
              مثلا سرووی 2 به همراه شرط دوم مقدار 100 رو اگر بخواد بپذیره، کدمون باید به این صورت باشه، درسته جناب مهندس؟

              کد:
               if f >= 26 and f <= 40 then
               servo5 = 200
               servo2 = 100  
               endif
              و به همین ترتیب به هر شرط، میشه به هر تعداد سرووی دیگه با مقادیر جدید اضافه کرد، بله جناب perfect؟!

              باز هم سپاسگذار لطف فراوونتون هستم.
              زندگی برگ بودن در مسیر باد نیست
              امتحان ریشه هاست
              ریشه هم هرگز اسیر باد نیست
              زندگی چون پیچک است
              انتهایش میرسد پیش خدا!

              دیدگاه


                پاسخ : کمک در مورد سروو موتور

                بله. شما در هرکدوم از شرطها هریک از سرووها که بخواهید رو میتونید در زاویه دلخواه قرار بدید و محدودیتی ندارید. حتی میتونید یک سروو رو در چند شرط در زوایای مختلف قرار بدید. فقط توجه کنید که روتین وقفه نباید دستکاری بشه.

                دیدگاه


                  پاسخ : کمک در مورد سروو موتور

                  بسیار متشکرم.
                  معذرت میخوام آقا که مدام سوالهای پشت سر هم ازتون میپرسم...
                  ایراد از سواد ناقص بنده است که پاسخ درستی براشون نداره!!

                  جناب مهندس اگر بخواهیم با احقاق یک شرط مثلا 3 سروو به نوبت و پشت سر هم در زاویه هایی قرار بگیرند، و هر 3 دقیقا در یک فرکانس این اتفاق براشون بیافته، مثلا در فرکانس 25 هرتز ابتدا سرووی اولی در یک زاویه ای قرار بگیره، به محض اینکه اون در زاویه رفت بعدی بره در زاویه ی تعریف شدش و به همین ترتیب تا موتوهای بعدی، با این سرووها و طریقه ی درایوشون ,امکان پذیر نیست، و به ناچار باید از سرووهایی که با پورت سریال میکرو کنترل میشن استفاده کرد؟؟ :sad:

                  جناب مهندس خیلی اوضاع ناجوری خواهم داشت اگر نشه با همین سرووها کنار اومد....

                  اضافه شده در تاریخ :
                  با سلام خدمت همه ی دوستان و اساتید محترم:

                  دوستان خوبم همونطور که در پستهای قبل خدمتتون عرض کردم با لطف دوست خوبمون جناب perfect پروژه ی بنده به اینجا
                  رسید که برنامه ای نوشته شد که در اون، 7 سروو موتور، هر کدوم با احقاق شرط مربوط به خودشون در زاویه های تعریف شدش، قرار میگرفتند، منتها بعد از اون با 2 تا مشکل مواجه هستیم:
                  که اولیش حرکت اولیه ی سرووها به محض زدن تغذیه است به عبارتی، با وصل شدن تغذیه، و زمانی که هنوز به شرطها نرسیدیم، همه ی سرووها به سمت یک زاویه ای حرکت میکنند، و مشکل دوم هم حرکت همزمان تعداد سرووهایی هست که بعد از احقاق یک شرط باید بچرخند، و هدف ما این هست که این سرووها به ترتیب و پشت سر هم بچرخند، یعنی در یک شرط خاص، اگر بنا بر این باشه که 3 سروو، هر کدوم در زاویه های متفاوت قرار بگیرند، ابتدا سرووی اول به زاویه بره و بعد از اون دومی و به همین ترتیب بعد از در زاویه قرار گرفتن دومی، سومین سروو به زاویه بره، در صورتی که در حال حاضر هر 3 با احقاق شرط همزمان حرکت میکنند.

                  برای حل مشکل اول، با کمک دوستان به این نتیجه رسیدم که باید این کار رو انجام داد که تایمرهایی که وظیفه ی ساختن وقفه ی 20 میلی ثانیه برای رفرش سرووها و کلا کنترل سرووها رو در برنامه بر عهده دارند، در ابتدای برنامه غیر فعال، و بعد از احقاق اولین شرط فعال کنیم، بنده هم تایمر 2 رو که جناب perfect در برنامه برای کنترل سرووها تنظیم کرده بودند، در ابتدای برنامه 0 و بعد از احقاق شرط اول 1 کردم، منتها اتفاقی که افتاد این بود که وقتی با این حالت به مدار تغذیه میدادم، میکرو داغ میشد و علاوه بر ابنکه عملکرد سرووها به هم میریخت؛ اونها هم گرم میشدند و یک بویی ازشون میومد!
                  البته بعد که تست کردم سرووها و بقیه ی المانهای مدارم سالم بودند و نسوخته بودند.
                  منتها بنده هم فکر میکنم این روش راه حل معقول و درستی برای حل این مشکل باشه، منتها نمیدونم چرا جواب نداد؟!
                  به نظر بنده برنامه از لحاظ تنظیم تایمرها نمیتونه ایرادی داشته باشه، چون اگر اینطور بود اصلا سرووها نباید عملکرد درست میداشتند، به نظر دوستان ، آیا تغییری که در برنامه به نفع غیر فعال کردن تایمرها در ابتدا و فعا ل کردنش بعد از شرط به نحو زیر انجام دادم، اشتباست؟

                  کد:
                  '****************************************************************
                  '* Name  : UNTITLED.BAS                   *
                  '* Author : [select VIEW...EDITOR OPTIONS]          *
                  '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                  '*     : All Rights Reserved                *
                  '* Date  : 13/01/2012                    *
                  '* Version : 1.0                        *
                  '* Notes  :                          *
                  '*     :                          *
                  '****************************************************************
                    
                   DEFINE OSC 8
                  @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                   
                  servo1 var byte 
                  servo2 var byte 
                  servo3 var byte 
                  servo4 var byte 
                  servo5 var byte 
                  servo6 var byte 
                  servo7 var byte
                  
                  a var byte
                  f var word
                  flag var bit
                  
                  ON INTERRUPT GOTO _interrupt
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                  
                    TRISD=$00
                    PORTD=$00
                    TRISc.0=1
                    TRISB=0
                   ;;;;;;;;;       
                   TMR1L=0
                   TMR1H=0
                   T1CON=$03 ;turn on timer1 in counter mode
                  ;;;;;;;;;  
                  
                   PIR1.1=0 ; TMR2IF=0
                   TMR2=0
                   PR2=249
                   PIE1.1=0
                   T2CON=$4F
                  ;;;;;;;;;
                  
                    INTCON.6=0  
                    INTCON.7=0  
                    
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                      
                     
                  again:
                  
                  if flag=1 then 
                   
                   if f <= 25 then
                   
                    INTCON.6=1
                    INTCON.7=1
                    PIE1.1=1
                   
                   servo3 = 250
                   endif
                  
                    if f >= 26 and f <= 40 then
                   servo3 = 100
                   
                   endif
                   
                    if f >= 41 and f <= 60 then
                   servo3 = 200
                   endif
                  
                   if f >= 61 and f <= 80 then
                   servo3 =50
                   endif
                  
                   if f >= 81 and f <= 100 then
                   servo4 =250
                   endif
                  
                   if f >= 101 and f <= 116 then
                   servo4 = 50
                   endif
                  
                   if f >= 117 then
                   servo4 = 200
                   endif
                   
                   
                  flag=0 
                  endif 
                     
                  goto again
                  
                  
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                    DISABLE 
                  _interrupt:            ; interrupt service
                  
                  if PIR1.1=1 then     ; if TMR2IF=1 then
                   
                   a=a+1
                   
                   if a>=40 then 
                   F.byte1=TMR1H
                   F.byte0=TMR1L      
                   TMR1L=0
                   TMR1H=0
                   T1CON=$03
                   a=0 
                   flag=1
                   PORTB=f
                   endif  
                     
                            
                       PORTD = $01
                       PAUSEUS 990 
                       INTCON.2=0
                       TMR0 = 255-servo1
                       OPTION_REG = OPTION_REG & $c0 
                       OPTION_REG = OPTION_REG | $02 
                       while INTCON.2=0
                       wend   
                       PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;
                        PORTD=$02;
                        PAUSEUS 990 
                        INTCON.2=0
                        TMR0 = 255-servo2 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02 
                        while INTCON.2=0
                        wend
                         PORTD=$00    
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                        PORTD=$04;
                        PAUSEUS 990 
                        INTCON.2=0
                        TMR0 = 255-servo3
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$08;
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo4 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$10
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo5
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                        PORTD=$20
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo6 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$40
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo7
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                        PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                     PIR1.1=0  ; clear TMR2IF
                     endif 
                        
                    RESUME     ;return from interrapt 
                    ENABLE 
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                  end
                  قسمتهای رنگی مربوط به غیر فعال کردن تایمر در ابتدای برنامه و فعال کردن مجدد اون بعد از احقاق شرط هست:

                  PIR1.1=0
                  TMR2=0
                  PR2=249
                  PIE1.1=0
                  T2CON=$4F
                  ;;;;;;;;;

                  INTCON.6=0
                  INTCON.7=0
                  again:

                  if flag=1 then

                  if f <= 25 then

                  INTCON.6=1
                  INTCON.7=1
                  PIE1.1=1


                  servo3 = 250
                  endif

                  از طرفی دوستان پیشنهاد میکردند تا از ترانزیستوری برای قطع تغذیه ی سرووها در ابتدای برنامه و وصل شدن اون بعد از احقاق اولین شرط استفاده کنم، تا به این ترتیب سرووها به محض وصل کردن تغذیه، حرکت نکنند، و بعد از احقاق شرط در زاویه هاشون قرار بگیرند، برای این کار هم خیلی تلاش کردم،م منتها دقیقا نمیدونم باید از چه نوع ترانزیستوری استفاده بشه و نحوه ی کنترل اون با میکرو به چه نحو میتونه باشه؟

                  جناب solsal پیشنهاد دادند که آخرین وضعیت سرووها قبل از خاموش شدن دستگاه در حافظه ی eeprom ذخیره بشه و به محض روشن کردن مجدد دستگاه، مقدار اونها به سرووها اعمال بشه، برای ثابت موندن سرووها در ابتدای برق دار شدن، دستور ذخیره کردن در حافظه رو از تو هلپ برنامه خوندم که به این صورت هست:

                  EEPROM {Location,}[Constant{,Constant...}]
                  حالا دقیقا نمیدونم برای اینکه روش اخیر رو به کار ببندم، باید از کجا بفهمم که آخرین وضعیت سرووها کدوم هست تا اون رو در یک خونه از حافظه قرار بدم، و بعد باید به چه نحو اون رو از اون خونه ی حاظه دوباره بعد از روشن شدن دستگاه به سرووها اعمال کنم؟!

                  بسیار ممنون و سپاسگذار میشم از دوستانی که در این زمینه تجربه یا اطلاعاتی دارند بنده رو راهنمائی بفرمایند.
                  ........



                  اضافه شده در تاریخ :
                  با سلام دوباره خدمت همه ی دوستان و اساتید محترم.
                  دوستان گرامی پیرو درخواست راهنمائی در پست قبلی باید خدمت سروران گرامی عرض کنم که برای حل مشکل اول و اینکه کاری کنیم تا سرووها در ابتدای برق دار شدن حرکتی نداشته باشند و بعد از احقاق شرط اول برقشون وصل بشه، هنوز هم بنده نتونستم با مشکل کانفیگ کردن تایمرها بعد از شرط اول و به تبع اون گیج زدن سرووها کنار بیام، و همچنان از دوستان بزرگوارم خواهشمندم تا بنده رو راهنمائی بفرمایند...

                  منتها پیرو پیشنهاد دوستان بر استفاده از ترانزیستوری برای قطع تغذیه ی سرووها در ابتدا و وصل کردن اون بعد از احقاق شرط اول، جناب baby_1 فرمودند تا از ترانزیستور bdx53 استفاده کنم.
                  جناب solsal نظرشون بر این بود که از حافظه ی e2prom برای ذخیره کردن آخرین وضعیت سرووها قبل از خاموش کردن ، و اعمال کردن مقدار موجود در خانه های حافظه به سرووها به محض روشن شدن اونها، استفاده کنیم.

                  دستور نوشتن اطلاعات در eeprom به این صورت هست:

                  WRITE address, value

                  و دستور خوندن اطلاعات از eeprom به این نحو هست:

                  READ address, variable

                  البته نکته ای که وجود داره اینه که برای استفاده از دستور WRITE در صورتی که در برنامه وقفه وجود داشته باشه، قبل از این دستور کلیه ی وقفه ها ( با دستور DISABLE) غیر فعال بشن.
                  (به نقل از کتاب دکتر میرزا کوچکی)

                  جناب solsal فرمودند که از روال زیر برای بی حرکت موندن سرووها استفاده بشه، بنده هم با سواد ناقص خودم این روال رو به صورت کد نوشتم،
                  روالی که مهندس solsal فرمودند:

                  " پلان خاموش نمودن:
                  1- از لوپ کنترلی خارج می شود.(خواندن سنسور و انجام محاسبات و واکنش به سنسور )
                  2- زاویه تمام سرووها در حافظه ذخیره می شود( مقادیر pwm ها )
                  3- تغذیه سرووها توسط سوییچ قدرت ، قطع می شود.
                  4- قطع دستی تغذیه.

                  پلان روشن نمودن:
                  1- اتصال دستی تغذیه( مدار میکروکنترلر برق دار می شود و برق تا سر سوییچ قدرت می رسد ولی سوییچ قدرت قطع است)
                  2- زاویه سرووها از حافظه خوانده شده و در pwm ها تنظیم می شود.
                  3- سوییچ قدرت تغذیه سرووها وصل می شود.
                  4- وارد لوپ کنترلی (خواندن سنسور و انجام محاسبات و واکنش به سنسور ) می شود.
                  "

                  کد:
                   DEFINE OSC 8
                  @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                   
                   low portc.3
                   
                  servo1 var byte 
                  servo2 var byte 
                  servo3 var byte 
                  servo4 var byte 
                  servo5 var byte 
                  servo6 var byte 
                  servo7 var byte
                  
                  a var byte
                  b var byte
                  f var word
                  flag var bit
                  
                  ON INTERRUPT GOTO _interrupt
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                  
                    TRISD=$00
                    PORTD=$00
                    TRISc.0=1
                    TRISB=0
                    
                   ;;;;;;;;;       
                   TMR1L=0
                   TMR1H=0
                   T1CON=$03 ;turn on timer1 in counter mode
                   ;;;;;;;;;
                   
                   PIR1.1=0 ; TMR2IF=0
                   TMR2=0
                   PR2=249
                   PIE1.1=1
                   T2CON=$4F
                     ;;;;;;;;;
                    INTCON.6=1  
                    INTCON.7=1  
                    
                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                   
                  READ 0, servo1
                  READ 1, servo2
                  READ 2, servo3
                  READ 3, servo4
                  READ 4, servo5
                  READ 5, servo6
                  READ 6, servo7
                  
                  high portc.3
                  
                  again:
                  
                  if flag=1 then 
                   
                   if f <= 25 then
                   servo3 = 50
                   endif
                   
                    if f >= 26 and f <= 40 then
                   servo3 = 250 
                   if b>=50 then
                    servo4 = 200
                    endif
                    endif
                    
                      
                   
                   if f >= 41 and f <= 60 then
                   servo3 = 100 
                   endif
                   
                   
                   if f >= 61 and f <= 80 then
                   servo3 = 250
                   if b >=50 then
                    servo4 = 100
                    endif
                    endif
                   
                    if f >= 81 and f <= 100 then
                   servo4 = 250
                   endif
                  
                   if f >= 101 and f <= 115 then
                   servo4 =150
                   endif
                        
                      
                   if f >= 116 then
                   servo4 =50
                   endif
                   
                  flag=0 
                  endif 
                     
                  goto again
                  
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                    DISABLE 
                  _interrupt:            ; interrupt service
                  
                  if PIR1.1=1 then     ; if TMR2IF=1 then
                   
                   
                   b=b+1
                   a=a+1
                   
                   if a>=40 then 
                   F.byte1=TMR1H
                   F.byte0=TMR1L      
                   TMR1L=0
                   TMR1H=0
                   T1CON=$03
                   a=0 
                   flag=1
                   PORTB=f
                   endif  
                     
                            
                       PORTD = $01
                       PAUSEUS 990 
                       INTCON.2=0
                       TMR0 = 255-servo1
                       OPTION_REG = OPTION_REG & $c0 
                       OPTION_REG = OPTION_REG | $02 
                       while INTCON.2=0
                       wend   
                       PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;
                        PORTD=$02;
                        PAUSEUS 990 
                        INTCON.2=0
                        TMR0 = 255-servo2 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02 
                        while INTCON.2=0
                        wend
                         PORTD=$00    
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                        PORTD=$04;
                        PAUSEUS 990 
                        INTCON.2=0
                        TMR0 = 255-servo3
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$08;
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo4 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$10
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo5
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                        PORTD=$20
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo6 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$40
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo7
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                        PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                     PIR1.1=0  ; clear TMR2IF
                     endif 
                        
                    RESUME     ;return from interrapt 
                    ENABLE 
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  write 0, servo1
                  write 1, servo2
                  write 2, servo3
                  write 3, servo4
                  write 4, servo5
                  write 5, servo6
                  write 6, servo7
                  
                  low portc.3  'ghat kardane barghe servo
                  
                  end
                  از همه ی دوستان یک دنیا سپاسگذار خواهم بود که لطف کرده و کدهای بنده رو چک کنند، قسمتهای رنگی ززیر تغییراتی هستند که به نفع فرمایشات جناب solsal اضافه شدند، منتها بنده اصلا نمیدونم کاری که انجام دادم درست هست یا خیر؟!
                  مخصوصا اینکه نمیدونم وققفه ها رو قبل از دستور رایت باید چه کارشون کنم..


                  DEFINE OSC 8
                  @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                  low portc.3
                  .
                  .

                  READ 0, servo1
                  READ 1, servo2
                  READ 2, servo3
                  READ 3, servo4
                  READ 4, servo5
                  READ 5, servo6
                  READ 6, servo7

                  high portc.3


                  again:
                  .
                  .

                  RESUME ;return from interrapt
                  ENABLE
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  write 0, servo1
                  write 1, servo2
                  write 2, servo3
                  write 3, servo4
                  write 4, servo5
                  write 5, servo6
                  write 6, servo7


                  low portc.3 'ghat kardane barghe servo

                  end
                  دوستان بنده برای اینکه همه ی نکته ها رو عرض کرده باشم پستم رو یک مقدار طولانی کردم، امیدوارم براتون خسته کننده نباشه و بنده رو در این موقعیت بحرانی کمک بفرمائید.
                  از لطف همه ی شما سپاسگذارم.


                  اضافه شده در تاریخ :
                  باسلام خدمت همه ی دوستان و اساتید گرامی.
                  دوستان محترم متاسفانه بنده برای حل مشکلاتی که با سروو موتورهام داشتم نتونستم به نتیجه ای برسم :sad:
                  برای همین تصمیم گرفتم که سرووهام رو عوض کنم و به پیشنهاد یکی از دوستان از سروو موتورهای صنعتی و یا سرووهای داینامیکسل استفاده کنم،
                  هر چند راه اندازی این سروویی که الان در حال کار با اون هستم (mg9805 و mg995) برای بنده بسیار سخت بوده و تایم خیلی زیادی رو از بنده گرفته و گذشته از همه ی اینها، اگر لطف دوستان و اساتید محترم این سایت مخصوصا جناب perfect نبود، فکر میکنم بنده باید یک تایم خیلی اساسی تر و بیشتر رو صرف این کار میکردم..
                  اما برای پروژه ی ما مهم این هست که نهایتا یک کار تمیز و درست و حسابی، داشته باشیم و به لطف خدا با تموم شدن کار و ساخت دستگاه نگرانی ای بابت عملکرد سرووها که از اساسی ترین اجزای کار هست، نداشته باشیم.

                  با همه ی این اوصاف بنده باز هم از دوستانی که در زمینه ی کار با سرووها تجربه و یا اطلاعاتی دارند، تمنا دارم که بنده رو راهنمائی بفرمایند که آیا مشکلاتی که بنده با سرووهای در حال کار، داشتم، قابل رفع شدن هستند؟ و بعد از حل این مشکلات دیگه نگرانی ای بابت عملکرد سرووها در آینده نباید داشته باشم؟
                  (همونطور که دوستان در جریان هستند مشکلاتی که با سرووهای فعلی دارم، اولیش حرکت اولیه ی سرووها به محض گرفتن تغذیه است، در صورتی که ما میخوایم این سرووها به محض برق دار شدن حرکت نکنند و با احقاق اولین شرط برن تو زاویه های تعریف شدش....
                  و مشکل دوم این هست که ما میخوایم بعد از احقاق یک شرط، یک تعداد از سرووها به ترتیب و پشت سر هم در زوایایی که براشون تعریف کردیم قرار بگیرند، اما الان هر تعداد سروویی که بعد از یک شرط وجود دارند به طور همزمان در زاویه های تعریف شدش قرار میگیرند که هر دوی این مشکلات برای عملکرد نهایی دستگاه ما بسیار نا مناسب هستند)

                  و یا اینکه خیر، با توجه به همه ی تایم (حدود 10 ما!!) و انرژی ای که برای راه انداختن این سرووها، با شرایط خاص خودش که در پستهای قبلی عرض شد، صرف شده باز هم به صلاح هست که سرووها عوض بشند و از نوع سرووهای صنعتی و یا از سرووهای داینامیکسل که در روباتهای انسان نما استفاده میشند، استفاده کنیم؟

                  اگر این طور هست یعنی تشخیص دوستان بر تعویض سرووها هست بسیار سپاسگذار میشم که بفرمایید بهتره دقیقا از کدوم یک از 2 نوع صنعتی و یا داینامیکسل استفاده بشه؟ و آیا این موتورها دیگه مشکلات قبلی که با موتورهای فعلی داریم رو نخواهند داشت؟ (با توجه به اینکه دلیل اصلی تعویض احتمالی سرووها همین مشکلات هستند)
                  در صورتی که دوستان اطلاعات دیگه ای راجع به سرووهای صنعتی و یا dynamixel دارند، بسیار سپاسگذار میشم که در اختیار بنده قرار بدند، اطلاعاتی مثل نحوه ی کلی برنامه ریزی که آیا با سرووهایی که الان در حال کار با اونها هستم خیلی متفاوت هست، و یا قیمت اونها و یا هر چیز دیگه ای که دوستان از اون اطلاع دارند...

                  باز هم از همه ی شما بزرگوارانی که همواره با حوصله پاسخ گوی سوالات متداول بنده بوده و هستید، یک دنیا سپاسگذارم :agree:
                  زندگی برگ بودن در مسیر باد نیست
                  امتحان ریشه هاست
                  ریشه هم هرگز اسیر باد نیست
                  زندگی چون پیچک است
                  انتهایش میرسد پیش خدا!

                  دیدگاه


                    پاسخ : کمک در مورد سروو موتور

                    سلام
                    هردو مشکل شما قابل حله مخصوصا مشکل دوم!
                    ولی خوب راه حل مشکل اول
                    شما قبل از اینکه برق مدار قطع بشه با خوندن زوایای سرو ها و ذخیره کردن اون در حافظه eeprom و سپس پس از برقراری تغذیه اولین کار خوندن اون دیتا ها و قرار دادن روی سروو میتونید این مشکل رو حل کنید(احتمالا سروها یک حرکت بسیار جزئی خواهند داشت)اگر میزان این حرکت زیاد باشه شما باید اول میکرو روشن سپس مقدار رو روی سرووها قرار بدید سپس تغذیه اونها رو وصل کنید (شاید اینجوری بهتر بشه)
                    درضمن این رو در نظر بگیرید وقتی تغذیه سرووها رو قطع میکنید سرووها از حالت قفل خارج میشن و با اندکی فشار شافتشون میچرخه بنابراین اگر سرروها تحت فشار هستند این کار غیر ممکنه!
                    راه حل مشکل دوم
                    راحی که الان به ذهنم میرسه اینه که
                    شما همیشه مقدار قبلی رو با مقدار جدید مقایسه کن اگر تغییری داشت مقدار زاویه رو برابر مقدار جدیدش کن سپس به نسبت تغییر تاخیر بزار (نسبت رو با ازمون و خطا بدست بیار) بعد برو سراغ سرو بعدی و همین کار رو تکرار کن تا سروی آخر و مجددا همین روال رو از سروی اول تکرار کن

                    پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                    دیدگاه


                      پاسخ : کمک در مورد سروو موتور

                      با سلام

                      ابتدا نیاز دارید که رفتار سروو خودتان را شناسایی کنید.(تحت شرایط کاری خاص خودتان)
                      در نتیجه برای یک سروو تکی ، مراحل ذیل را برنامه نویسی و تست کنید.

                      الف :

                      1- سوییچ قدرت یا رله ای که برق سرو را می رساند ، خاموش کنید. و 3 ثانیه تاخیر کنید.( رفتار سروو را یادداشت کنید)
                      2- مقدار حرکت یا زاویه را به 25% از کل مقدار مجاز برای این سروو تنظیم کنید.(به pwm مربوطه بدهید) و 3 ثانیه تاخیر کنید.(رقتار سروو را یادداشت کنید: نباید حرکتی دیده شود.)
                      3- سوییچ قدرت را وصل کنید. و رفتار سروو را یادداشت کنید.( در این مرحله چون pwm دایم در حال ارسال پالس است، مدار داخلی سروو به دلیل برقدار شدن پس از ریست درونی ،
                      یک حرکت خاص ممکن است داشته باشد، سپس در طی مدت کوتاهی به محل 25% منتقل می شود. این 25% را خودتان به عدد pwm محاسبه کنید.)

                      4- سوییچ قدرت را خاموش کنید، و 3 ثانیه تاخیر کنید.(رفتار سروو را یادداشت کنید.)
                      5- مراحل 2 و 3 و 4 را برای 50% تکرار کنید.
                      6- مراحل 2 و 3 و 4 را برای 75% تکرار کنید.
                      7- مراحل 2 و 3 و 4 را برای 100% تکرار کنید.

                      ب:
                      مراحل الف را برای سروو تحت بار ( با هر بازو یا اهرم یا .... که کار می کند) تکرار کنید.

                      "منظور از رفتار سروو: حرکت-سکون-سرعت حرکت-رفتن به پوزیشن خاص و معکوس شدن-جهش-لغزش...."

                      به این ترتیب رفتار سروو شما شناسایی می شود و معلوم می شود که برای کارتان مناسب است یا خیر.

                      پس از آن، مراحل بعدی انجام خواهد گرفت.


                      ضمنا برنامه نوشتن و خواندن از حافظه eeprom را مستقلا تست کنید تا به عنوان تابع جانبی آماده استفاده باشد.

                      نهایتا اینکه بسکام را یاد ندارم! لذا در آن قسمت کمکی نمی توانم داشته باشم.

                      با سپاس
                      گشتی در لاله زار
                      http://www.eca.ir/forum2/index.php?topic=76138.0

                      http://www.eca.ir/forum2/index.php?topic=76141

                      دیدگاه


                        پاسخ : کمک در مورد سروو موتور

                        نوشته اصلی توسط Solsal

                        نهایتا اینکه بسکام را یاد ندارم! لذا در آن قسمت کمکی نمی توانم داشته باشم.

                        با سپاس
                        lممنون از راهنماییهای خوبتون فقط یک نکته کامپایلر ایشون بسکام نیست(میکرو شون pic هست)
                        فکر میکنم کامپایلرشون basicpro باشه!
                        پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                        دیدگاه


                          پاسخ : کمک در مورد سروو موتور

                          نوشته اصلی توسط امیر حسنی کاخکی
                          سلام
                          سلام از بنده است جناب کاخکی و بسیار بسیار سپاسگذارم از لطف و پاسختون جناب مهندس.

                          نوشته اصلی توسط امیر حسنی کاخکی
                          هردو مشکل شما قابل حله مخصوصا مشکل دوم!
                          ولی خوب راه حل مشکل اول
                          شما قبل از اینکه برق مدار قطع بشه با خوندن زوایای سرو ها و ذخیره کردن اون در حافظه eeprom و سپس پس از برقراری تغذیه اولین کار خوندن اون دیتا ها و قرار دادن روی سروو میتونید این مشکل رو حل کنید(احتمالا سروها یک حرکت بسیار جزئی خواهند داشت)اگر میزان این حرکت زیاد باشه شما باید اول میکرو روشن سپس مقدار رو روی سرووها قرار بدید سپس تغذیه اونها رو وصل کنید (شاید اینجوری بهتر بشه)
                          ok,بسیار ممنونم از توضیحاتتون.
                          فرمایشات شما و جناب solsal رو مبنی بر استفاده از حافظه ی eeprom، به صورت تئوری کاملا متوجه هستم، منتها نمیدونم آیا کاری که در برنامه انجام دادم درست هست یا خیر؟
                          در برنامه این کار انجام شده که در ابتدا تغذیه ی سرووها قطع شده و بعد از اون دقیقا در خط قبل از شرط اول، مقدار سرووها که در انتهای برنامه در حافظه ی eeprom ذخیره شده بودند، از اون خونه های حافظه خونده میشه و بعد تغذیه ی سروو وصل شده و وارد لوپ اصلی میشیم که در اون شرطها وجود داره...
                          پس از اتمام این لوپ و در انتهای برنامه مقدار سرووها در خونه های حافظه ذخیره میشن.
                          به این ترتیب:
                          کد:
                          '****************************************************************
                          '* Name  : UNTITLED.BAS                   *
                          '* Author : [select VIEW...EDITOR OPTIONS]          *
                          '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                          '*     : All Rights Reserved                *
                          '* Date  : 14/01/2012                    *
                          '* Version : 1.0                        *
                          '* Notes  :                          *
                          '*     :                          *
                          '****************************************************************
                          
                           DEFINE OSC 8
                          @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                           
                           low portc.3
                           
                          servo1 var byte 
                          servo2 var byte 
                          servo3 var byte 
                          servo4 var byte 
                          servo5 var byte 
                          servo6 var byte 
                          servo7 var byte
                          
                          a var byte
                          b var byte
                          f var word
                          flag var bit
                          
                          ON INTERRUPT GOTO _interrupt
                          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                          
                          
                            TRISD=$00
                            PORTD=$00
                            TRISc.0=1
                            TRISB=0
                            portc.3 = 0
                            
                           ;;;;;;;;;       
                           TMR1L=0
                           TMR1H=0
                           T1CON=$03 ;turn on timer1 in counter mode
                           ;;;;;;;;;
                           
                           PIR1.1=0 ; TMR2IF=0
                           TMR2=0
                           PR2=249
                           PIE1.1=1
                           T2CON=$4F
                             ;;;;;;;;;
                            INTCON.6=1  
                            INTCON.7=1  
                            
                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                           again:
                           
                           if flag=1 then 
                           
                          READ 0, servo1
                          READ 1, servo2
                          READ 2, servo3
                          READ 3, servo4
                          READ 4, servo5
                          READ 5, servo6
                          READ 6, servo7
                          
                          high portc.3
                           
                           if f <= 25 then
                           servo3 = 50
                           endif
                           
                            if f >= 26 and f <= 40 then
                           servo3 = 250 
                           if b>=50 then
                            servo4 = 200
                            endif
                            endif
                            
                              
                           
                           if f >= 41 and f <= 60 then
                           servo3 = 100 
                           endif
                           
                           
                           if f >= 61 and f <= 80 then
                           servo3 = 250
                           if b >=50 then
                            servo4 = 100
                            endif
                            endif
                           
                            if f >= 81 and f <= 100 then
                           servo4 = 250
                           endif
                          
                           if f >= 101 and f <= 115 then
                           servo4 =150
                           endif
                                
                              
                           if f >= 116 then
                           servo4 =50
                           endif
                           
                          flag=0 
                          endif 
                             
                          goto again
                          
                          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                          
                            DISABLE 
                          _interrupt:            ; interrupt service
                          
                          if PIR1.1=1 then     ; if TMR2IF=1 then
                           
                           
                           b=b+1
                           a=a+1
                           
                           if a>=40 then 
                           F.byte1=TMR1H
                           F.byte0=TMR1L      
                           TMR1L=0
                           TMR1H=0
                           T1CON=$03
                           a=0 
                           flag=1
                           PORTB=f
                           endif  
                             
                                    
                               PORTD = $01
                               PAUSEUS 990 
                               INTCON.2=0
                               TMR0 = 255-servo1
                               OPTION_REG = OPTION_REG & $c0 
                               OPTION_REG = OPTION_REG | $02 
                               while INTCON.2=0
                               wend   
                               PORTD=$00
                               ;;;;;;;;;;;;;;;;;;;;;;;;;;
                                PORTD=$02;
                                PAUSEUS 990 
                                INTCON.2=0
                                TMR0 = 255-servo2 
                                OPTION_REG = OPTION_REG & $c0 
                                OPTION_REG = OPTION_REG | $02 
                                while INTCON.2=0
                                wend
                                 PORTD=$00    
                               ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                PORTD=$04;
                                PAUSEUS 990 
                                INTCON.2=0
                                TMR0 = 255-servo3
                                OPTION_REG = OPTION_REG & $c0 
                                OPTION_REG = OPTION_REG | $02
                                while INTCON.2=0
                                wend
                                 PORTD=$00
                               ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                PORTD=$08;
                                PAUSEUS 990  
                                INTCON.2=0
                                TMR0 = 255-servo4 
                                OPTION_REG = OPTION_REG & $c0 
                                OPTION_REG = OPTION_REG | $02
                                while INTCON.2=0
                                wend
                                 PORTD=$00
                               ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                PORTD=$10
                                PAUSEUS 990  
                                INTCON.2=0
                                TMR0 = 255-servo5
                                OPTION_REG = OPTION_REG & $c0 
                                OPTION_REG = OPTION_REG | $02
                                while INTCON.2=0
                                wend
                                 PORTD=$00
                               ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                PORTD=$20
                                PAUSEUS 990  
                                INTCON.2=0
                                TMR0 = 255-servo6 
                                OPTION_REG = OPTION_REG & $c0 
                                OPTION_REG = OPTION_REG | $02
                                while INTCON.2=0
                                wend
                                 PORTD=$00
                               ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                PORTD=$40
                                PAUSEUS 990  
                                INTCON.2=0
                                TMR0 = 255-servo7
                                OPTION_REG = OPTION_REG & $c0 
                                OPTION_REG = OPTION_REG | $02
                                while INTCON.2=0
                                wend
                                PORTD=$00
                               ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                             PIR1.1=0  ; clear TMR2IF
                             endif 
                               
                          write 0, servo1
                          write 1, servo2
                          write 2, servo3
                          write 3, servo4
                          write 4, servo5
                          write 5, servo6
                          write 6, servo7
                          
                               
                               
                            RESUME     ;return from interrapt 
                            ENABLE 
                          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                          
                          end
                          این چند خط در برنامه مربوط به eeprom هستند:


                          DEFINE OSC 8
                          @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF

                          low portc.3
                          .
                          .
                          again:

                          if flag=1 then

                          READ 0, servo1
                          READ 1, servo2
                          READ 2, servo3
                          READ 3, servo4
                          READ 4, servo5
                          READ 5, servo6
                          READ 6, servo7

                          high portc.3


                          if f <= 25 then
                          .
                          .

                          write 0, servo1
                          write 1, servo2
                          write 2, servo3
                          write 3, servo4
                          write 4, servo5
                          write 5, servo6
                          write 6, servo7



                          RESUME ;return from interrapt
                          ENABLE
                          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                          end

                          آیا کارهایی که انجام شده درست هست؟

                          نوشته اصلی توسط امیر حسنی کاخکی
                          درضمن این رو در نظر بگیرید وقتی تغذیه سرووها رو قطع میکنید سرووها از حالت قفل خارج میشن و با اندکی فشار شافتشون میچرخه بنابراین اگر سرروها تحت فشار هستند این کار غیر ممکنه!
                          راه حل مشکل دوم
                          راحی که الان به ذهنم میرسه اینه که
                          شما همیشه مقدار قبلی رو با مقدار جدید مقایسه کن اگر تغییری داشت مقدار زاویه رو برابر مقدار جدیدش کن سپس به نسبت تغییر تاخیر بزار (نسبت رو با ازمون و خطا بدست بیار) بعد برو سراغ سرو بعدی و همین کار رو تکرار کن تا سروی آخر و مجددا همین روال رو از سروی اول تکرار کن
                          بله، حتما با توجه به نکته ای که شما فرمودید، یک بار دیگه برنامه رو برای حل مشکل دوم تنظیم و تست میکنم.
                          باز هم سپاسگذارم از حضور دوباره و توضیحات خوب و شیواتون.


                          اضافه شده در تاریخ :
                          نوشته اصلی توسط Solsal
                          با سلام
                          بنده هم خدمت شما عرض سلام و ادب دارم جناب مهندس و باز هم از حضور مجدد و پاسخ گوئیتون بینهایت سپاسگذارم.

                          نوشته اصلی توسط Solsal
                          ابتدا نیاز دارید که رفتار سروو خودتان را شناسایی کنید.(تحت شرایط کاری خاص خودتان)
                          در نتیجه برای یک سروو تکی ، مراحل ذیل را برنامه نویسی و تست کنید.

                          الف :

                          1- سوییچ قدرت یا رله ای که برق سرو را می رساند ، خاموش کنید. و 3 ثانیه تاخیر کنید.( رفتار سروو را یادداشت کنید)
                          2- مقدار حرکت یا زاویه را به 25% از کل مقدار مجاز برای این سروو تنظیم کنید.(به pwm مربوطه بدهید) و 3 ثانیه تاخیر کنید.(رقتار سروو را یادداشت کنید: نباید حرکتی دیده شود.)
                          3- سوییچ قدرت را وصل کنید. و رفتار سروو را یادداشت کنید.( در این مرحله چون pwm دایم در حال ارسال پالس است، مدار داخلی سروو به دلیل برقدار شدن پس از ریست درونی ،
                          یک حرکت خاص ممکن است داشته باشد، سپس در طی مدت کوتاهی به محل 25% منتقل می شود. این 25% را خودتان به عدد pwm محاسبه کنید.)

                          4- سوییچ قدرت را خاموش کنید، و 3 ثانیه تاخیر کنید.(رفتار سروو را یادداشت کنید.)
                          5- مراحل 2 و 3 و 4 را برای 50% تکرار کنید.
                          6- مراحل 2 و 3 و 4 را برای 75% تکرار کنید.
                          7- مراحل 2 و 3 و 4 را برای 100% تکرار کنید.

                          ب:
                          مراحل الف را برای سروو تحت بار ( با هر بازو یا اهرم یا .... که کار می کند) تکرار کنید.

                          "منظور از رفتار سروو: حرکت-سکون-سرعت حرکت-رفتن به پوزیشن خاص و معکوس شدن-جهش-لغزش...."

                          به این ترتیب رفتار سروو شما شناسایی می شود و معلوم می شود که برای کارتان مناسب است یا خیر.

                          پس از آن، مراحل بعدی انجام خواهد گرفت.
                          سپاسگذارم از روش مناسبتون.
                          بله حتما اوامر شما رو اجرا میکنم، جناب مهندس مشکلی که در استفاده از این روش به نظرم میاد این هست که محل دقیق high و low کردن سوئیچ در برنامه برام قدری مبهم هست، سعی کردم ابتدا با ترانزیستور رو از مدار جدا کرده و با یک led محل درست قرار دادن دستورات high و low رو در برنامه شناسایی کنم، منتها به نتیجه ی خوبی نرسیدم، و نهایتا برنامه رو به صورتی که در پست قبلی عرض کردم نوشتم.

                          آیا محل درست در برنامه برای اینکه در ابتدا سرووها برق دار نباشند و بعد از تحقق اولین شرط برق دار بشن، به این ترتیب هست که در ابتدای ابتدای برنامه و قبل از تعریف متغیرها و کانفیگ کردن تایمرها، پین مربوطه low شده و داخل لوپ اصلی که لوپ شرطها و عکس العمل سرووها نسبت به شرطهاست، باید این پین high بشه، آیا عرض بنده درست هست؟

                          نوشته اصلی توسط Solsal
                          ضمنا برنامه نوشتن و خواندن از حافظه eeprom را مستقلا تست کنید تا به عنوان تابع جانبی آماده استفاده باشد.

                          نهایتا اینکه بسکام را یاد ندارم! لذا در آن قسمت کمکی نمی توانم داشته باشم.

                          با سپاس
                          و باز هم متاسفانه به دلیل سواد نم دارم! متوجه منظور شما از اینکه میفرمائید خوندن و نوشتن از eeprom رو مستقلا تست کنم، نمیشم.
                          به معنای واقعی کلمه سپاسگذارم از همه ی لطف و بزرگواریتون جناب مهندس.

                          اضافه شده در تاریخ :
                          نوشته اصلی توسط امیر حسنی کاخکی
                          lممنون از راهنماییهای خوبتون فقط یک نکته کامپایلر ایشون بسکام نیست(میکرو شون pic هست)
                          فکر میکنم کامپایلرشون basicpro باشه!
                          معذرت میخوام متوجه این پست نبودم.
                          بله جناب کاخکی کاملا درست میفرمایند، کامپایلر بنده، pic basic pro هست.
                          زندگی برگ بودن در مسیر باد نیست
                          امتحان ریشه هاست
                          ریشه هم هرگز اسیر باد نیست
                          زندگی چون پیچک است
                          انتهایش میرسد پیش خدا!

                          دیدگاه


                            پاسخ : کمک در مورد سروو موتور

                            فکر نکنم نیازی باشه تا شما تغذیه سرووها رو کنترل کنید
                            در برنامه بلافاصله بعد از تعریف متغیرها مقادیر رو از روی Eeprom بخونید سپس به تعریف تایمرها و کانفیگ ها بپردازید
                            برای ذخیره زوایا هم هیچگاه عملایات ذخیره را داخل لوپ قرار ندهید (میزان نوشتن در eeprom محدود است)
                            در حلقه اصلی مرتبا وصل بودن تغذیه را چک کنید و به محض قطع شدن تغذیه مقادیر رو در Eeprom ذخیره کنید
                            پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                            دیدگاه


                              پاسخ : کمک در مورد سروو موتور

                              نوشته اصلی توسط امیر حسنی کاخکی
                              فکر نکنم نیازی باشه تا شما تغذیه سرووها رو کنترل کنید
                              در برنامه بلافاصله بعد از تعریف متغیرها مقادیر رو از روی Eeprom بخونید سپس به تعریف تایمرها و کانفیگ ها بپردازید
                              برای ذخیره زوایا هم هیچگاه عملایات ذخیره را داخل لوپ قرار ندهید (میزان نوشتن در eeprom محدود است)
                              در حلقه اصلی مرتبا وصل بودن تغذیه را چک کنید و به محض قطع شدن تغذیه مقادیر رو در Eeprom ذخیره کنید
                              ok
                              بسیار متشکرم از توضیحات و راهنمائیهاتون.
                              در نتیجه به نظر شما احتیاجی نیست که در ابتدا تغذیه ی سروو قطع بشه، و در ابتدا مقادیر سرووها که در eeprom ذخیره شده خونده بشه و بعد از اینکه کانفیگها و تعریفها انجام شد، بعد از لوپ اصلی، مقادیر سرووها رو در خانه های حافظه قرار بدیم، درست عرض میکنم؟

                              منتها 2 تا سوال برای بنده به وجود میاد!
                              اولیش اینکه متاسفانه متوجه نشدم که چطور باید در لوپ اصلی مرتبا وصل بودن تغذیه رو چک کنم؟
                              آیا باید بعد از هر شرط پین مربوط به تغذیه رو high کنم و بعد از لوپ اون رو low کرده و سپس مقادیر سرووها رو تو eeprom ذخیره کنم؟ ( تا دفعه ی بعدی که مدار برق دار میشه، مقدار اولیه ای که سرووها میگیرند، همون مقداری باشه که در خونه های حافظه هست و ما خوندیم)

                              و دومیش هم این هست که آیا همین قدر که آخرین مقدار سرووها رو در ابتدای برنامه با دستور read از خونه های حافظه ی eeprom بخونیم، کافی هست جهت اینکه این مقادیر خودشون به عنوان مقدار اولیه به سرووها اعمال بشن و نیازی نیست قبل از لوپ اصلی کاری انجام بدیم؟

                              من واقعا شرمنده ام و معذرت میخوام بابت این همه سوال....

                              زندگی برگ بودن در مسیر باد نیست
                              امتحان ریشه هاست
                              ریشه هم هرگز اسیر باد نیست
                              زندگی چون پیچک است
                              انتهایش میرسد پیش خدا!

                              دیدگاه


                                پاسخ : کمک در مورد سروو موتور

                                نه نیازی به این کارها نیست
                                فقط مقدار رو بخونید همین هیچ کار دیگه ای لازم نیست
                                پس از تعریف متغییرها
                                این تیکه برنامه رو قرار بدید(برنامه خودتونه و چون من هم pic basic pro کارنکردم نمیتونم درمورد صحیح یا غلط بودنش نظر بدم)
                                READ 0, servo1
                                READ 1, servo2
                                READ 2, servo3
                                READ 3, servo4
                                READ 4, servo5
                                READ 5, servo6
                                READ 6, servo7
                                و سپس بقیه کانفیگها و لوپ اصلی
                                تمام
                                این تیکه رو چک کنید اگر درست کار کرد بریم سروقت چک کردن تغذیه و ذخیره متغیرها.
                                اگر هم راه چک کردن این تیکه رو نمیدونید بگید تا توضیح بدم چکار کنید.
                                پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                                دیدگاه

                                لطفا صبر کنید...
                                X