اطلاعیه

Collapse
No announcement yet.

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

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

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

    جناب مهندس یه سوال راجع به اپتو کوپلر;
    شما فرمودید GND,VCC دو سیستم باید کاملا از هم جدا باشند، ولی الان زمین سیستم2 یا همون مدار میکرو و سرووی ما در واقع همون سر - باتری اتومبیل هست و زمین سنسور سرعت هم گمون میکنم از باتری باشه، یا اگر از ECU هم بیاد باز منبعش همون باتری میشه، درست عرض میکنم؟!

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

    دیدگاه


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

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

      دیدگاه


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

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

        بعد از اون باز هم بنده طبق روال آماتورانه ی! قبل اپتو کوپلر رو برداشتم و به جاش همون ترانزیستور BC337 رو گذاشتم، و دیتای سنسور رو به ترانزیستور دادم و از ترانزیستور به میکرو اومدم، این بار کیلومتر شمار راه افتاد ولی سرووها همچنان عملکرد نادرست داشتند، و در هر پین از 7 پین تعریف شده که قرار میگرفتند همون اتفاق تکراری رفتن به زوایای + و - 30 درجه براشون رخ میداد...

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

        دیدگاه


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

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

          بعد از اون باز هم بنده طبق روال آماتورانه ی! قبل اپتو کوپلر رو برداشتم و به جاش همون ترانزیستور BC337 رو گذاشتم، و دیتای سنسور رو به ترانزیستور دادم و از ترانزیستور به میکرو اومدم، این بار کیلومتر شمار راه افتاد ولی سرووها همچنان عملکرد نادرست داشتند، و در هر پین از 7 پین تعریف شده که قرار میگرفتند همون اتفاق تکراری رفتن به زوایای + و - 30 درجه براشون رخ میداد...
          شما قبل از اینکه مدار رو روی اتومبیل تست کنید باید با یک منبع پالس مناسب صحت اندازه گیری اونو امتحان میکردید. اصلاً ممکنه برنامه اشکال داشته باشه. برای فهمیدنش میشه یک کار کرد . اصلاً هیچ فرکانسی به میکرو ندید. به محض وصل شدن تغذیه چون به سرووها مقدار اولیه دادیم و فرکانس هم صفره قاعدتاً فقط شرط اول که مربوط به سروو اول هست برقرار میشه که اون هم دوباره متغیر سروو رو 0 قرار میده. بنابر این سروو ها باید در موقعیت مناسب باشن و اگر اینطور نیست یه جای برنامه میلنگه.
          ضمناً اگر کیلومتر شمار از کار افتاد احتمالاً قسمتی از مدار جریان میکشه. مقاومت سر پایه 1 اپتوکوپلر رو چقدر قرار دادید. اصلا سطح ولتاژ خروجی سنسور چقدره؟

          اضافه شده در تاریخ :
          این کد رو هم امتحان کنید:


          کد:
          '****************************************************************
          '* 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
           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
            
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
              
           servo1=0
           servo2=25
           servo3=50
           servo4=125
           servo5=175
           servo6=200
           servo7=251 
           
          again:
          
          if flag=1 then 
           
           if f <= 25 then
           servo1 = 250
           endif
          
           if f >= 26 and f <= 40 then
           servo2 = 200
           endif
          
           if f >= 41 and f <= 60 then
           servo3 = 150
           endif
          
           if f >= 61 and f <= 80 then
           servo4 =100
           endif
          
           if f >= 81 and f <= 100 then
           servo5 =50
           endif
          
           if f >= 101 and f <= 115 then
           servo6 = 25
           endif
          
           if f >= 116 then
           servo7 = 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>=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
          زوایایی که سرووها پس از تحقق شروط در اون قرار میگیرند با برنامه قبلی تفاوت داره.

          دیدگاه


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

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

            نوشته اصلی توسط Perfect
            برای فهمیدنش میشه یک کار کرد . اصلاً هیچ فرکانسی به میکرو ندید. به محض وصل شدن تغذیه چون به سرووها مقدار اولیه دادیم و فرکانس هم صفره قاعدتاً فقط شرط اول که مربوط به سروو اول هست برقرار میشه که اون هم دوباره متغیر سروو رو 0 قرار میده. بنابر این سروو ها باید در موقعیت مناسب باشن و اگر اینطور نیست یه جای برنامه میلنگه.
            بله کاملا حق با شماست همین الان تست میکنم و خبرشو میدم...

            نوشته اصلی توسط Perfect
            ضمناً اگر کیلومتر شمار از کار افتاد احتمالاً قسمتی از مدار جریان میکشه. مقاومت سر پایه 1 اپتوکوپلر رو چقدر قرار دادید. اصلا سطح ولتاژ خروجی سنسور چقدره؟
            ولتاژ خروجی سنسور 12 ولت هست، بنده هم طبق فرمایش شما 1 کیلو گذاشتم.
            زندگی برگ بودن در مسیر باد نیست
            امتحان ریشه هاست
            ریشه هم هرگز اسیر باد نیست
            زندگی چون پیچک است
            انتهایش میرسد پیش خدا!

            دیدگاه


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

              شرمنده. کد اولیه رو اشتباهی فرستادم ، زمانی که مشغول پاسخ بودید کد رو عوض کردم.
              قبلاً هم گفته بودم برای تولید فرکانس میتونید از یک میکرو دیگه کمک بگیرید.

              دیدگاه


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

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

                اضافه شده در تاریخ :
                جناب perfect برنامه ی با شرط رو با کد زیر همونطور که فرمودید بدون دادن فرکانس تست کردم، جالبه که نه تنها سرووی متصل به پین اول بلکه هر دو سروو، زمانی که تغذیه به مدار داده میشه، در هر پینی که باشند در زاویه ی مخصوص همون پین قرار میگیرند.
                کد:
                '****************************************************************
                '* Name  : UNTITLED.BAS                   *
                '* Author : [select VIEW...EDITOR OPTIONS]          *
                '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
                '*     : All Rights Reserved                *
                '* Date  : 30/12/2011                    *
                '* Version : 1.0                        *
                '* Notes  :                          *
                '*     :                          *
                '****************************************************************
                  
                 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 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
                  
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                    
                 servo1=0
                 servo2=25
                 servo3=50
                 servo4=125
                 servo5=175
                 servo6=200
                 servo7=251 
                 
                again:
                      ; main loop
                      
                 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      
                   
                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
                 ;;;;;;;;;;;;;;;;;;; 
                        
                     
                     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 INTERRUPT 
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                
                end
                و همچنین بدون دادن فرکانس به مدار و با برنامه ی اخیر شما هم تست کردم، تقریبا اوضاع به همین منوال بود، از این جهت عرض میکنم تقریبا ، چون دقیقا با پین اول مشکل داره، مشکلشم اینه که میره تو زاویه،اما نه در زاویه ای که این پین سروو رو با برنامه ی بدون شرط یا با برنامه ی قبلی قرار میده، بلکه در یک زاویه ی جدید دیگه قرار میگیره.

                نظر شما راجع به این اوضاع چیه جناب مهندس؟

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

                دیدگاه


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

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

                  دیدگاه


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

                    سلام جناب مهندس، بسیار متشکرم از توجهتون.
                    بله کاملا درست میفرمائید دیشب دقت کردم که زوایا عوض شدند ولی بعد از تست کردن اصلا حواسم به این موضوع نبود، شرمنده ام آقا.

                    نوشته اصلی توسط Perfect
                    علت اینکه این کار رو کردم اینه که اگر فرکانس از 25 کمتر باشه در برنامه اول به سروو مقدار 0 اعمال میشه در حالی که در مقداردهی اولیه هم 0 بود و عملاً تغییری رو نمیبینید.
                    در ضمن برنامه دیشبی چند بار به دلیل نواقص اولیه ویرایش شد و الان اونیه که باید باشه. دقت کنید که برنامه ای که تست کردید باهاش فرقی نداشته باشه.
                    اینکه بدون فرکانس سرووها در مکان مشخص قرار میگیرند یعنی مطمئنیم قسمت کنترلی برنامه درسته ولی قسمت اندازه گیری فرکانس یا منبع تولید فرکانس ایراد داره. حالا شما این برنامه جدید رو با اعمال فرکانس تست کنید
                    ok
                    سپاسگذار لطفتون هستم جناب مهندس.
                    چشم، حتما تست میکنم.
                    در نتیجه کارهایی که باید انجام بدم ابتدا برنامه نوشتن برای تولید فرکانس روی میکروی دیگه و یا پیدا کردن فانکشن هست تا به قول فرمایش شما از منبع فرکانس مطمئن بشیم، که اگر از منبع نبود بریم سراغ نحوه ی فرکانس خوندن و بعد تست برنامه، درست عرض میکنم؟

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

                    اضافه شده در تاریخ :
                    سلام جناب perfect .
                    جناب مهندس بالاخره تونستم فانکشن گیر بیارم، به احتمال خیلی زیاد فردا میتونم برم برای تست برنامه با اعمال فرکانس.
                    lcdم هم راه افتاد.

                    موضوعی که وجود داره این هست که با برنامه ی فرکانس متر زیر و مدار 555 اصلا هیچ خروجی ای رو lcd نمیبینم و فقط 0 هرتز رو نشون میده.
                    کد:
                    '****************************************************************
                    '* Name  : UNTITLED.BAS                   *
                    '* Author : [select VIEW...EDITOR OPTIONS]          *
                    '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
                    '*     : All Rights Reserved                *
                    '* Date  : 13/11/2011                    *
                    '* Version : 1.0                        *
                    '* Notes  :                          *
                    '*     :                          *
                    '****************************************************************
                    
                    @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,BOD_OFF
                    
                    define lcd_dreg portd
                    define lcd_dbit 4
                    define lcd_rsreg portd
                    define lcd_rsbit 2
                    define lcd_ereg portd
                    define lcd_ebit 3
                    define lcd_bits 4
                    
                    temp var byte
                    trisc.0 = 1
                    
                    option_reg = %10101000
                    
                    main:
                       tmr0 = 0
                       pause 1000
                       temp = tmr0
                       
                       lcdout $fe, 1
                       lcdout #temp
                       lcdout $fe, $14
                       lcdout "hz"
                       goto main
                    end
                    در نتیجه ممکنه منبع فرکانس که با مدار 555 هست ایراد داشته باشه، درست عرض میکنم؟

                    جناب مهندس کاری که بایدانجام بدم موقع تست مدار با منبع فانکشن اینه که اول فرکانس رو از 0 تا 130 هرتز به میکرو اعمال کنم (یعنی بایدابتدا از فرکانس صفر شروع کنم و با ولوم رنج فرکانس رو زیاد کنم ) و منتظر عملکرد سرووها باشم، اگر درست به زاویه رفتند یعنی اینکه منبع بنده مشکل داره و اگر درست به زاویه نرفتند نحوه ی خوندن فرکانس باید بررسی بشه، و بنده باید اونجا در حین اینکه سیگنال ژنراتور به مدارم وصل هست به آخرین برنامه ای که شما لطف فرمودید تغییرات رو به نفع وصل کردن lcd، به طریق زیر اعمال کنم و فرکانس سر میکرو رو بخونم، عرض بنده درست هست؟

                    کد:
                    '****************************************************************
                    '* Name  : UNTITLED.BAS                   *
                    '* Author : [select VIEW...EDITOR OPTIONS]          *
                    '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                    '*     : All Rights Reserved                *
                    '* Date  : 02/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
                    
                    define lcd_dreg portb
                    define lcd_dbit 4
                    define lcd_rsreg portb
                    define lcd_rsbit 2
                    define lcd_ereg portb
                    define lcd_ebit 3
                    define lcd_bits 4
                    
                    ON INTERRUPT GOTO _interrupt
                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                    
                    
                      TRISD=$00
                      PORTD=$00
                      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
                      
                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        
                     servo1=0
                     servo2=25
                     servo3=50
                     servo4=125
                     servo5=175
                     servo6=200
                     servo7=251 
                     
                    again:
                    
                    if flag=1 then 
                     
                     if f <= 25 then
                     servo1 = 250
                     endif
                    
                     if f >= 26 and f <= 40 then
                     servo2 = 200
                     endif
                    
                     if f >= 41 and f <= 60 then
                     servo3 = 150
                     endif
                    
                     if f >= 61 and f <= 80 then
                     servo4 =100
                     endif
                    
                     if f >= 81 and f <= 100 then
                     servo5 =50
                     endif
                    
                     if f >= 101 and f <= 115 then
                     servo6 = 25
                     endif
                    
                     if f >= 116 then
                     servo7 = 0
                     endif 
                     
                    flag=0 
                    endif 
                    
                    lcdout $fe, 1
                       lcdout #F
                       lcdout $fe, $14
                       lcdout "hz"
                       
                    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
                     
                     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
                    این برنامه آخرین برنامه ی شماست با این تفاوت که طبق فرمایش شما trisb = 0 حذف کردم و چون lcd روی پورت b هست portb = f رو هم حذف کردم.
                    جناب مهندس آیا محل آوردن دستورت برای دیدن فرکانس روی lcd تو این برنامه صحیح هست یا اینکه باید بعد از دستور خوندن فرکانس، که در ابتدای وقفه آوردید، دستور های lcd رو بیارم؟

                    و یه سوال دیگه!
                    جناب مهندس اگر portb = f حذف بشه، چطور میفهمیم که فرکانس روی این پورت ریخته میشه تا lcd نمایشش بده؟

                    میدونم آقا سوالاتم خیلی زیاد و خیلی آماتورانه ست :redface:
                    یک دنیا سپاسگذارم از صبرتون.

                    اضافه شده در تاریخ :
                    سلام جناب مهندس.
                    روزتون بخیر.
                    آقا واقعا شرمنده ام از این همه مزاحمت.
                    با این برنامه ی فرکانس متر هم خروجی 555 رو تست کردم اما رو lcd باز هم فقط عبارت 0hz رو میبینم در صورتیکه قبلا با همین مدار یک بازه ی فرکانسی رو داشتیم!
                    البته دیکد کردن فرکانس خروجی 555 و همچنین سنسور سرعت ماشین رو با 16f84a انجام داده بودم و این بار با 877a ، البته برنامه های مربوط به 84 و 877 کاملا با هم متفاوت هستند.

                    فرکانس متری با تایمر1 میکرو 877a :
                    کد:
                    '****************************************************************
                    '* Name  : UNTITLED.BAS                   *
                    '* Author : [select VIEW...EDITOR OPTIONS]          *
                    '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                    '*     : All Rights Reserved                *
                    '* Date  : 03/01/2012                    *
                    '* Version : 1.0                        *
                    '* Notes  :                          *
                    '*     :                          *
                    '****************************************************************
                     define osc 8
                    @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_ON ,HS_OSC
                    define DEBUG_MODE 1
                    DEFINE DEBUG_BAUD 9600
                    define lcd_dreg portd
                    define lcd_dbit 4
                    define lcd_rsreg portd
                    define lcd_rsbit 2
                    define lcd_ereg portd
                    define lcd_ebit 3
                    define lcd_bits 4
                    define lcd_lines 2
                    
                    f var word
                    temp var byte
                    
                    T1CON=$03
                    temp = 0
                    trisc.0 = 1
                    main:
                       TMR1H = 0
                       TMR1L = 0
                       PIR1.0 = 0
                       T1CON.0 = 1
                       pause 1000
                       T1CON.0 = 0
                       f.byte1 = TMR1H
                       f.byte0 = TMR1L
                       
                       lcdout $fe, 1
                       lcdout #temp
                       lcdout $fe, $14
                       lcdout "hz"
                       
                       PAUSE 1000
                       goto main
                    END
                    البته نوشتن این برنامه ها وتست کردن اونها بدین جهت بود که هنوز بنده سراغ منبع اصلی فرکانسمون (سیگنال ژنراتور) که جناب perfect شما فرمودید، نرفتم و به محض اینکه مطمئن بشم کارهایی که میخوام انجام بدم درست هست، حتما میرم و با فانکشن تست میکنم.
                    زندگی برگ بودن در مسیر باد نیست
                    امتحان ریشه هاست
                    ریشه هم هرگز اسیر باد نیست
                    زندگی چون پیچک است
                    انتهایش میرسد پیش خدا!

                    دیدگاه


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

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

                      با این برنامه ی فرکانس متر هم خروجی 555 رو تست کردم اما رو lcd باز هم فقط عبارت 0hz رو میبینم در صورتیکه قبلا با همین مدار یک بازه ی فرکانسی رو داشتیم!
                      البته دیکد کردن فرکانس خروجی 555 و همچنین سنسور سرعت ماشین رو با 16f84a انجام داده بودم و این بار با 877a ، البته برنامه های مربوط به 84 و 877 کاملا با هم متفاوت هستند.

                      فرکانس متری با تایمر1 میکرو 877a :
                      کد:
                      '****************************************************************
                      '* Name  : UNTITLED.BAS                   *
                      '* Author : [select VIEW...EDITOR OPTIONS]          *
                      '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                      '*     : All Rights Reserved                *
                      '* Date  : 03/01/2012                    *
                      '* Version : 1.0                        *
                      '* Notes  :                          *
                      '*     :                          *
                      '****************************************************************
                       define osc 8
                      @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_ON ,HS_OSC
                      define DEBUG_MODE 1
                      DEFINE DEBUG_BAUD 9600
                      define lcd_dreg portd
                      define lcd_dbit 4
                      define lcd_rsreg portd
                      define lcd_rsbit 2
                      define lcd_ereg portd
                      define lcd_ebit 3
                      define lcd_bits 4
                      define lcd_lines 2
                      
                      f var word
                      temp var byte
                      
                      T1CON=$03
                      temp = 0
                      trisc.0 = 1
                      main:
                         TMR1H = 0
                         TMR1L = 0
                         PIR1.0 = 0
                         T1CON.0 = 1
                         pause 1000
                         T1CON.0 = 0
                         f.byte1 = TMR1H
                         f.byte0 = TMR1L
                         
                         lcdout $fe, 1
                         lcdout #temp
                         lcdout $fe, $14
                         lcdout "hz"
                         
                         PAUSE 1000
                         goto main
                      END
                      البته نوشتن این برنامه ها وتست کردن اونها بدین جهت بود که هنوز بنده سراغ منبع اصلی فرکانسمون (سیگنال ژنراتور) که جناب perfect شما فرمودید، نرفتم و به محض اینکه مطمئن بشم کارهایی که میخوام انجام بدم درست هست، حتما میرم و با فانکشن تست میکنم.

                      بخاطر اینه که به جای فرکانس دارید هوا رو روی LCD نشون میدید. مقدار فرکانس داخل f ریخته شده ولی شما temp رو روی LCD نشون دادید.
                      در ضمن در اون برنامه اولتون هم اومدید با تایمر 0 پالسها رو بشمارید ولی به جای اینکه فرکانس رو به وروودی تایمر0 اعمال کنید به وروودی تایمر1 اعمال کردید.

                      دیدگاه


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

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

                        بخاطر اینه که به جای فرکانس دارید هوا رو روی LCD نشون میدید. مقدار فرکانس داخل f ریخته شده ولی شما temp رو روی LCD نشون دادید.
                        در ضمن در اون برنامه اولتون هم اومدید با تایمر 0 پالسها رو بشمارید ولی به جای اینکه فرکانس رو به وروودی تایمر0 اعمال کنید به وروودی تایمر1 اعمال کردید.
                        سلام جناب مهندس.
                        بسیار خوشحالم از حضور مجدد و پاسخهای خوب مثل همیشتون.
                        آقا من واقعا معذرت میخوام، میدونم خیلی دارم بی دقتی میکنم...

                        متشکرم که ایراد برنامه هام رو گرفتید، چشم حتما همین الان اصلاحش میکنم.

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

                        جناب مهندس کارهایی که باید انجام به این نحو هست که عرض میکنم؟؟

                        اول از همه آقا کاری که بایدانجام بدم موقع تست مدار با فانکشن اینه که اول فرکانس رو از 0 تا 130 هرتز به میکرو اعمال کنم (یعنی بایدابتدا از فرکانس صفر شروع کنم و با ولوم رنج فرکانس رو زیاد کنم ) و منتظر عملکرد سرووها باشم، اگر درست به زاویه رفتند یعنی اینکه منبع بنده مشکل داره و اگر درست به زاویه نرفتند نحوه ی خوندن فرکانس باید بررسی بشه، و در حالت دوم بنده باید اونجا در حین اینکه سیگنال ژنراتور به مدارم وصل هست به آخرین برنامه ای که شما لطف فرمودید تغییرات رو به نفع وصل کردن lcd، به طریق زیر اعمال کنم و فرکانس سر میکرو رو بخونم.

                        اندازه گیری فرکانس سر میکرو هم سخت افزارش باید به این نحو باشه که فقط lcd رو وصل کنم به پورت b در مدار سروو و میکرو و بعد فرکانس رو از طریق سیگنال ژنراتور به پین c.0 اعمال کنم.

                        برای برنامش هم به صورتی باشه که این تغییرات در آخرین برنامه ی شما اعمال بشه:
                        trisb = 0 حذف بشه و چون lcd روی پورت b هست portb = f هم حذف بشه، و در نهایت برنامه به صورت زیر باشه:
                        کد:
                        '****************************************************************
                        '* Name  : UNTITLED.BAS                   *
                        '* Author : [select VIEW...EDITOR OPTIONS]          *
                        '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                        '*     : All Rights Reserved                *
                        '* Date  : 02/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
                        
                        define lcd_dreg portb
                        define lcd_dbit 4
                        define lcd_rsreg portb
                        define lcd_rsbit 2
                        define lcd_ereg portb
                        define lcd_ebit 3
                        define lcd_bits 4
                        
                        ON INTERRUPT GOTO _interrupt
                        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                        
                        
                          TRISD=$00
                          PORTD=$00
                          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
                          
                        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            
                         servo1=0
                         servo2=25
                         servo3=50
                         servo4=125
                         servo5=175
                         servo6=200
                         servo7=251 
                         
                        again:
                        
                        if flag=1 then 
                         
                         if F <= 25 then
                         servo1 = 250
                         endif
                        
                         if F >= 26 and F <= 40 then
                         servo2 = 200
                         endif
                        
                         if F >= 41 and F <= 60 then
                         servo3 = 150
                         endif
                        
                         if F >= 61 and F <= 80 then
                         servo4 =100
                         endif
                        
                         if F >= 81 and F <= 100 then
                         servo5 =50
                         endif
                        
                         if F >= 101 and F <= 115 then
                         servo6 = 25
                         endif
                        
                         if F >= 116 then
                         servo7 = 0
                         endif 
                         
                        flag=0 
                        endif 
                        
                        lcdout $fe, 1
                           lcdout #F
                           lcdout $fe, $14
                           lcdout "hz"
                           pause 70
                           
                        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
                         
                         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

                        و باز هم تکرار یک سوال آماتورانه ی دیگه:
                        جناب مهندس اگر portb = f حذف بشه، چطور میفهمیم که فرکانس روی این پورت ریخته میشه تا lcd نمایشش بده؟
                        زندگی برگ بودن در مسیر باد نیست
                        امتحان ریشه هاست
                        ریشه هم هرگز اسیر باد نیست
                        زندگی چون پیچک است
                        انتهایش میرسد پیش خدا!

                        دیدگاه


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

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

                          جناب مهندس کارهایی که باید انجام به این نحو هست که عرض میکنم؟؟

                          اول از همه آقا کاری که بایدانجام بدم موقع تست مدار با فانکشن اینه که اول فرکانس رو از 0 تا 130 هرتز به میکرو اعمال کنم (یعنی بایدابتدا از فرکانس صفر شروع کنم و با ولوم رنج فرکانس رو زیاد کنم ) و منتظر عملکرد سرووها باشم، اگر درست به زاویه رفتند یعنی اینکه منبع بنده مشکل داره و اگر درست به زاویه نرفتند نحوه ی خوندن فرکانس باید بررسی بشه، و در حالت دوم بنده باید اونجا در حین اینکه سیگنال ژنراتور به مدارم وصل هست به آخرین برنامه ای که شما لطف فرمودید تغییرات رو به نفع وصل کردن lcd، به طریق زیر اعمال کنم و فرکانس سر میکرو رو بخونم.
                          اندازه گیری فرکانس سر میکرو هم سخت افزارش باید به این نحو باشه که فقط lcd رو وصل کنم به پورت b در مدار سروو و میکرو و بعد فرکانس رو از طریق سیگنال ژنراتور به پین c.0 اعمال کنم.
                          برای برنامش هم به صورتی باشه که این تغییرات در آخرین برنامه ی شما اعمال بشه:
                          trisb = 0 حذف بشه و چون lcd روی پورت b هست portb = f هم حذف بشه، و در نهایت برنامه به صورت زیر باشه:
                          کد:
                          '****************************************************************
                          '* Name  : UNTITLED.BAS                   *
                          '* Author : [select VIEW...EDITOR OPTIONS]          *
                          '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                          '*     : All Rights Reserved                *
                          '* Date  : 02/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
                          
                          define lcd_dreg portb
                          define lcd_dbit 4
                          define lcd_rsreg portb
                          define lcd_rsbit 2
                          define lcd_ereg portb
                          define lcd_ebit 3
                          define lcd_bits 4
                          
                          ON INTERRUPT GOTO _interrupt
                          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                          
                          
                            TRISD=$00
                            PORTD=$00
                            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
                            
                          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                              
                           servo1=0
                           servo2=25
                           servo3=50
                           servo4=125
                           servo5=175
                           servo6=200
                           servo7=251 
                           
                          again:
                          
                          if flag=1 then 
                           
                           if F <= 25 then
                           servo1 = 250
                           endif
                          
                           if F >= 26 and F <= 40 then
                           servo2 = 200
                           endif
                          
                           if F >= 41 and F <= 60 then
                           servo3 = 150
                           endif
                          
                           if F >= 61 and F <= 80 then
                           servo4 =100
                           endif
                          
                           if F >= 81 and F <= 100 then
                           servo5 =50
                           endif
                          
                           if F >= 101 and F <= 115 then
                           servo6 = 25
                           endif
                          
                           if F >= 116 then
                           servo7 = 0
                           endif 
                           
                          flag=0 
                          endif 
                          
                          lcdout $fe, 1
                             lcdout #F
                             lcdout $fe, $14
                             lcdout "hz"
                             pause 70
                             
                          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
                           
                           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
                          همینطوره. فقط موقع کار باید مراقب باشید تا سطح ولتاژ پالس اعمالی به میکرو برابر 5V باشه. اگر بیشتر باشه احتمال داره پین میکرو معیوب بشه.

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

                          و باز هم تکرار یک سوال آماتورانه ی دیگه:
                          جناب مهندس اگر portb = f حذف بشه، چطور میفهمیم که فرکانس روی این پورت ریخته میشه تا lcd نمایشش بده؟
                          آقا این اصلاً ربطی به LCD نداره. زمانی که شما یک دستور برای نمایش یک عبارت روی LCD مینویسید زمان اجرا توسط همون دستور و توابع LCD عبارت مورد نظر روی PORT قرار داده میشه. در ضمن این اطلاعتی که به LCD منتقل میشه معمولاً 4 بیتی اند و ربطی به فرکانسی که محاسبه کردیم هم ندارن.

                          دیدگاه


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

                            نوشته اصلی توسط Perfect
                            همینطوره. فقط موقع کار باید مراقب باشید تا سطح ولتاژ پالس اعمالی به میکرو برابر 5V باشه. اگر بیشتر باشه احتمال داره پین میکرو معیوب بشه.
                            ok ،در نتیجه باید فرکانس مربعی ای که با فانکشن میسازم دامنش 5 ولت باشه، یا به عبارتی amplitude رو روی 5 ولت تنظیم کنم، درسته عرض بنده؟

                            الان فهمیدم دلیل سوختن پورت c میکروم چی بودجناب مهندس !!

                            نوشته اصلی توسط Perfect
                            آقا این اصلاً ربطی به LCD نداره. زمانی که شما یک دستور برای نمایش یک عبارت روی LCD مینویسید زمان اجرا توسط همون دستور و توابع LCD عبارت مورد نظر روی PORT قرار داده میشه. در ضمن این اطلاعتی که به LCD منتقل میشه معمولاً 4 بیتی اند و ربطی به فرکانسی که محاسبه کردیم هم ندارن.
                            فقط بهم اثبات شد که بیسواد بیسوادم.
                            من معذرت میخوام آقا....

                            جناب مهندس بسیار متشکرم از لطفتون در تصحیح بی دقتی بنده در خوندن فرکانس با تایمر1 و تایمر0 ، هر دو برنامه رو اصلاح کردم و تونستم با هر دوی اونها خروجی مدار 555 رو بخونم، که رنج فرکانسی از 12 تا حدود 300 هرتز رو نشون میداد.

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

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


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

                            اما وقتی با همون مدار آیسی 555 به مدار سروو فرکانس ورودی میدم، سرووها در ابتدا با وصل شدن تغذیه، همزمان به زاویه میرن، و وقتی ولوم پتانسیومتر مدار 555 رو میپرخونم، هر کدوم از سرووها به نوبت ، با افزایش فرکانس در زاویه ی جدیدی قرار میگیرن، به ترتیب زیر:

                            پین زاویه به محض زدن تغذیه زاویه بعد از افزایش فرکانس

                            19 65 درجه به چپ ؟؟!!
                            20 15 درجه به راست 55 درجه به چپ
                            21 10 درجه به راست 26 درجه به چپ
                            22 22 درجه به چپ 10 درجه به چپ
                            27 35 درجه به چپ 10 درجه به راست
                            28 55 درجه به چپ 15 درجه به راست
                            29 60 درجه به چپ 30 درجه به راست


                            روی پین 19 هر چند بار که تست کردم، به هیچ عنوان با افزایش فرکانس نچرخید!!

                            جناب مهندس خودم میدونم که اعداد حاصل از تستم کاملا نا معقول و غیر منطقی اند :sad:

                            اگر بنده اشتباه نکنم طبق prescaler که شما 1:8 رو برای کانفیگ کردن تایمر صفر جهت سرریز این تایمر و ساختن زمان high بین 1 تا 2 میلی ثانیه استفاده کردید، و اینکه کلاک ورودی میکرو هم Fosc/4 یا همون 2 مگ خواهد بود، در نتیجه زمان طی شدن هر کلاک داخلی 0.5 میکرو ثانیه است و مثلا برای سروو1 داریم:
                            255-251=4
                            پس 4 پالس کلاک طی میشه تا میکرو سر ریز کنه، به عبارتی : 4 * 0.5 میکرو ثانیه = 0.002 میلی ثانیه

                            0.002 * 8 = 0.016 میلی ثانیه و با احتساب زمان 1 میلی ثانیه که قبلا ساخته شده بود، زمان high بودن پالس برای کنترل سروو 1 برابر با 1.016 میلی ثانیه خواهد بود، و این یعنی سروو1 باید تقریبا در منتها الیه سمت چپ خود قرار بگیرد، اون هم بعد از اعمال فرکانس متناظر به اون، بقیه ی سرووها هم به همین ترتیب....

                            بنده درست متوجه شدم جناب مهندس؟
                            اما در عمل بنده چیز دیگه ای رو میبینم....
                            به نظر شما دلیلش چه چیزی میتونه باشه؟

                            بعد از مدتها سرووها دارن با شرط میرن تو زاویه، اونم اینجوری!!!

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

                            LCD رو هم به سر میکرو زدم (پورت b ) روشن شد، منتها هیچی نشون نداد، تا علاوه بر اینکه ببینم چه فرکانسی میاد سر میکرو، یا لااقل بدونم هر کدوم از سرووها، آیا در فرکانسهای درست که شما تو برنامه لطف کردید، در زاویه قرار میگیرند یا خیر!

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


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



                            اضافه شده در تاریخ :
                            سلام .
                            جناب مهندس بنده خروجی مدار 555 رو همزمان که به سروو اعمال میشد به مدار فرکانس متر هم دادم و مشاهده شد که سرووها دقیقا هر کدوم سر همون فرکانس خاص خودشون که شما تو برنامه تعریف کردید، در زاویه ی متناظرشون قرار میگیرن.

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

                            دستور میفرمائید چه کاری انجام بدم تا این مشکل رفع بشه؟
                            راستی بهتر نیست برم و دوباره با فانکشن به مدار ورودی بدم و عملکرد سرووها رو ببینم؟

                            جناب مهندس از کمکهای بزرگتون یک دنیا سپاسگذارم.
                            موقعیت الان این پروژه مرهون زحمتهای شماست.


                            اضافه شده در تاریخ :
                            سلام.
                            روز بخیر.
                            بنده که زاویه ها رو نگاه میکنم به نظرم 3 تای آخری یعنی، زاویه های متناظر سرووهای 5 و 6 و 7 که رو پینهای 27 و 28 و 29 هستند یه کم غیر معقول به نظر میرسند و 4 تای اولی درست در زاویه قرار میگیرند، درست عرض میکنم؟

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

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

                            جناب مهندس بنده گوش به فرمان اوامر شمام.

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

                            کد:
                             
                             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=1 ; Enable timer2 interrupt
                             T2CON=$4F
                            ;;;;;;;;;
                            
                              INTCON.6=1  ;PEIE=1
                              INTCON.7=1  ;GIE=1 , enable global interrupt
                              
                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                
                                
                              
                            
                            again:
                            
                            if flag=1 then 
                             
                             if f <= 25 then
                             servo1 = 250
                             endif
                            
                             if f >= 26 and f <= 40 then
                             servo2 = 200
                             endif
                            
                             if f >= 41 and f <= 60 then
                             servo3 = 150
                             endif
                            
                             if f >= 61 and f <= 80 then
                             servo4 =100
                             endif
                            
                             if f >= 81 and f <= 100 then
                             servo5 =50
                             endif
                            
                             if f >= 101 and f <= 115 then
                             servo6 = 25
                             endif
                            
                             if f >= 116 then
                             servo7 = 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 = $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
                            تغییری که در عملکرد سرووها رخ داد به این ترتیب بود که با این بار در هر بار تست کردن مدار، یا به عبارتی وصل شدن تغذیه، اتفاق متفاوتی برای سرووها در هر پین می افتاد.
                            مثلا یک بار طبق خواسته ی ما در ابتدا سرووها هیچ حرکتی نداشتند و با افزایش فرکانس بود که حرکت کرده و در زاویه ی خودشون قرار میگرفتند، اما بار دوم یعنی با قطع کردن تغذیه و وصل مجدد اون دیده میشد که سرووها حرکت اولیه رو باز هم دارند...
                            یعنی این خواسته که در ابتدا سرووها ساکن باشند و با احقاق شرطتشون در زاویه قرار بگیرند، یک خط در میون اتفاق می افتاد.

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

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

                            دیدگاه


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

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

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

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

                              کد:
                               
                               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=1 ; Enable timer2 interrupt
                               T2CON=$4F
                              ;;;;;;;;;
                              
                                INTCON.6=1  ;PEIE=1
                                INTCON.7=1  ;GIE=1 , enable global interrupt
                                
                              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                  
                                  
                                
                              
                              again:
                              
                              if flag=1 then 
                               
                               if f <= 25 then
                               servo1 = 250
                               endif
                              
                               if f >= 26 and f <= 40 then
                               servo2 = 200
                               endif
                              
                               if f >= 41 and f <= 60 then
                               servo3 = 150
                               endif
                              
                               if f >= 61 and f <= 80 then
                               servo4 =100
                               endif
                              
                               if f >= 81 and f <= 100 then
                               servo5 =50
                               endif
                              
                               if f >= 101 and f <= 115 then
                               servo6 = 25
                               endif
                              
                               if f >= 116 then
                               servo7 = 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 = $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
                              دوستی امروز میگفتند که اصولا سرووها به همین شکل کار میکنند و با تغذیه گرفتن، آنا حرکت میکنن، در نتیجه چاره ی کار ما استفاده از نوع دیگه ای از سرووهاست که با پورت سریال میکرو کار میکنند و اصلا نحوه ی برنامه ریزیشون با این موتورها فرق داره و اونجا دیگه عرض پالس مطرح نیست :sad:

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

                              دیدگاه


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

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

                                از راهنمائیتون بسیار سپاسگذارم، بنده مطمئن بودم که یک راه حلی وجود داره...
                                اما بازم سواد نم دارم یاریم نکرد....
                                ok، چشم، حتما تست میکنم...


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

                                دیدگاه

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