اطلاعیه

Collapse
No announcement yet.

سروو موتور

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

    سروو موتور

    با سلام خدمت همه ی دوستان و اساتید محترم.
    خدمت دوستان و اساتید محترم عرض کنم که بنده با میکروی pic16f877a و کامپایلر pic basic pro کار میکنم، هدف کارم به حرکت در آوردن 7 تا سروو موتور به ترتیب زیر هست:

    بنده میخوام این 7 سروو با شرط بچرخن، اونم به این صورت که سنسوری دارم که خروجیش از جنس فرکانس هست و این خروجی اعمال میشه به مدار سروو و میکروی ما.

    و هدف این هست که با هر فرکانس خاصی یه سری از سرووها در زاویه ی خاصی قرار بگیرن، فرکانس ورودی به مدار با دستور count portc.0, 800, f خونده میشه.

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

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

    اینم برنامه:


    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

    f var word


    ON INTERRUPT GOTO _interrupt
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



    TRISD=$00
    PORTD=$00


    TMR1L=0
    TMR1H=0

    CCP1CON=$0b

    CCPR1H=$9c ;high byte of (40000)
    CCPR1L=$40 ;low byte of (40000)

    PIR1.2=0
    PIE1.2=1

    T1CON=$01 ;turn on timer1

    INTCON.6=1 ;PEIE=1
    INTCON.7=1 ;GIE=1 , enable global interrupt


    trisC.5 = 1
    portc.5 = 1

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    again:
    ; main loop

    f = 0
    count portc.5, 800, f

    ;;;;;;;;;;;;;
    if (f >= 20) and (f <= 25) then
    servo1 = 0
    end if
    ;;;;;;;;;;;;;
    if (f >= 40) and (f <= 45 ) then
    servo2 = 25
    end if
    ;;;;;;;;;;;;;
    if (f >= 65) and (f <= 70) then
    servo3 = 75
    end if
    ;;;;;;;;;;;;;
    if (f >= 85) and (f <= 90) then
    servo4 = 125
    end if
    ;;;;;;;;;;;;;
    if (f >= 100) and (f <= 105) then
    servo5 = 175
    end if
    ;;;;;;;;;;;;;
    if (f >= 120) and (f <= 125) then
    servo6 = 200
    end if
    ;;;;;;;;;;;;;
    if (f >= 130) and (f <= 135) then
    servo7 = 251
    endif
    ;;;;;;;;;;;;;

    goto again
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


    _interrupt: ; interrupt service

    DISABLE INTERRUPT ;disable interrapts
    if PIR1.2=1 then ; if CCP1IF then

    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.2=0 ; clear CCP1IF
    endif

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

    end

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

    بسیار سپاسگذار هستم از دوستانی که لطف کنن و برنامه رو چک بکنن، به نظر شما ایراد کار از کجا میتونه باشه؟!






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