اطلاعیه

Collapse
No announcement yet.

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

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

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

    آقا یک دنیا سپاسگذارم از لطفتون. :agree:
    اصلا باورم نمیشد وقتی تایپیک رو باز کردم و ...
    بسیار بسیار ممنون و متشکرم از همه ی لطف و توضیحات دقیقتون.

    فقط جناب مهندس منظور شما از 2 خط F_in=F_in << 8
    F_in=F_in | TMR1L
    در فرکانس متری این بوده که مقدار F_in رو که در TMR1H هست 8 بیت شیفت بدیم به چپ و بعد در TMR1L بریزیم، درسته؟!

    که میتونه معادل دستور زیر باشه
    F_in.byte1 = TMR1H
    F_in.byte0 = TMR1L
    درست عرض میکنم؟!

    و چند تا سوال دیگه :redface:
    یکی اینکه آیا لازمه اول برنامه پرچم وقفه ی سر ریز تایمر 1 بازنشانده بشه؟(PIR1.0 = 0)
    و trisc.0 = 1 هم باید آورده بشه؟

    و دومی هم اینه که محل آوردن ifها به این صورت درست هست؟!


    again:
    ; main loop

    ;;;;;;;;;

    if a = 40 then

    F_in=TMR1H
    F_in=F_in << 8
    F_in=F_in | TMR1L

    a=0
    TMR1L=0
    TMR1H=0
    endif


    if f >= 20 and f <= 25 then
    servo1 = 0
    endif

    if f >= 35 and f <= 40 then
    servo2 = 25
    endif

    .
    .
    .
    تا سرووی هفتم
    goto again

    چشم، همین امروز تستش میکنم.

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

    دیدگاه


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

      نوشته اصلی توسط pama
      فقط جناب مهندس منظور شما از 2 خط F_in=F_in << 8
      F_in=F_in | TMR1L
      در فرکانس متری این بوده که مقدار F_in رو که در TMR1H هست 8 بیت شیفت بدیم به چپ و بعد در TMR1L بریزیم، درسته؟!

      که میتونه معادل دستور زیر باشه
      F_in.byte1 = TMR1H
      F_in.byte0 = TMR1L
      درست عرض میکنم؟!
      اشتباه نکنید ما در تایمر چیزی نمینویسیم. ابتدا بایت بالایی تایمر که پر ارزش تره رو میخونیم و در متغیر F_in که ازنوع word و 16 بیتی هست قرار میدیم. توجه کنید که در این مرحله ابتدا دیتا در بایت کم ارزش متغیر ریخته شده و برای قرار دادن اون در بایت پرارزش اون رو 8 بیت به سمت چپ شیفت میدیم. سپس با عمل OR بیتی متغیر با بایت کم ارزش تایمر (یعنی TMR1L ) این بایت هم به متغیر F_in اضافه میشه که نتیجه کل این عمل مقدار16 بیتی تایمر رو در متغیر 16 بیتی F_in قرار میده.
      دستورات معادلی که نوشتید همین عمل رو انجام میده.

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

      و چند تا سوال دیگه :redface:
      یکی اینکه آیا لازمه اول برنامه پرچم وقفه ی سر ریز تایمر 1 بازنشانده بشه؟(PIR1.0 = 0)
      و trisc.0 = 1 هم باید آورده بشه؟
      در مورد پرچم چون در زمان ریست و آغاز به کار این پرچم ها ریست میشن نیازی نیست ولی اگر هم پاکش کنید اشکالی نداره.
      در مورد TRIS هم بله باید پین مربوطه رو قبلاَ به صورت ورودی پیکره بندی کنید.

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

      و دومی هم اینه که محل آوردن ifها به این صورت درست هست؟!
      بله، درسته.

      دیدگاه


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

        سلام جناب مهندس.
        بسیار ممنون از اینکه باز هم با حوصله پاسخ گو هستید.
        برنامه رو با شرط چک کردم روی مدار، منتها متاسفانه نشد :sad:
        حدود 4 ساعت در حال کلنجار کردن با برنامه و سخت افزارش بودم منتها بازم وقتی تغذیه رو میدم سرووها با شرطمون عملکرد نامناسب دارند.
        منبع فرکانسم هم برای تست تو خونه مدار آیسی 555 هست.
        تصمیم گرفتم فردا فرکانس خروجی مدار 555 رو با برنامه ی فرکانس متری که شما در برنامه ی اصلی زحمت کشیدید، با یه lcd بخونم، شاید فرکانسی که بهش اعمال میشه ایراد داشته باشه.
        به نظر شما راه حل دیگه ای برای عیب یابی دارم؟!
        مدار سرووهام درسته، چون مدار رو با برنامه ی 7 سروو بدون شرط چک کردم، جواب درست داد...
        زندگی برگ بودن در مسیر باد نیست
        امتحان ریشه هاست
        ریشه هم هرگز اسیر باد نیست
        زندگی چون پیچک است
        انتهایش میرسد پیش خدا!

        دیدگاه


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

          برنامتونو اینجا بگذارید.
          ضمناً با توجه به اینکه هر 800ms پالها رو میشمارید فرکانس خوانده شده با فرکانس اصلی تفاوت داره.

          بنده برنامه زیر رو در شبیه ساز تست کردم و به طور دقیق جواب داد. شما هم در عمل تست کنید. فرکانس خونده شده هم به صورت باینری در PORTB قابل مشاهده است. باچند تا Led میتونید فرکانس رو ببینید. ملاحظات مربوط به پین RB3 رو هم در نظر داشته باشید.



          کد:
          '****************************************************************
          '* Name  : UNTITLED.BAS                   *
          '* Author : [select VIEW...EDITOR OPTIONS]          *
          '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
          '*     : All Rights Reserved                *
          '* Date  : 10/7/2011                     *
          '* Version : 1.0                        *
          '* Notes  :                          *
          '*     :                          *
          '****************************************************************
          
           DEFINE OSC 8
           
          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
          
          ON INTERRUPT GOTO _interrupt
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          
          
           
             TRISD=$00
             PORTD=$00
             TRISB=0
             TRISC.0=1
             
          ;;;;;;;;;       
           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
            
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
              
          
          
          again:
                ; main loop
           
          ;;;;;;;;;
             
           ; servo1=0
           ; servo2=25
           ; servo3=50
           ; servo4=125
           ; servo5=175
           ; servo6=200
           ; servo7=251 
           
           
            
          if f >= 20 and f <= 25 then
          servo1 = 0
          endif
          
          if f >= 26 and f <= 40 then
          servo2 = 25
          endif
          
          if f >= 41 and f <= 60 then
          servo3 = 75
          endif
          
          if f >= 61 and f <= 80 then
          servo4 = 125
          endif
          
          if f >= 81 and f <= 100 then
          servo5 = 175
          endif
          
          if f >= 101 and f <= 115 then
          servo6 = 200
          endif
          
          if f >= 116 and f <= 130 then
          servo7 = 250
          endif
           
          goto again
          
          
          
          
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          
          
          _interrupt:            ; interrupt service
          
               DISABLE INTERRUPT    ;disable interrapts
          
              if PIR1.1=1 then     ; if TMR2IF=1 then
               
               a=a+1
          ;;;;;;;;;;;;;;;;;;;     
           if a >= 40 then
           F=TMR1H
           F=F << 8
           F=F | TMR1L
           a=0
           TMR1L=0
           TMR1H=0
           PORTB=f
           endif
           ;;;;;;;;;;;;;;;;;;;      
          
               OPTION_REG = OPTION_REG & $c0 
               OPTION_REG = OPTION_REG | $02 
          
               PORTD = $01
               PAUSEUS 990 
               INTCON.2=0
               TMR0 = 255-servo1
               while INTCON.2=0
               wend   
               PORTD=$00
               ;;;;;;;;;;;;;;;;;;;;;;;;;;
                PORTD=$02;
                PAUSEUS 990 
                INTCON.2=0
                TMR0 = 255-servo2 
                while INTCON.2=0
                wend
                 PORTD=$00    
               ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                PORTD=$04;
                PAUSEUS 990 
                INTCON.2=0
                TMR0 = 255-servo3
                while INTCON.2=0
                wend
                 PORTD=$00
               ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                PORTD=$08;
                PAUSEUS 990  
                INTCON.2=0
                TMR0 = 255-servo4 
                while INTCON.2=0
                wend
                 PORTD=$00
               ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                PORTD=$10
                PAUSEUS 990  
                INTCON.2=0
                TMR0 = 255-servo5
                while INTCON.2=0
                wend
                 PORTD=$00
               ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                PORTD=$20
                PAUSEUS 990  
                INTCON.2=0
                TMR0 = 255-servo6 
                while INTCON.2=0
                wend
                 PORTD=$00
               ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                PORTD=$40
                PAUSEUS 990  
                INTCON.2=0
                TMR0 = 255-servo7
                while INTCON.2=0
                wend
                PORTD=$00
               ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                PIR1.1=0  ; clear TMR2IF
                endif 
                
                RESUME     ;return from interrapt 
                ENABLE INTERRUPT 
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          
          end

          دیدگاه


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

            متشکرم جناب مهندس از لطفتون.
            برنامه ای که دیشب تست کردم:

            کد:
             DEFINE OSC 8
            @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_ON ,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_in var word
            
            ON INTERRUPT GOTO _interrupt
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            
            
               TRISC.0 = 1
               TRISD=$00
               PORTD=$00
            
            ;;;;;;;;;       
             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
              
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                
            
            
            again:
                  ; main loop
              
            ;;;;;;;;;
            
            if a = 40 then
            
            F_in=TMR1H
            F_in=F_in << 8
            F_in=F_in | TMR1L
            
             a=0
             TMR1L=0
             TMR1H=0
            endif
            
            ;;;;;;;;;
            if (f_in >= 20) and (f_in <= 25) then 
            servo1 = 0
            endif
            
            if (f_in >= 35) and (f_in <= 40) then 
            servo2 = 25
            endif
            
            if (f_in >= 55) and (f_in <= 60) then 
            servo3 = 75
            endif
            
            if (f_in >= 75) and (f_in <= 80) then 
            servo4 = 125
            endif
            
            if (f_in >= 95) and (f_in <= 100) then 
            servo5 = 175
            endif
            
            if (f_in >= 110) and (f_in <= 115) then 
            servo6 = 200
            endif
            
            if (f_in >= 125) and (f_in <= 130) then 
            servo7 = 250
            endif   
               
            goto again
            
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            
            
            _interrupt:            ; interrupt service
            
                 DISABLE INTERRUPT    ;disable interrapts
            
                if PIR1.1=1 then     ; if TMR2IF=1 then
                
                   a = a + 1
               
                 OPTION_REG = OPTION_REG & $c0 
                 OPTION_REG = OPTION_REG | $02 
            
                 PORTD = $01
                 PAUSEUS 990 
                 INTCON.2=0
                 TMR0 = 255-servo1
                 while INTCON.2=0
                 wend   
                 PORTD=$00
                 ;;;;;;;;;;;;;;;;;;;;;;;;;;
                  PORTD=$02;
                  PAUSEUS 990 
                  INTCON.2=0
                  TMR0 = 255-servo2 
                  while INTCON.2=0
                  wend
                   PORTD=$00    
                 ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                  PORTD=$04;
                  PAUSEUS 990 
                  INTCON.2=0
                  TMR0 = 255-servo3
                  while INTCON.2=0
                  wend
                   PORTD=$00
                 ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                  PORTD=$08;
                  PAUSEUS 990  
                  INTCON.2=0
                  TMR0 = 255-servo4 
                  while INTCON.2=0
                  wend
                   PORTD=$00
                 ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                  PORTD=$10
                  PAUSEUS 990  
                  INTCON.2=0
                  TMR0 = 255-servo5
                  while INTCON.2=0
                  wend
                   PORTD=$00
                 ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                  PORTD=$20
                  PAUSEUS 990  
                  INTCON.2=0
                  TMR0 = 255-servo6 
                  while INTCON.2=0
                  wend
                   PORTD=$00
                 ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                  PORTD=$40
                  PAUSEUS 990  
                  INTCON.2=0
                  TMR0 = 255-servo7
                  while INTCON.2=0
                  wend
                  PORTD=$00
                 ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                  PIR1.1=0  ; clear TMR2IF
                  endif 
                  
                  RESUME     ;return from interrapt 
                  ENABLE INTERRUPT 
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            
            end
            سوتی های عظمای دیگه اینکه من سرووها رو اول کار مقدار دهی نکردم! (servo1=0 ; servo2=25 ; servo3=50 ; servo4=125 ; servo5=175 ; servo6=200 ; servo7=251 )
            و TRISB=0 رو نگذاشتم، البته LVP رو on کردم اول برنامه، حالا با این حساب RB3 یا همون PGM رو باید زمین کنم؟ و TRISB=0 هم در برنامه به قوت خودش باید باقی باشه؟
            البته خط مربوط به تنظیم فیوزبیتها رو طبق فرمایشات قبلی شما اول برنامه آوردم با این تفاوت که BOD رو هم OFF کردم، این خط درست هست؟
            همین الان میرم با برنامه ی شما تست میکنم آقا.....
            زندگی برگ بودن در مسیر باد نیست
            امتحان ریشه هاست
            ریشه هم هرگز اسیر باد نیست
            زندگی چون پیچک است
            انتهایش میرسد پیش خدا!

            دیدگاه


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

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

              سوتی های عظمای دیگه اینکه من سرووها رو اول کار مقدار دهی نکردم! (servo1=0 ; servo2=25 ; servo3=50 ; servo4=125 ; servo5=175 ; servo6=200 ; servo7=251 )
              و TRISB=0 رو نگذاشتم، البته LVP رو on کردم اول برنامه، حالا با این حساب RB3 یا همون PGM رو باید زمین کنم؟ و TRISB=0 هم در برنامه به قوت خودش باید باقی باشه؟
              البته خط مربوط به تنظیم فیوزبیتها رو طبق فرمایشات قبلی شما اول برنامه آوردم با این تفاوت که BOD رو هم OFF کردم، این خط درست هست؟
              البته بنده هم در برنامه ای که قرار دادم سروو هارو مقدار دهی اولیه نکردم. خودتون تصحیحش کنید.
              در مورد LVP اونو در تنظیمات غیر فعال کنید تا پین 3 پورت B آزاد بشه. TRISB رو هم دست نزنید. تنظیمات دیگه به نظر درست میرسن.

              دیدگاه


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

                نوشته اصلی توسط Perfect
                البته بنده هم در برنامه ای که قرار دادم سروو هارو مقدار دهی اولیه نکردم. خودتون تصحیحش کنید.
                در مورد LVP اونو در تنظیمات غیر فعال کنید تا پین 3 پورت B آزاد بشه. TRISB رو هم دست نزنید. تنظیمات دیگه به نظر درست میرسن.
                سلام.
                باز هم شرمنده ی لطف شمام مهندس.
                ولی باز هم نشد.
                LVP رو OFF کردم، منتها چه در حالتی که on هست چه off، عملکرد سرووها همواره به این صورت هست که وقتی تغذیه رو به مدار میدم و فرکانس بهش اعمال میشه، 2 تا سروویی که دارم روی هر کدوم از 7 پین پورت d که باشن همواره به یک زاویه ی معین (یکیشون حدود +30 و اون یکی رو -30) میره!
                و بعد از اون سرووها قفل میشن، یعنی وقتی با دست شافتشونو میچرخونم اصلا حرکت نمیکنن، و تغییر فرکانس هم هیچ فرقی به حالشون نداره، به عبارتی به محض زدن تغذیه میرن تو زاویه، البته برای اولین بار که تست میشه یعنی اگر در زاویه هایی که گفتم نباشن،
                اگه تو این زاویه ها باشن و بار دیگه بخوام سرووها رو به پینهای دیگه ی پورت d بزنم و تغذیه بدم چون سروو رو زاویه ای که گفتم قفل شده، دیگه حرکت نمیکنه و باید تغذیه رو قطع کنم و با دست زاویه رو از اون حالت خارج کنم و دوباره برق رو بزنم تا برگرده به همون زوایای +30 و -30 درجه.
                یعنی فرقی به حالش نمیکنه که رو کدوم پین باشه، هر جا که باشه به شرط اینکه تو زوایای گفته شده نباشن میرن تو این زاویه ها و بعد قفل میشن.
                در ضمن led هم که زدم به پورت b، رو پین های مختلف تست که کردم،( در هر دو حالت lvp روشن و خاموش)، یه در میون ledها دقیقا موقع رفتن سرووها تو زاویه روشن میشدن، یعنی رو یه پینی روشن میشد رو یکی دیگه نه!!!

                فرکانس ورودی رو هم دادم به یه ترانزیستور bc337 به این صورت که امیترش زمینه،بیسش با یه مقاومت 10 کیلو رفته زمین ،یه 10 کیلو هم از بیس اومده به ورودی فرکانس، به عبارتی فرکانس خروجی 555 اومده به 10 کیلویی که یه ورش به بیسه، کلکتور هم با یه 10 کیلو اومده +5 ولت و سر مشترک کلکتور و 5 ولت اومده به پایه ی 15 میکرو یا همون RC.0 .


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

                دیدگاه


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

                  عدد باینری که روی PORTB میبینید رو حساب کنید ببینید در رنج 0 الی 130 هرتز هست یا نه؟ به غیر از این به سروو ها مقدار اولیه بدید و بدون شرط فرکانس تست کنید ببینید در مکان صحیح قرار میگیرن؟
                  در ضمن نیازی نیست از ترانزیستور استفاده کنید. اگر خروجی 555 بیشتر از 5 ولته با دو عدد مقاومت مناسب تقسیم ولتاژ کنید به نحوی که نتونه از 5 ولت بیشتر بشه.

                  دیدگاه


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

                    باز هم عرض تشکر و شرمندگی جناب مهندس.
                    نوشته اصلی توسط Perfect
                    عدد باینری که روی PORTB میبینید رو حساب کنید ببینید در رنج 0 الی 130 هرتز هست یا نه؟
                    به چه نحو باید این کارو انجام بدم جناب مهندس؟!
                    یه سوال اساسی برای بنده ی کم سواد، درسته که پورت b رو به عنوان خروجی تعریف کردید ولی چرا فرکانسمون روی پورت b هست؟ مگه به RC.0 اعمال نمیشه؟
                    نوشته اصلی توسط Perfect
                    به غیر از این به سروو ها مقدار اولیه بدید و بدون شرط فرکانس تست کنید ببینید در مکان صحیح قرار میگیرن؟
                    این کار رو قبلا هم انجام دادم، ولی چشم همین الان دوباره چک میکنم.

                    نوشته اصلی توسط Perfect
                    در ضمن نیازی نیست از ترانزیستور استفاده کنید. اگر خروجی 555 بیشتر از 5 ولته با دو عدد مقاومت مناسب تقسیم ولتاژ کنید به نحوی که نتونه از 5 ولت بیشتر بشه.
                    ok، یعنی شما میفرمائید فرکانس رو مستقیما بدم به میکرو؟
                    برای اینکه بفهمم خروجیه 555 چند ولته یه کار آماتورانه کردم!!!
                    خروجی آیسی رو که به عنوان ورودی میره به میکرو ،با مولتی متر خوندم!!!
                    با تغییر فرکانس از 0 تا 5 ولت تغییر میکرد.



                    اضافه شده در تاریخ :
                    بدون شرط هم تست کردم جناب مهندس.
                    دقیقا در زاویه های مورد نظر قرار میگیرند.
                    نمیدونم چرا با شرط مشکل دارن؟؟!!


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

                    دیدگاه


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

                      نوشته اصلی توسط pama
                      یه سوال اساسی برای بنده ی کم سواد، درسته که پورت b رو به عنوان خروجی تعریف کردید ولی چرا فرکانسمون روی پورت b هست؟ مگه به RC.0 اعمال نمیشه؟
                      فرکانس به پین RC.0 اعمال میشه و بعد از اندازه گیری نتیجه روی PORTB نمایش داده میشه. خروجی باینری هست و چون پورت 8 بیتی است تا عدد 255 رو نمایش میده. برای مثال اگر خروجی به صورت 00101011 باشه عدد برابر 43 است. اگر خروجی به صورت 10001010 باشه عدد برابر 138 هست. اینا اصول اولیه علم دیجیتاله که باید بلد باشید.

                      نوشته اصلی توسط pama
                      ok، یعنی شما میفرمائید فرکانس رو مستقیما بدم به میکرو؟
                      برای اینکه بفهمم خروجیه 555 چند ولته یه کار آماتورانه کردم!!!
                      خروجی آیسی رو که به عنوان ورودی میره به میکرو ،با مولتی متر خوندم!!!
                      با تغییر فرکانس از 0 تا 5 ولت تغییر میکرد.
                      برای اینکه مستقیم 555 رو به میکرو متصل کنید باید اونو با ولتاژ ثابت 5V تغذیه کنید.

                      نوشته اصلی توسط pama
                      بدون شرط هم تست کردم جناب مهندس.
                      دقیقا در زاویه های مورد نظر قرار میگیرند.
                      نمیدونم چرا با شرط مشکل دارن؟؟!!
                      پس اشکال از نحوه دادن فرکانس هست. یک منبع پالس سالم پیدا کنید و به میکرو فرکانس بدید اگر هم نتونستید با یک میکرو دیگه یک فرکانس مناسب تولید کنید و به ایم میکرو اعمال کنید.
                      عددی که در خروجی PORTB میبینید برابر 0.8 فرکانس اعمالی باید باشه.

                      دیدگاه


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


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

                        نوشته اصلی توسط Perfect
                        فرکانس به پین RC.0 اعمال میشه و بعد از اندازه گیری نتیجه روی PORTB نمایش داده میشه. خروجی باینری هست و چون پورت 8 بیتی است تا عدد 255 رو نمایش میده. برای مثال اگر خروجی به صورت 00101011 باشه عدد برابر 43 است. اگر خروجی به صورت 10001010 باشه عدد برابر 138 هست. اینا اصول اولیه علم دیجیتاله که باید بلد باشید.
                        بله جناب مهندس، چیزایی که فرمودید رو میدونم، منتها اصلا گیجم که اعداد روی پورت b رو کجا باید ببینم تا معادلش رو بدست بیارم و ببینم در بازه ی فرکانسیمون هست یا نه؟؟!!
                        نمیدونم باید مدار فرکانس متر ببندم و رو lcd خروجی تک تک پینهای پورت b رو تست کنم؟!

                        راستی تا یادم نرفته عرض کنم که ورودی فرکانس رو بدون ترانزیستور به میکرو دادم، بازم سرووها فقط میرفتن تو همون زاویه های خاص، منتها led هایی که به پینهای پورت b بودند، همشون تو لحظه ی رفتن سرووها به همون زاویه های +30 و - 30، روشن میشدند به جز led متصل به پایه ی 40 یا همون RB7!!

                        نوشته اصلی توسط Perfect
                        برای اینکه مستقیم 555 رو به میکرو متصل کنید باید اونو با ولتاژ ثابت 5V تغذیه کنید.
                        555 رو با 7805 تغذیه کردم که در ورودی رگولاتور یه دیود 1n4007 به همراه یک خازن 1000 میکروی 25 ولت آوردم.
                        و در خروجیش هم یک 0.1 میکروی الکترولیت آوردم.
                        کار دیگه ای هست که انجامش ندادم جناب مهندس؟

                        نوشته اصلی توسط Perfect
                        پس اشکال از نحوه دادن فرکانس هست. یک منبع پالس سالم پیدا کنید و به میکرو فرکانس بدید اگر هم نتونستید با یک میکرو دیگه یک فرکانس مناسب تولید کنید و به ایم میکرو اعمال کنید.
                        عددی که در خروجی PORTB میبینید برابر 0.8 فرکانس اعمالی باید باشه.
                        ok
                        در پستهای قبلی هم عرض کرده بودم جناب مهندس(البته در صفحات اولیه ی این تایپیک) که منبع فرکانس ما در اصل خروجی سنسور سرعت خودرو هست که قبلا با مدار و برنامه ی فرکانس متر دیکد شده و مشخص شده که از 0 تا 133 هرتز هست، و در این مرحله از کار باید این خروجی به عنوان شرط برای حرکت سرووهامون باشه.
                        و طبق چیزایی که ما از جاهای مختلف دیدیم و خوندیم، و خودمون هم روش کار کردیم این فرکانس هر 800 میلی ثانیه پدیت میشه.

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

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

                        دیدگاه


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

                          نوشته اصلی توسط pama
                          چیزایی که فرمودید رو میدونم، منتها اصلا گیجم که اعداد روی پورت b رو کجا باید ببینم تا معادلش رو بدست بیارم و ببینم در بازه ی فرکانسیمون هست یا نه؟؟!!
                          نمیدونم باید مدار فرکانس متر ببندم و رو lcd خروجی تک تک پینهای پورت b رو تست کنم؟!
                          خوب اون LED هایی که به پورت B وصل کردید نشون دهنده خروجی باینری هستن دیگه. اصلاً اگر خواستید یک LCD به میکرو متصل کنید و مقدار F رو روی LCD ببینید.

                          نوشته اصلی توسط pama
                          راستی تا یادم نرفته عرض کنم که ورودی فرکانس رو بدون ترانزیستور به میکرو دادم، بازم سرووها فقط میرفتن تو همون زاویه های خاص، منتها led هایی که به پینهای پورت b بودند، همشون تو لحظه ی رفتن سرووها به همون زاویه های +30 و - 30، روشن میشدند به جز led متصل به پایه ی 40 یا همون RB7!!
                          555 رو با 7805 تغذیه کردم که در ورودی رگولاتور یه دیود 1n4007 به همراه یک خازن 1000 میکروی 25 ولت آوردم.
                          و در خروجیش هم یک 0.1 میکروی الکترولیت آوردم.
                          کار دیگه ای هست که انجامش ندادم جناب مهندس؟
                          خوب با این اوصاف خروجی 555 رو مستقیم به میکرو متصل کنید. حلا که تغذی 5 ولت هست اشکالی نداره مستقیم وصل کنید.
                          در ضمن در مورد عدد نمایش داده شده با LED ها این احتمال وجود داره که فرکانس اعمالی خیلی بالاتر از 130 هرتز باشه. برای اطمینان شرط آخر که مربوط به سروو هفتم میشه رو تغییر بدید به این صورت که اگر F بزرگتر از مثلاً 125 بود ( نه اینکه بین 125 و 130 بود) سروو هفتم در یک زاویه مشخص قرار بگیره. اگر این طور شد یعنی فرکانس خیلی بالاست.



                          if (f_in >= 125)
                          servo7 = 250
                          endif

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


                          کد:
                           
                          if f <= 25 then
                          servo1 = 0
                          endif
                          
                          if f >= 26 and f <= 40 then
                          servo2 = 25
                          endif
                          
                          if f >= 41 and f <= 60 then
                          servo3 = 75
                          endif
                          
                          if f >= 61 and f <= 80 then
                          servo4 = 125
                          endif
                          
                          if f >= 81 and f <= 100 then
                          servo5 = 175
                          endif
                          
                          if f >= 101 and f <= 115 then
                          servo6 = 200
                          endif
                          
                          if f >= 116 
                          servo7 = 250
                          endif

                          دیدگاه


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

                            نوشته اصلی توسط Perfect
                            خوب اون LED هایی که به پورت B وصل کردید نشون دهنده خروجی باینری هستن دیگه. اصلاً اگر خواستید یک LCD به میکرو متصل کنید و مقدار F رو روی LCD ببینید.
                            ok، بسیار ممنونم از پاسختون، بله با lcd فکر کنم کمتر خنگ بزنم!!

                            نوشته اصلی توسط Perfect
                            خوب با این اوصاف خروجی 555 رو مستقیم به میکرو متصل کنید. حلا که تغذی 5 ولت هست اشکالی نداره مستقیم وصل کنید.
                            در ضمن در مورد عدد نمایش داده شده با LED ها این احتمال وجود داره که فرکانس اعمالی خیلی بالاتر از 130 هرتز باشه. برای اطمینان شرط آخر که مربوط به سروو هفتم میشه رو تغییر بدید به این صورت که اگر F بزرگتر از مثلاً 125 بود ( نه اینکه بین 125 و 130 بود) سروو هفتم در یک زاویه مشخص قرار بگیره. اگر این طور شد یعنی فرکانس خیلی بالاست.



                            if (f_in >= 125)
                            servo7 = 250
                            endif

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


                            کد:
                             
                            if f <= 25 then
                            servo1 = 0
                            endif
                            
                            if f >= 26 and f <= 40 then
                            servo2 = 25
                            endif
                            
                            if f >= 41 and f <= 60 then
                            servo3 = 75
                            endif
                            
                            if f >= 61 and f <= 80 then
                            servo4 = 125
                            endif
                            
                            if f >= 81 and f <= 100 then
                            servo5 = 175
                            endif
                            
                            if f >= 101 and f <= 115 then
                            servo6 = 200
                            endif
                            
                            if f >= 116 
                            servo7 = 250
                            endif
                            بله چشم همین الان میرم دنبال کارا، اول با شروط جدید که شما لطف کردید تست میکنم و بعد فرکانس رو میخونم.
                            بسیار بسیار متشکرم از ریز بینی و توجهتون.

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

                            دیدگاه


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

                              اگر LCD رو به PORTB متصل میکنید اون خطی از برنامه که متغیر F رو در پورت میریزه حذف کنید وگرنه نمایش LCD بهم میریزه.

                              دیدگاه


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

                                بله چشم، بسیار متشکرم ازتون.

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

                                کد:
                                ****************************************************************
                                '* Name  : UNTITLED.BAS                   *
                                '* Author : [select VIEW...EDITOR OPTIONS]          *
                                '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
                                '*     : All Rights Reserved                *
                                '* Date  : 28/12/2011                    *
                                '* 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
                                
                                define lcd_dreg portb
                                define lcd_dbit 4
                                define lcd_rsreg portb
                                define lcd_rsbit 2
                                define lcd_ereg portb
                                define lcd_ebit 1
                                define lcd_bits 4
                                define lcd_lines 2
                                
                                ON INTERRUPT GOTO _interrupt
                                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                
                                
                                 
                                   TRISD=$00
                                   PORTD=$00
                                   TRISB=0
                                   TRISC.0=1
                                   
                                ;;;;;;;;;       
                                 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
                                  
                                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                    
                                
                                
                                again:
                                      ; main loop
                                 
                                ;;;;;;;;;
                                   
                                 ; servo1=0
                                 ; servo2=25
                                 ; servo3=50
                                 ; servo4=125
                                 ; servo5=175
                                 ; servo6=200
                                 ; servo7=251 
                                 
                                if f <= 25 then
                                servo1 = 0
                                endif
                                
                                if f >= 26 and f <= 40 then
                                servo2 = 25
                                endif
                                
                                if f >= 41 and f <= 60 then
                                servo3 = 75
                                endif
                                
                                if f >= 61 and f <= 80 then
                                servo4 = 125
                                endif
                                
                                if f >= 81 and f <= 100 then
                                servo5 = 175
                                endif
                                
                                if f >= 101 and f <= 115 then
                                servo6 = 200
                                endif
                                
                                if f >= 116 then
                                servo7 = 250
                                endif 
                                  
                                  
                                 lcdout $fe, 1
                                 lcdout "f="
                                 lcdout $fe, $14
                                 lcdout #f
                                
                                
                                 
                                goto again
                                
                                
                                
                                
                                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                
                                
                                _interrupt:            ; interrupt service
                                
                                     DISABLE INTERRUPT    ;disable interrapts
                                
                                    if PIR1.1=1 then     ; if TMR2IF=1 then
                                     
                                     a=a+1
                                ;;;;;;;;;;;;;;;;;;;     
                                 if a >= 40 then
                                 
                                 F=TMR1H
                                 F=F << 8
                                 F=F | TMR1L
                                 a=0
                                 TMR1L=0
                                 TMR1H=0
                                 
                                 endif
                                 ;;;;;;;;;;;;;;;;;;;      
                                
                                     OPTION_REG = OPTION_REG & $c0 
                                     OPTION_REG = OPTION_REG | $02 
                                
                                     PORTD = $01
                                     PAUSEUS 990 
                                     INTCON.2=0
                                     TMR0 = 255-servo1
                                     while INTCON.2=0
                                     wend   
                                     PORTD=$00
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;;
                                      PORTD=$02;
                                      PAUSEUS 990 
                                      INTCON.2=0
                                      TMR0 = 255-servo2 
                                      while INTCON.2=0
                                      wend
                                       PORTD=$00    
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                      PORTD=$04;
                                      PAUSEUS 990 
                                      INTCON.2=0
                                      TMR0 = 255-servo3
                                      while INTCON.2=0
                                      wend
                                       PORTD=$00
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                      PORTD=$08;
                                      PAUSEUS 990  
                                      INTCON.2=0
                                      TMR0 = 255-servo4 
                                      while INTCON.2=0
                                      wend
                                       PORTD=$00
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                      PORTD=$10
                                      PAUSEUS 990  
                                      INTCON.2=0
                                      TMR0 = 255-servo5
                                      while INTCON.2=0
                                      wend
                                       PORTD=$00
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                      PORTD=$20
                                      PAUSEUS 990  
                                      INTCON.2=0
                                      TMR0 = 255-servo6 
                                      while INTCON.2=0
                                      wend
                                       PORTD=$00
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                      PORTD=$40
                                      PAUSEUS 990  
                                      INTCON.2=0
                                      TMR0 = 255-servo7
                                      while INTCON.2=0
                                      wend
                                      PORTD=$00
                                     ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                      PIR1.1=0  ; clear TMR2IF
                                      endif 
                                      
                                      RESUME     ;return from interrapt 
                                      ENABLE INTERRUPT 
                                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                
                                end
                                منتها فقط بازه ی 0 تا 5 رو روی lcd دیدم، اون هم با نوسانات زیاد!
                                امیدوارم این بار دیگه سوتی نداده باشم!
                                کارهایی که کردم اینه که همون مدار قبلی با میکرو و سرووها و آیسی 555 سر جاشه، فقط lcd رو زدم به پورت b میکرو و برنامه رو هم مثل بالا تغییر دادم و تست کردم.
                                دیگه واقعا قاطی کردم جناب مهندس...


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

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

                                دیدگاه

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