اطلاعیه

Collapse
No announcement yet.

تشخیص جهت حرکت در انکدر افزایشی

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

    تشخیص جهت حرکت در انکدر افزایشی



    با سلام دوستان من در میکرو در دوتا از اینتراپتهای خارجی دارم پالس aوb را میخونم ولی نمیدونم چه کدی بنویسم تا تشخیص دهم که پالسaزودتر آمده یا b تا جهت رو متوجه بشم
    اگه دوستان کار کردن و الگوریتمی دارن برام بگن ممنون میشم

    #2
    پاسخ : تشخیص جهت حرکت در انکدر افزایشی

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

    با سلام دوستان من در میکرو در دوتا از اینتراپتهای خارجی دارم پالس aوb را میخونم ولی نمیدونم چه کدی بنویسم تا تشخیص دهم که پالسaزودتر آمده یا b تا جهت رو متوجه بشم
    اگه دوستان کار کردن و الگوریتمی دارن برام بگن ممنون میشم
    سلام
    واسه کار کردن با انکودر یه اینتراپت بیشتر احتیاج نیست (یعنی من خودم با یه وقفه کار کردم جواب هم تو شبیه سازی تا حالا گرفتم) واسه پیاده سازیش باید یه مدار ساده خازن مقاومت ببندی که بانسش رو بگیره
    اینم کدی که خودم استفاده کردم
    کد:
    interrupt [EXT_INT0] void ext_int0_isr(void){
        if(PIND.1==1) {
          voltage=voltage+1;
          if(voltage_num_change>=201) voltage_num_change=201;
          }
        else {
          voltage=voltage-1;
          if(voltage_num_change<0 || voltage_num_change>202) voltage_num_change=0;
          }
        }

    دیدگاه


      #3
      پاسخ : تشخیص جهت حرکت در انکدر افزایشی

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

      اضافه شده در تاریخ :
      در این کدی که شما نوشتین PIND.1 همان پالس B است؟
      اگر اینطور باشد در یک جهت مطلقا یک یا صفر نیست که بتوان با آن جهت را تشخیص داد چون از نوع پالس می باشد
      منظوراتون رو از مدار خازن مقاومتی متوجه نشدم در مسیر خواندن PIND.1 قرار داده اید؟

      دیدگاه


        #4
        پاسخ : تشخیص جهت حرکت در انکدر افزایشی

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

        اضافه شده در تاریخ :
        نوشته اصلی توسط Raha323
        در این کدی که شما نوشتین PIND.1 همان پالس B است؟
        اگر اینطور باشد در یک جهت مطلقا یک یا صفر نیست که بتوان با آن جهت را تشخیص داد چون از نوع پالس می باشد
        منظوراتون رو از مدار خازن مقاومتی متوجه نشدم در مسیر خواندن PIND.1 قرار داده اید؟

        این یه طرح از اون مدار بانس گیر هست

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


        با تشکر از آقای سامان اسدی :biggrin:

        دیدگاه


          #5
          پاسخ : تشخیص جهت حرکت در انکدر افزایشی

          ممنونم
          من دقیقا همین کد رو نوشتم ولی پین b همش در داخل اینتراپت وقتی انکدر رو در یک جهت میچرخونم صفرو یک میده ولی مثلا وقتی راست گرد هست درصد بیشتری صفر هست ولی باز یک هم توش هست و این محاسبات منو خراب میکنه و وقتی پاد ساعت گرد است درصر بیشترش یک است ولی صفر م گاهی دارد مطلقا در تغییر جهت صفر یا یک نیست من از 26Ls32 برای خواندن انکدر استفاده کردم

          دیدگاه


            #6
            پاسخ : تشخیص جهت حرکت در انکدر افزایشی

            نوشته اصلی توسط Raha323
            ممنونم
            من دقیقا همین کد رو نوشتم ولی پین b همش در داخل اینتراپت وقتی انکدر رو در یک جهت میچرخونم صفرو یک میده ولی مثلا وقتی راست گرد هست درصد بیشتری صفر هست ولی باز یک هم توش هست و این محاسبات منو خراب میکنه و وقتی پاد ساعت گرد است درصر بیشترش یک است ولی صفر م گاهی دارد مطلقا در تغییر جهت صفر یا یک نیست من از 26Ls32 برای خواندن انکدر استفاده کردم
            اگه این خطایی که گفتی رو تو سخت افزار میبینی، این همون بانس انکودر هست که با اون مداره میتونی از بین ببریش
            ولی تو فقط کافیه خروجی a رو به اینتراپت بدی و وقفه شو فعال کنی
            برای خروجی b احتیاجی به وقفه نیستفقط مقداری که b به میکرو وارد میکنه رو چک کن

            دیدگاه


              #7
              پاسخ : تشخیص جهت حرکت در انکدر افزایشی

              میکروی من 30f6014A هستش و انکدر هم 3600 پالس
              مدار و کد میکرو هم به شکل زیر هست
              کد:
              #int_EXT1
              void EXT1_isr(void) 
              {
              
               
               if(input(PIN_A14)==1)
               {
              Count_INC_Puls++;
               if(Flag_Z_Puls==1)
               {
                Count_INC_Puls=0;
                Flag_Z_Puls=0;
               }
               }
               else
               {
               Count_INC_Puls--;
               if(Flag_Z_Puls==1)
               {
                Count_INC_Puls=0;
                Flag_Z_Puls=0;
               }
               }
               fprintf(Com1,"%li  \n",Count_INC_Puls);
              }[img][img][img][img][img][/img][/img][/img][/img][/img]

              دیدگاه


                #8
                پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                نوشته اصلی توسط Raha323
                میکروی من 30f6014A هستش و انکدر هم 3600 پالس
                مدار و کد میکرو هم به شکل زیر هست
                #int_EXT1
                void EXT1_isr(void)
                {


                if(input(PIN_A14)==1)
                {
                Count_INC_Puls++;
                if(Flag_Z_Puls==1)
                {
                Count_INC_Puls=0;
                Flag_Z_Puls=0;
                }
                }
                else
                {
                Count_INC_Puls--;
                if(Flag_Z_Puls==1)
                {
                Count_INC_Puls=0;
                Flag_Z_Puls=0;
                }
                }
                fprintf(Com1,"%li \n",Count_INC_Puls);
                }[/img][/img][/img][/img]
                عکستو که درست نذاشتی!
                اگه مشکل اینه که انکودر رو میچرخونی عددت تغییر نمیکنه احتمالا تو کد نویسیت واسه این flag و اینا یه اشتباهی کردی
                من دقیقا متوجه نشدم اون قسمتشو

                دیدگاه


                  #9
                  پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                  معمولا یک مدار آنتی جیتر میبندند که پالس ها لرزش نداشته باشه (یادمه با فلیپ فلاپ میبستیم)
                  با توجه به اینکه اول کدوم یکی از کاناهای A یا B لبه بالا رونده (یا پایین رونده ) اش میاد جهت چرخش مشخص میشه . اما مدار آنتی جیتر حتما باید باشه . اگه دفتر کنترل صنعتیمو پیدا کردم براتون مدارشو میزارم :nerd:

                  دیدگاه


                    #10
                    پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                    الان مشکل من هنگامی رخ میده که شفت انکدر رو سریع میچرخونم در نتیجه اینتراپتها سریع زده میشن مثل این اتفاق می افته که اختلاف زمانیه برای خواندن PIN B دچار مشکل میشه
                    چون زمانی که آروم میچرخونم پین B در یک جهت صفر و در جهت دیگر یک است
                    در این میکرو من چطور اینتراپت میکرو مو حساس به لبه بالا یا پایین کنم؟

                    دیدگاه


                      #11
                      پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                      نوشته اصلی توسط Raha323
                      الان مشکل من هنگامی رخ میده که شفت انکدر رو سریع میچرخونم در نتیجه اینتراپتها سریع زده میشن مثل این اتفاق می افته که اختلاف زمانیه برای خواندن PIN B دچار مشکل میشه
                      چون زمانی که آروم میچرخونم پین B در یک جهت صفر و در جهت دیگر یک است
                      در این میکرو من چطور اینتراپت میکرو مو حساس به لبه بالا یا پایین کنم؟
                      من PIC کار نکردم! نمیدونم نحوه مقدار دهی به رجیسترهای مربوط به وقفه خارجی چطوری هست!
                      ولی اگه مشکل از نظر زمان چک کردن و ایناس فکر کنم کریستال رو ببر بالا
                      مثلا با کریستال 1مگ، هر کلاک میشه 1میکروثانیه ولی مثلا اگه 8مگ بذاری هر کلاک میشه 100 نانوثانیه
                      اینطوری سرعت خوندن دستوراتت بالا میره

                      دیدگاه


                        #12
                        پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                        این فکر به ذهنم اومد ولی متاسفانه PWM هم دارم با تغییر CLK fi il ldvdci

                        دیدگاه


                          #13
                          پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                          نوشته اصلی توسط Raha323
                          این فکر به ذهنم اومد ولی متاسفانه PWM هم دارم با تغییر CLK fi il ldvdci
                          اگه بازم وقفه داری تو برنامت تداخل وقفه احتمالا خرابش میکنه
                          مثلا وسط وقفه خارجیت میپره تو یه وقفه دیگه، بعد وقتی برمیگرده دیگه پالسا از بین رفتن!

                          دیدگاه


                            #14
                            پاسخ : تشخیص جهت حرکت در انکدر افزایشی

                            من برای اینکه ببینم خود پالس A داره درست وقفه میخوره داخل خود اینتراپت اش گذاشتم که وضیعت اون پین که پالس A به اش میادو نشونم بده اون پین مسلما اگه اینتراپت در حالت حساس به لبه باشه باید همیشه یک رو نشون بده درسته؟
                            ولی گاها صفر هم نشون میده :-(

                            اضافه شده در تاریخ :
                            بله آفرین تشخیص اتون درست بود وقتی بقیه اینتراپت هارو disable میکنم وضعیت خیلی بهتر میشه
                            ولی چیکار کنم هم اینتراپت تایمر رو لازم دارم هم اینتراپت خارجی دوم رو

                            دیدگاه


                              #15
                              پاسخ : تشخیص جهت حرکت در انکدر افزایشی

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

                              دیدگاه

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