اطلاعیه

Collapse
No announcement yet.

راه اندازی موتور dc

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

    #76
    پاسخ : راه اندازی موتور dc

    سلام و عرض ادب.
    دوستان باز هم مشکل....

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

    اینم برنامه:

    کد:
    @ DEVICE PIC16F877A ,WDT_OFF ,LVP_OFF ,PROTECT_OFF ,PWRT_ON ,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
    DEFINE LCD_LINES 2
    
    DEFINE CCP1_REG PORTC
    DEFINE CCP1_BIT 2
    
    deFINE CCP2_REG PORTC
    DEFINE CCP2_BIT1
    
    TRISA = 0
    TRISc.0 = 1
    
    A VAR WORD
    f var word
    
    ON INTERRUPT GOTO lable
    
    OPTION_REG = $7F
    INTCON = %10010000
    
    T1CON = $03
    
    
    loop1:
    
     TMR1L=0
     TMR1H=0
     PIR1.0 = 0
     T1CON.0 = 1
     PAUSE 800
     T1CON.0 = 0
     f.byte1=TMR1H
     f.byte0=TMR1l
     
     lcdout $fe, 1
     lcdout #f
     lcdout $fe, $14
     lcdout "hz"
     pause 500
     
     
     if f >= 20 and f <=40 then 
     
      LOW portA.0
      hpwm 1, 205, 300
      pause 50
    
      A = 0
      
      loop_sh:
      
        LCDOUT $FE, $c0 
        LCDOUT "A ="
        lcdout $fe, $14
        LCDOUT #A
    
    	if A >= 30 then tormoz
      goto loop_sh
    
     endif 
    
      
     if f >= 60 and f <=80 then 
     
      LOW portA.1
      hpwm 2, 205, 300
      pause 50
     
      A = 0
      
      loop_sh_1:
      
        LCDOUT $FE, $c0 
        LCDOUT "A ="
        lcdout $fe, $14
        LCDOUT #A
    
    	if A >= 30 then tormoz
      goto loop_sh_1
      
     endif
    
    
    goto loop1
    
      
    tormoz:
      low portA.0
      low portA.1
      hpwm 1, 0, 300
      hpwm 2, 0, 300
      pause 500
      
    goto loop1
      
    
     disable
    lable:
      A = A + 1
      INTCON.1 = 0
      
     RESUME
     enable
    
    END
    به نظر دوستان ایراد ماجرا این بار از کجاس؟؟؟!!

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

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

    دیدگاه


      #77
      پاسخ : راه اندازی موتور dc

      سلام.
      واسه استفاده از چندتا اینتراپت یه کلک مرغابی :nerd: وجود داره!

      فرض کنین 5 تا اینتراپت لازم دارین.کاتد 5تا دیود رو به هم و وصل میکنین و میدین به اینتراپت میکرو. آند های دیودها هم وصل میشه به منابعی که قراره اینتراپت بدن.همون منابع رو به پایه های میکرو هم وصل میکنین.حالا وقتی اینتراپت خارجی اومد؛ یعنی حداقل یکی از اون 5 تا منبع "1" شدن.تو زیر برنامه ی اینتراپت میاین و پایه هایی رو که اون منابع بهشون وصل بود رو میخونین.هرکدوم "1" بود میفهمین که کدوم منبع اینتراپت داده.

      18F452 رو پیشنهاد میکنم که 3 تا اینتراپت خارجی داره.هرچند اگه با روش بالا بتونین جواب بگیرین؛ فکر نکنم نیازی باشه...
      و اگه بیشتر بخواین باید برین سراغ میکروهایی که تعداد پایه هاشون بیشتر از 40 تا هست که اونوقت احتمالا باید برین سراغ سری 18F یا شااااید 16Fی که SMD باشه و تعداد پایه هاشون زیاد باشه علاوه بر اینکه بیشتر از یه دونه اینتراپت داشته باشه...
      (مثلاPIC18F6525 البته به شرطی که پیدا بشه تو بازار!)

      دیدگاه


        #78
        پاسخ : راه اندازی موتور dc

        نوشته اصلی توسط شاهرخ
        سلام.
        واسه استفاده از چندتا اینتراپت یه کلک مرغابی :nerd: وجود داره!

        فرض کنین 5 تا اینتراپت لازم دارین.کاتد 5تا دیود رو به هم و وصل میکنین و میدین به اینتراپت میکرو. آند های دیودها هم وصل میشه به منابعی که قراره اینتراپت بدن.همون منابع رو به پایه های میکرو هم وصل میکنین.حالا وقتی اینتراپت خارجی اومد؛ یعنی حداقل یکی از اون 5 تا منبع "1" شدن.تو زیر برنامه ی اینتراپت میاین و پایه هایی رو که اون منابع بهشون وصل بود رو میخونین.هرکدوم "1" بود میفهمین که کدوم منبع اینتراپت داده.
        سلام از بنده است.
        بسیار متشکرم از لطفتون.

        نوشته اصلی توسط شاهرخ
        18F452 رو پیشنهاد میکنم که 3 تا اینتراپت خارجی داره.هرچند اگه با روش بالا بتونین جواب بگیرین؛ فکر نکنم نیازی باشه...
        و اگه بیشتر بخواین باید برین سراغ میکروهایی که تعداد پایه هاشون بیشتر از 40 تا هست که اونوقت احتمالا باید برین سراغ سری 18F یا شااااید 16Fی که SMD باشه و تعداد پایه هاشون زیاد باشه علاوه بر اینکه بیشتر از یه دونه اینتراپت داشته باشه...
        (مثلاPIC18F6525 البته به شرطی که پیدا بشه تو بازار!)
        متشکرم ازتون.
        به نظر شما جایگزین کردن 18f452 با 16f877a ای که الان دارم، دردسرهای جدیدی رو با خودش داره؟؟
        من فکر میکنم مدار راه اندازش و فیوزبیتهاش حسابی وقتم رو بگیرن و بذارنم سر کار!!
        از طرفی هم دوست دارم کاری که داره انجام میشه نهایتا یه کار حساب شده باشه، درسته که این میکرویی که دارم رو خیلی براش وقت گذاشتم، اما وقتی نوع ارتقا یافته ترش هست، دوست دارم با اونا کار کنم، که نهایتا دستگام جایی برای لنگ زدن نداشته باشه....
        باز هم هنوز مردّدم، تردیدم هم به خاطر ترسمه که نکنه این میکرو جدیده مثل اوایل که قرار بود f84 رو بکنم f877a، بخواد همون اندازه اذیتم کنه...

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

        دیدگاه


          #79
          پاسخ : راه اندازی موتور dc

          بابت جایگذین کردن 452 با 877 :

          سخت افزار ( شماره ی پایه ها-محل قرار گیری پایه ها-تعداد پایه ها) دقــــــــــیـــــــــقـــــــــــا با هم برابر هستن،با این تفاوت که 452 فکر کنم یه پایه بیشتر میتونه خروجی داشته باشه.

          تنظیمات نرم افزاری و فیوز بیتها همچین مختصر پیچیده تر هست به نسبت 877؛ که اون هم پیشنهادم نوشتن یه برنامه تست ساده(مثل چشمک زن) هست تا حتی اگه شده با سعی خطا تنظیمات تصحیح رو کشف بکنین!! :nerd:

          دیدگاه


            #80
            پاسخ : راه اندازی موتور dc

            نوشته اصلی توسط شاهرخ
            بابت جایگذین کردن 452 با 877 :

            سخت افزار ( شماره ی پایه ها-محل قرار گیری پایه ها-تعداد پایه ها) دقــــــــــیـــــــــقـــــــــــا با هم برابر هستن،با این تفاوت که 452 فکر کنم یه پایه بیشتر میتونه خروجی داشته باشه.
            بسیار متشکرم.
            حتی تو vcc و gnd کردن پایه هاش و محل مقاومت و کریستالش؟
            معذرت میخوام :redface: اینا رو دیگه باید تو دیتا شیت ببینم...

            نوشته اصلی توسط شاهرخ
            تنظیمات نرم افزاری و فیوز بیتها همچین مختصر پیچیده تر هست به نسبت 877؛ که اون هم پیشنهادم نوشتن یه برنامه تست ساده(مثل چشمک زن) هست تا حتی اگه شده با سعی خطا تنظیمات تصحیح رو کشف بکنین!! :nerd:
            ok، متشکرم.

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

            قرار بر این شد که تو برنامه هر 2 تا موتور dc رو از این انکدرای خودمون بذارم روش و تو یه برنامه هر 2 تائیش رو با شرط خروجی اون سنسوره راه بندازم و با رسیدن به پالس خاصی بگم هر کدومشون وایستند...
            یکی یه انکدر سر هر کدومشون گذاشتم و جفت انکدرها رو هم دادم به اینت اکسترنال میکرو( به یه اینت اکسترنال، چون میکروم بیشتر از یکی نداره).
            اما عملکرد موتورها اشتباه بود چون اصلا این کاری که کرده بودم اشتباه بود، برای همین تصمیم بر این شد که پالسهای انکدر یکی از موتورها رو اینت اکسترنال بخونه و اون یکی رو هم یکی از کانترهای میکرو...

            برای همین از تایمر 0 تو مد کانتر خواستم استفاده کنم، که 2 تا مساله وجود داره؛ یکی اینکه چون از وقفه خارجی استفاده شده و در حالت عادی این وقفه روی لبه بالا رونده سیگنال پایه INT رخ میده و برای این کار بیت هفتم از رجیستر تایمر صفر یا OPTION_REG.6 نشونده یا 1 میشه...
            حالا اگه بخوام از تایمر صفر در مد کانتر استفاده کنم، این 2 موضوع با هم تلاقی یا تداخلی ایجاد نمیکنند و روی عملکرد کانتر و یا اینت اکسترنال تاثیری نمیگذاره؟!
            (خواهشا به سوالم نخندید!! این پروژه فضایی رو برای من ایجاد کرده که به 0 تا 100 برنامه و سخت افزارش من همیشه شک دارم!!!)

            و سوال دوم اینکه برنامه به این ترتیب که کانتر 0 خروجی یکی از انکدرها رو بشماره، و وقفه خارجی هم اون یکی رو، به این صورت در اومده، اما متغیر B یا همون تعداد پالسهایی که باید کانتر 0 ما بشماره اصلا تغییر نمیکنه، یا به عبارتی پالسهایی که انکدر ما میزنه رو اصلا نمیشمره تا متغیر B ما به عددی که به عنوان شرط برای ایستادن موتور دوم گذاشتیم برسه و موتورمون وایسته

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

            کد:
            @ DEVICE PIC16F877A ,WDT_OFF ,LVP_OFF ,PROTECT_OFF ,PWRT_ON ,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
            DEFINE LCD_LINES 2
            
            DEFINE CCP1_REG PORTC
            DEFINE CCP1_BIT 2
            
            deFINE CCP2_REG PORTC
            DEFINE CCP2_BIT1
            
            TRISA = %00010000
            TRISc.0 = 1
            
            A VAR WORD
            f var word
            B VAR WORD
            
            ON INTERRUPT GOTO lable
            
            OPTION_REG = %01100111
            INTCON = %10010000
            
            T1CON = $03
            
            
            loop1:
            
             TMR1L=0
             TMR1H=0
             PIR1.0 = 0
             T1CON.0 = 1
             PAUSE 800
             T1CON.0 = 0
             f.byte1=TMR1H
             f.byte0=TMR1l
             
             
             
             lcdout $fe, 1
             lcdout #f
             lcdout $fe, $14
             lcdout "hz"
             pause 500
             
             
             if f >= 20 and f <= 40 then 
             
              LOW portA.0
              hpwm 1, 205, 300
              pause 50
            
              A = 0
              
              loop_sh:
              
                LCDOUT $FE, $c0 
                LCDOUT "A ="
                lcdout $fe, $14
                LCDOUT #A
                
            	if A >= 30 then tormoz
              goto loop_sh
            
             endif 
            
              
             if f >= 60 and f <=80 then 
             
            
              LOW portA.1
              hpwm 2, 205, 300
              pause 50
              
              TMR0 = 0
             PAUSE 1000
             B = TMR0
            
             
              A = 0
              B = 0
              
              loop_sh_1:
              
                LCDOUT $FE, $c0 
                LCDOUT "A ="
                lcdout $fe, $14
                LCDOUT #A
                LCDOUT $fe, $14
                lcdout "B ="
                lcdout $fe,$14
                lcdout #B
            
            
            	if B >= 20 then tormoz
              goto loop_sh_1
              
             endif
            
            
            goto loop1
            
              
            tormoz:
              low portA.0
              low portA.1
              hpwm 1, 0, 300
              hpwm 2, 0, 300
              pause 500
              
            goto loop1
              
            
             disable
            lable:
              A = A + 1
              INTCON.1 = 0
              
             RESUME
             enable
            
            END
            من حدس میزنم ایراد کار از اینجا باشه که تو روال شمردن کانتر بهش گفتم که هر یه ثانیه در میون بشمر پالسها رو، و اساس مشکلم هم اینجاست! چون میدونم که نباید این ریختی باشه و هر موقع هر پالس زده شد شمرده بشه، اما با کانتر چجوری؟؟!!
            زندگی برگ بودن در مسیر باد نیست
            امتحان ریشه هاست
            ریشه هم هرگز اسیر باد نیست
            زندگی چون پیچک است
            انتهایش میرسد پیش خدا!

            دیدگاه


              #81
              پاسخ : راه اندازی موتور dc

              یه جا مختصر سوتی دادین! :redface:

              شما ورودی رو به تایمر صفر میدین؛ اما تو برنامه با تایمر یک کارمیکنین!!

              دیدگاه


                #82
                پاسخ : راه اندازی موتور dc

                نه، اشتباه نکنید!
                من باید توضیح میدادم ببخشید...
                تایمر 1 داره پالس خروجی همون سنسوری رو میشمره که قراره به عنوان شرط برای حرکت موتورها در نظر گرفته بشه...

                انکدر رو به همون تایمر0 دادم و متاسفانه نمیشمره...
                اول شرط کردم که وقتی فرکانس خروجی سنسور بین 60 و 80 بود، موتور دوم روشن بشه و بعد پالسهاش با تایمر0 خونده بشه:

                کد:
                 if f >= 60 and f <=80 then 
                 
                
                  LOW portA.1
                  hpwm 2, 205, 300
                  pause 50
                  
                  TMR0 = 0
                 PAUSE 1000
                 B = TMR0
                بعد از اون هم یه کم پائینتر:
                کد:
                if B >= 20 then tormoz
                و تو tormoz موتور رو خاموش میکنیم....
                زندگی برگ بودن در مسیر باد نیست
                امتحان ریشه هاست
                ریشه هم هرگز اسیر باد نیست
                زندگی چون پیچک است
                انتهایش میرسد پیش خدا!

                دیدگاه


                  #83
                  پاسخ : راه اندازی موتور dc

                  خب ظاهرا من سوتی دادم! :nerd:

                  برنامه رو الان با دقت بیشتری نسبت به دفعه قبل نگاه کردم؛ جسارته ها! ولی برنامه رو یه ذره پیچیده نوشتین! دستورات Goto که گذاشتین برنامه رو گنگ کرده.

                  احساس میکنم تو اون شرط ها که برای متغیر A استفاده کردین ایراد وجود داشته باشه.(تو بازه های شرط) اگه امکان داره برنامه رو تیکه تیکه توضیح میدین؟(البته نه خط به خط! Lable به Lable ) :nerd:

                  دیدگاه


                    #84
                    پاسخ : راه اندازی موتور dc

                    چشم...

                    کد:
                    loop1:
                    
                     TMR1L=0
                     TMR1H=0
                     PIR1.0 = 0
                     T1CON.0 = 1
                     PAUSE 800
                     T1CON.0 = 0
                     f.byte1=TMR1H
                     f.byte0=TMR1l
                    .
                    .
                    این تیکه ی اول برنامه داره پالسهای خروجی سنسورمون رو میخونه تا ما به عنوان شرط تو برنامه ازش استفاده کنیم...

                    کد:
                     if f >= 20 and f <= 40 then 
                     
                      LOW portA.0
                      hpwm 1, 205, 300
                      pause 50
                    بعد از اون تو این شرط موتور اول روشن میشه...

                    کد:
                      loop_sh:
                      
                        LCDOUT $FE, $c0 
                        LCDOUT "A ="
                        lcdout $fe, $14
                        LCDOUT #A
                        
                    	if A >= 30 then tormoz
                      goto loop_sh
                    و توی این لوپ پالسهای انکدر موتور اول که با وقفه خارجی شمرده شدن، اگه به 30 رسید، ما باید به زیر روال خاموش کردن موتور بریم (tormoz)

                    کد:
                     
                     if f >= 60 and f <=80 then 
                     
                    
                      LOW portA.1
                      hpwm 2, 205, 300
                      pause 50
                      
                      TMR0 = 0
                     PAUSE 1000
                     B = TMR0
                    تو این شرط از خروجی سنسورمون، موتور دوم روشن میشه و باید پالسهای انکدر موتور دوم بعد از روشن شدن موتور دوم توسط تایمر 0 شمرده بشه....

                    کد:
                    loop_sh_1:
                      
                        LCDOUT $FE, $c0 
                        LCDOUT "A ="
                        lcdout $fe, $14
                        LCDOUT #A
                        LCDOUT $fe, $14
                        lcdout "B ="
                        lcdout $fe,$14
                        lcdout #B
                    
                    
                    	if B >= 20 then tormoz
                      goto loop_sh_1
                      
                     endif
                    حالا پالسهای شمرده شده از هر 2 انکدر نمایش داده بشه و بعد با شرط پالس خاصی از انکدر دوم موتور دوم به زیر برنامه tormoz هدایت بشه تا موتور دوم هم بایسته...

                    کد:
                    tormoz:
                      low portA.0
                      low portA.1
                      hpwm 1, 0, 300
                      hpwm 2, 0, 300
                      pause 500
                      
                    goto loop1
                      
                    
                     disable
                    lable:
                      A = A + 1
                      INTCON.1 = 0
                      
                     RESUME
                     enable
                    این هم زیر برنامه ترمز و خوندن پالسهای انکدر اول با اینت اکسترنال....

                    اضافه شده در تاریخ :
                    باز هم عرض کنم که من حدس میزنم ایراد کار از اینجا باشه که تو روال شمردن کانتر بهش گفتم که هر یه ثانیه در میون بشمر پالسها رو:

                    کد:
                     if f >= 60 and f <=80 then 
                     
                    
                      LOW portA.1
                      hpwm 2, 205, 300
                      pause 50
                      
                      TMR0 = 0
                     PAUSE 1000
                     B = TMR0
                    و اساس مشکلم هم اینجا باشه! چون میدونم که نباید این ریختی باشه و هر موقع انکدرمون هر پالسی که زد شمرده بشه، اما با کانتر چجوری؟؟!!

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

                    دیدگاه


                      #85
                      پاسخ : راه اندازی موتور dc

                      سلام دوست عزیز
                      اول اشکالایی تو برنامت داریو بهت بگم:
                      1-در option_reg شما مقدار ps روی 256 قرار دادی و به تایمر هم نسبتش دادی، یعنی با هر 256 پالس خارجی تایمرت 1ی میشمرد!
                      درستش اینه: OPTION_REG = %01101000
                      2-شما برای شمردن پالسهای تایمر 0که در حالت شمارنده قرار گرفته بود اومدی به جای اینکه تو لوپ بندازی ، 1 ثانیه بهش فرصت دادی بعد خروجی گرفتی، خوب معلومه بیرون این 1ثانیه پالسی شمرده نمیشه، نحوه دست نوشتنش اینجوریه :
                      کد:
                      if f >= 60 and f <=80 then
                        LOW portA.1
                        hpwm 2, 205, 300
                        pause 50
                        A = 0
                        B = 0
                        tmr0=0     '******
                        loop_sh_1:
                          b=tmr0    '******
                          LCDOUT $FE, $c0 
                          LCDOUT "A ="
                          lcdout $fe, $14
                          LCDOUT #A
                          LCDOUT $fe, $14
                          lcdout "B ="
                          lcdout $fe,$14
                          lcdout #B
                      	if B >= 20 then 
                        gosub tormoz     '******
                      	else         '******
                        goto loop_sh_1    '******
                        endif
                        
                      endif
                      3- هرچند مال شما هم درست بود، ولی رفتن به لوپ tormoz به شکل gosub-return بهتره.

                      اضافه شده در تاریخ :
                      در نهایت برنامت که تصحیح شده این میشه: (جاهایی که تغییر دادمو با کامنت *** معلوم کردم)

                      کد:
                      @ DEVICE PIC16F877A ,WDT_OFF ,LVP_OFF ,PROTECT_OFF ,PWRT_ON ,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
                      DEFINE LCD_LINES 2
                      
                      DEFINE CCP1_REG PORTC
                      DEFINE CCP1_BIT 2
                      
                      deFINE CCP2_REG PORTC
                      DEFINE CCP2_BIT1
                      
                      TRISA = %00010000
                      TRISc.0 = 1
                      
                      A VAR WORD
                      f var word
                      B VAR WORD
                      
                      ON INTERRUPT GOTO lable
                      
                      OPTION_REG = %01101000    '****** mohemmm
                      INTCON = %10010000
                      
                      T1CON = $03
                      
                      
                      loop1:
                      
                       TMR1L=0
                       TMR1H=0
                       PIR1.0 = 0
                       T1CON.0 = 1
                       PAUSE 800
                       T1CON.0 = 0
                       f.byte1=TMR1H
                       f.byte0=TMR1l
                       
                       
                       
                       lcdout $fe, 1
                       lcdout #f
                       lcdout $fe, $14
                       lcdout "hz"
                       pause 500
                       
                       
                       if f >= 20 and f <= 40 then 
                       
                        LOW portA.0
                        hpwm 1, 205, 300
                        pause 50
                      
                        A = 0
                        
                        loop_sh:
                        
                          LCDOUT $FE, $c0 
                          LCDOUT "A ="
                          lcdout $fe, $14
                          LCDOUT #A
                          
                      	if A >= 30 then 
                        gosub tormoz     '******
                        else         '******
                        goto loop_sh     '******
                        endif        
                      endif
                        
                       if f >= 60 and f <=80 then
                        LOW portA.1
                        hpwm 2, 205, 300
                        pause 50
                        A = 0
                        B = 0
                        tmr0=0     '******
                        loop_sh_1:
                          b=tmr0    '******
                          LCDOUT $FE, $c0 
                          LCDOUT "A ="
                          lcdout $fe, $14
                          LCDOUT #A
                          LCDOUT $fe, $14
                          lcdout "B ="
                          lcdout $fe,$14
                          lcdout #B
                      	if B >= 20 then 
                        gosub tormoz     '******
                      	else         '******
                        goto loop_sh_1    '******
                        endif
                        
                      endif
                      
                      goto loop1
                      
                        
                      tormoz:
                        low portA.0
                        low portA.1
                        hpwm 1, 0, 300
                        hpwm 2, 0, 300
                        pause 500
                        return         '******
                        
                      
                       disable
                      lable:
                        A = A + 1
                        INTCON.1 = 0
                        
                       RESUME
                       enable
                      
                      END
                      اما اگر من میخواستم این برنامرو بنویسم کامل بر اساس اینتراپت می نویسم و تایمر 0 رو هم برای هر شمارش روی 255 یا همون 0xff ست میکنم و از وقفه سرریش به عنوان اینتراپت استفاده می کنم . کلا این برنامه ای که من ترجیحش میدم:
                      (با دقت بخون مشکلی داشتی مطرح کن)

                      کد:
                      @ DEVICE PIC16F877A ,WDT_OFF ,LVP_OFF ,PROTECT_OFF ,PWRT_ON ,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
                      DEFINE LCD_LINES 2
                      
                      DEFINE CCP1_REG PORTC
                      DEFINE CCP1_BIT 2
                      
                      deFINE CCP2_REG PORTC
                      DEFINE CCP2_BIT1
                      
                      TRISA = %00010000
                      TRISc.0 = 1
                      
                      A VAR WORD
                      f var word
                      B VAR WORD
                      i var bit
                      
                      ON INTERRUPT GOTO lable
                      
                      OPTION_REG = %01101000
                      INTCON = %10000000
                      T1CON = $03
                      
                      loop1:
                        intcon.4=0
                        intcon.5=0
                       TMR1L=0
                       TMR1H=0
                       PIR1.0 = 0
                       T1CON.0 = 1
                       PAUSE 800
                       T1CON.0 = 0
                       f.byte1=TMR1H
                       f.byte0=TMR1l
                       
                       lcdout $fe, 1
                       lcdout #f
                       lcdout $fe, $14
                       lcdout "hz"
                       pause 500
                       i=1
                       
                       if f >= 20 and f <= 40 then 
                        LOW portA.0
                        hpwm 1, 205, 300
                        a=0
                        intcon.4=1
                        i=0
                        endif
                           
                       if f >= 60 and f <=80 then
                        LOW portA.1                 
                        hpwm 2, 205, 300
                        b=0
                        tmr0=255
                        intcon.5=1
                        i=0
                        endif
                        
                        while i=0
                          LCDOUT $FE, $c0 
                          LCDOUT "A ="
                          lcdout $fe, $14
                          LCDOUT #A
                          LCDOUT $fe, $14
                          lcdout "B ="
                          lcdout $fe,$14
                          lcdout #B
                        pause 30
                        wend
                      
                      goto loop1
                      
                        
                      
                      disable
                      lable:
                        if intcon.1=1 then
                        A = A + 1
                        INTCON.1 = 0 
                        endif
                        
                        if intcon.2=1 then
                        b=b+1
                        tmr0=255
                        intcon.2=0
                        endif
                        
                        if a>=30 then 
                        low portA.0
                        hpwm 1, 0, 300
                        i=1
                        a=0
                        endif
                        
                        if b>=20 then
                        low portA.1
                        hpwm 2, 0, 300
                        i=1
                        b=0
                        endif
                        
                       RESUME
                       enable
                      
                      END
                      مشغول در این دنیای آکل و ماکول .......

                      دیدگاه


                        #86
                        پاسخ : راه اندازی موتور dc

                        سلام....
                        یک دنیا از این لطفتون سپاسگذارم جناب جعفری.
                        پروگرم کردم و موتورهام چرخیدن :nerd:

                        اضافه شده در تاریخ :
                        سلام و عرض ادب دوباره خدمت همه ی دوستان.
                        دوستان بزرگوار در ادامه ی ماجرای این موتورها با کمک شما به اینجا رسیدیم که با شافت انکدر پالسهای خروجی موتور خونده شد، و این پالسها به عنوان شرط برای stop شدن موتور قرار گرفتند، شرط حرکت موتورها هم رسیدن فرکانس از خروجی سنسورمون بود، و با یه فرکانس متر تو برنامه این مساله هم حل شد (بگذریم از اینکه هنوز در انتخاب نوع شافت انکدر مناسب، مشکلاتی وجود داره، ولی خوب قابل حلّه)

                        حالا در ادامه قصد بر بدست آوردن یا خوندن جریان max موتور هست، اون هم به این ترتیب که بنده میخوام با یه مقایسه کننده مثل lm324 که 4 تا گیت هم داره، جریان موتورهامو وقتی که شافت خروجیشون به مانع برخورد میکنه، بدست بیارم، به دست آوردن به این معنی که یکی از پایه های یکی از گیتهای این مقایسه کننده یا در واقع یکی از خروجیهای این آیسی رو بدم به یه پین میکرو که out کردیمش، و بعد وقتی شافت خروجی موتور در حرکت خودش به مانعی برخورد کرد و جریانش زیاد شد، اون پایه از میکرومون high بشه، و ما از رو این آلارم بتونیم تصمیم گیری های بعدی رو واسه موتورمون داشته باشیم، در واقع شافت موتورمون به واسطه ی چرخ دنده هایی در حال حرکت دادن یک اهرم هست، و ما میخوایم پس از چند دور حرکت موتور و در نتیجه جابجایی این اهرم، هرگاه که این اهرممون به مانعی برخورد کرد، به موتور بگیم حالا وایستا!
                        برای همین میخوایم از رو جریان موتور این کارو بکنیم، که هر موقع به مانع خوردیم، چون طبیعتا جریان موتور افزایش پیدا میکنه، تو اون حالت خاص که جریان یه هو زیاد میشه، بگیم موتورمون stop کنه........

                        القصه بنده سعی کردم که این کارو انجام بدم، از یه گیت lm324 هم استفاده کردم برا اینکه یه موتورو بخوام فعلا تست کنم، اما متاسفانه باز هم برای بار اول نشد!
                        و باز هم نیازمندم به یاری دوستان...
                        اینم یه برنامه ی بسیار ساده برا اینکه فقط موتور با رسیدن به شرط فرکانس مورد نظرش روشن بشه و بعد ببینیم در برخورد با مانع چه عکس العملی نشون میده،اما نه اصلا lcd فرکانسی رو نشون داد! نه موتور روشن شد! و چون این 2 اتفاق نیفتاد، نه اون led که گذاشتم سر اون پایه ی میکرو که پایه ی 1 یا خروجی گیت اول 324 اومده بود بهش، درست عمل کرد!
                        آخه اصلا موتور روشن نشد که هیچ اتفاقی بیافته!

                        کد:
                        @ DEVICE PIC16F877A ,WDT_OFF ,LVP_OFF ,PROTECT_OFF ,PWRT_ON ,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
                        DEFINE LCD_LINES 2
                        
                        DEFINE CCP1_REG PORTC
                        DEFINE CCP1_BIT 2
                        
                        
                        TRISA.0 = 0
                        TRISA.1 = 0
                        TRISc.0 = 1
                        
                        f var word
                        
                        T1CON = $03
                        
                        
                        loop1:
                        
                        
                         TMR1L=0
                         TMR1H=0
                         PIR1.0 = 0
                         T1CON.0 = 1
                         PAUSE 800
                         T1CON.0 = 0
                         f.byte1=TMR1H
                         f.byte0=TMR1l
                         
                         lcdout $fe, 1
                         lcdout #f
                         lcdout $fe, $14
                         lcdout "hz"
                         pause 500
                         
                         
                         if f >= 20 and f <=40 then 
                          
                          LOW portA.0
                          hpwm 1, 205, 300
                          pause 50
                          
                        
                         endif 
                          goto loop1
                              
                        END
                        اتصالات lm324 هم به این صورته که با یه پوت 10 کیلو به پایه ی 2 آیسی 324 وصله، از پایه یک L298 با یه 330 اهم اومدم به پایه 3 آیسی 324، خروجی 324 یا همون پایه یکش رو هم دادم به یه پین میکرو و خروجی تعریفش کردم تو برنامه، بعد هم از همون پایه 1 تو 324 یه led گذاشتم واسه نشون دادن لحظه ی high شدن یان پین...
                        پایه 4 324 هم رفته 5 ولت، پایه 11 هم اومده زمین...
                        شرمنده دوستان :redface: متاسفانه پروتئوس دم دست ندارم در حال حاضر! برا همین مجبور شدم برای مبهم نموندن جایی از قضیه، بسیار آماتورانه توضیح بدم! به بزرگواری خودتون عفو بفرمائید....


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

                        دیدگاه


                          #87
                          پاسخ : راه اندازی موتور dc

                          سلام.
                          1-راه انداز موتور مگه L298 نیست؟ پس چرا فقط یه پایه رو روشن کردین واسه تعیین جهت چرخش؟
                          2-اون پایه از میکرو که اپ امپ بهش وصل شده باید ورودی باشه.
                          3-بعد از تولید PWM چرا تأخیر زمانی قرار دادین؟
                          4-اگه اون پایه که پ امپ بهش وصله با پایه های ADC مشترک هست؛ باید با تنظیمات ADCON0 و ADCON1 اولا ADC رو خاموش کنین؛ثانیا اون پایه رو ورودی دیجیتال تعریف کنین.

                          دیدگاه


                            #88
                            پاسخ : راه اندازی موتور dc

                            عرض سلام مجدد...
                            دوستان 2 نکته کاشف به عمل اومد؛ که 2 تا سوتی بود! یکی اینکه پایه ای از میکرو که out آیسی 324 به اون میومد باید ورودی کانفیگ میشد، دیگری هم اینکه پایه 1 298 باید با یه مقاومت بسیار کوچیکتر از 330 اهم، البته وات بالا به آیسی 324 میومد، این 2 کار انجام شد و lcd از اون حالت در اومد، الان با برنامه ای که داریم قرار هست فرکانس پالس خروجی سنسور خونده بشه و سر یه فرکانس خاصی موتور راه بیافته و بعد از اون به مانع که برخورد کرد، اون پایه از میکرو high بشه تا ما بفهمیم که الان جریان زیاد شده، با این تفاسیر در حال حاضر lcd اون مقدار فرکانس رو میخونه و نمایش میده منتها باز هم سر شرط فرکانس که میرسیم، موتورمون باز هم راه نمیافته، که گمون میکنم باز هم از مقاومتی باشه که به پایه ی 1 l298 وصله، که در حال حاضر یه مقاومت 0.22 اهم 10 وات گذاشتم...
                            پیشنهاد دوستان چیه؟!

                            اضافه شده در تاریخ :
                            نوشته اصلی توسط شاهرخ
                            سلام.
                            1-راه انداز موتور مگه L298 نیست؟ پس چرا فقط یه پایه رو روشن کردین واسه تعیین جهت چرخش؟
                            2-اون پایه از میکرو که اپ امپ بهش وصل شده باید ورودی باشه.
                            3-بعد از تولید PWM چرا تأخیر زمانی قرار دادین؟
                            4-اگه اون پایه که پ امپ بهش وصله با پایه های ADC مشترک هست؛ باید با تنظیمات ADCON0 و ADCON1 اولا ADC رو خاموش کنین؛ثانیا اون پایه رو ورودی دیجیتال تعریف کنین.
                            سلام از بنده است جناب شاهرخ، متشکرم از راهنمائیتون.
                            1. چرا همینطوره، بنده فقط یک پایه رو اینجا عرض کردمف وگرنه تمام اتصالات l298 کما فی السابقه...
                            2.I'm so sorry :redface:
                            درستش کردم...
                            3. برش داشتم، فرقی به حال ماجرا نکرد!
                            4.بله کاملا درست میفرمائید، با پایه های a/d مشترکه، درستش کردم، تو عمل تغییری حاصل نشد و همون مشکل قبلی! از اون پایه برش داشتم و بردم رو یه پین دیگه اما باز هم .....
                            زندگی برگ بودن در مسیر باد نیست
                            امتحان ریشه هاست
                            ریشه هم هرگز اسیر باد نیست
                            زندگی چون پیچک است
                            انتهایش میرسد پیش خدا!

                            دیدگاه


                              #89
                              پاسخ : راه اندازی موتور dc

                              جهت اطمینان از اینکه مقدار مقاومت 0.22 اهم تو عملکرد موتور تأثیر آنچنانی نمیزاره، مستقیما" موتور رو با همون مقاومت سری و راه اندازی کنین(بدون L298 و وقتی کار کرد سری با پایه ی 1 از L298 که خودتون مستقیم با سیم ولتاژ های مورد نیاز رو بهش میدین. En به Vcc با جهت چرخش چپ یا راست گرد)
                              بعد که موتور از این تست سربلند بیرون اومد! برام یه سوال مطرح میشه!
                              نوشته اصلی توسط pama
                              با برنامه ای که داریم قرار هست فرکانس پالس خروجی سنسور خونده بشه و سر یه فرکانس خاصی موتور راه بیافته و بعد از اون به مانع که برخورد کرد، اون پایه از میکرو high بشه تا ما بفهمیم که الان جریان زیاد شده، با این تفاسیر در حال حاضر lcd اون مقدار فرکانس رو میخونه و نمایش میده منتها باز هم سر شرط فرکانس که میرسیم، موتورمون باز هم راه نمیافته
                              متوجه نشدم! مگه پالسها از شفت انکدر نمیاد؟ پس فرکانس از کجا میاد؟ این وسط فرکانس چیکار میکنه!!

                              دیدگاه


                                #90
                                پاسخ : راه اندازی موتور dc

                                اون تست رو چشم...

                                نوشته اصلی توسط شاهرخ
                                متوجه نشدم! مگه پالسها از شفت انکدر نمیاد؟ پس فرکانس از کجا میاد؟ این وسط فرکانس چیکار میکنه!!
                                عرض کرده بودم منتها یه مقدار مسائل با هم قاطی شد و این ماجرای فرکانس شاید توش گم شد...
                                موتورهای ما باید شروع حرکتشون منوط باشه بر رسیدن خروجی یک سنسور خاص، (که این خروجی پالسی هست که با فرکانس متر خونده میشه)
                                و بعد از اینکه ما فرکانس اون پالسهای خروجی رو که مربوط به سنسورمون هست، خوندیم و سر شرط خاصی که مد نظر هست موتورمون رو pwm دادیم و شروع به حرکت کرد،
                                حالا باید یه جایی موتور وایسته، این وایستادن هم 2 حالت داره، در یک حالت ما با شافت انکدر پالسهای خروجی موتور رو میخونیم و میگیم آقا سر فلان پالس موتورمون وایسته....
                                حالت دوم دیگه به انکدر کاری نداریم و میخوایم با خوندن جریان موتور و اینکه کی جریان موتور نسبت به حالت عادّیش زیاد میشه، (که از مقایسه کننده ی 324 استفاده کردیم) در اون حالت به موتورمون فرمان stop بدیم، به عبارتی این بار جدای از شافت انکدر، هر گاه فرکانس پالسهای خروجی سنسور به عدد مد نظر ما رسید باید موتور شروع به حرکت کنه، و هر گاه موتور در برخورد با مانع جریانش زیاد شد، اون موقع موتورمون وایسته، یا به عبارتی شرط ایستادن در این حالت برخورد به مانع ست....
                                زندگی برگ بودن در مسیر باد نیست
                                امتحان ریشه هاست
                                ریشه هم هرگز اسیر باد نیست
                                زندگی چون پیچک است
                                انتهایش میرسد پیش خدا!

                                دیدگاه

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