اطلاعیه

Collapse
No announcement yet.

اینتراپت و انکودر

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

    اینتراپت و انکودر

    با سلام خدمت دوستان گرامی
    من خیلی وقته یه مشکل اساسی با انکودرم دارم.
    این انکودر تو هر دور 3600 پالس میده.
    مشکل اینجاست که من وقتی با سرعت یه کم بالا انکودر رو میچرخونم تو یه دور،خیلی کمتر از 3600 پالس میده :cry2:
    من پالسهای انکودر رو به اینتراپت avr وصل کردم.
    حالا سوال اینه که:مشکل از انکودر هستش یا میکرو؟؟

    #2
    پاسخ : اینتراپت و انکودر

    نباید اینطوری باشه.
    شاید متغیرات رو درست تعریف نکرده ای یا از کریستال مناسب استفاده نمی کنی.
    برنامه رو بذار تا یه نگاهی بنذازیم بهش.
    تشکر لازم نیست!

    دیدگاه


      #3
      پاسخ : اینتراپت و انکودر

      بهتره انکودر رو به یه پایه شمارنده میکرو بدی و بعد با هر تغییر جهت با یه مدار فلیپ فلاپ ساده 2 تا اینتراپت ایجاد کنی . با هر بار تغییر جهت 2تا اینتراپت میده به میکرو و علامت جمع و تفریق تغییر می کنه اونوقت . اگه انکودرت از این آلمانی ها باشه چون 2 تا خروجیشون اپن کلکتور هست باید مقاومت پول پشون خیلی هم زیاد نباشه. (کم هم نباشه)
      Gracias A La Vida
      [glow=red,2,300]ساخت فرز CNC[/glow]
      http://www.eca.ir/forum2/index.php?topic=56308.0
      http://up9.iranblog.com/images/4xd21f8vemt8g46011fx.jpg
      زمین سفت است و آب شلست و هوا نرم است و همه چیز عالیست در این حوالی...

      دیدگاه


        #4
        پاسخ : اینتراپت و انکودر

        بنظر نمیاد مشکل با اینتراپت و اینجور چیزا باشه. بلکه روال وقفه ات یا کد برنامه ات مشکل داره. چون 3600 پالس به ازای هر دور یعنی به ازای یک دور در ثانیه میشه نزدیک به 277 میکرو ثانیه وقت که این میزان برای یک میکروی 4 مگا هرتزی هم بسه.

        یک نمونه کد روال وقفه حداکثر حدود 60 سیکل طول میکشه که برای یک میکروی 4 مگا هرتزی میشه تقریبا 16 میکرو ثانیه که روی سرعت 1 دور در ثانیه ایجاد باری در حدود 6 درصد میکنه که چیز زیادی نیست.

        مگه اینکه با سرعت بالاتری این انکودر چرخونده بشه.
        مثلا روی سرعت 5 دور در ثانیه بار به 30 درصد میرسه. که مورد نسبتا وحشتناکیه. البته اگر مورد خاصی نداری میتونی از یک cpld یا یک مدار معادل با استفاده از یک کانتر استفاده کنی. هم مطمئن تره و هم بار میکروت کمتر میشه. هم سرعت بالاتری بهت میده.

        دیدگاه


          #5
          پاسخ : اینتراپت و انکودر

          سلام دوستان.
          ممنون از جواباتون.موتور من حداقل 1200rpm میچرخه.منم باید هر 0.1 درجه رو تو این سرعت تشخیص بدم.یعنی یه انکودر 3600 پالس نیازه.خواهشا کمممممک :cry2:
          یه نمونه ساده از برنامه:
          'be name khoda
          $regfile = "m16def.dat"
          $crystal = 8000000


          Enable Interrupts
          Enable Int0
          Config Int0 = Rising
          On Int0 Lbl1

          Config Porta.2 = Output
          Config Porta.0 = Input

          Dim Num As Integer
          Num = 0

          Do
          '
          Loop
          End

          Lbl1:

          If Num = 3600 Then
          Toggle Porta.2 'tu har dor led toggle mishe
          Num = 0

          End If
          If Pina.0 = 1 Then 'baraye ta'yin javate charkhesh
          Num = Num - 1
          Else
          Num = Num + 1
          End If

          Return

          دیدگاه


            #6
            پاسخ : اینتراپت و انکودر

            یعنی 72000 پالس در ثانیه و این یعنی به ازای زمان تقریبی 60 پالس به ازای هر لبه تقریبا به یک سرعت 4.3 مگا هرتزی احتیاج هست. تازه به شرطی که میکرو قرار باشه هیچ کار دیگه ای انجام نده. چرا از fpga استفاده نمیکنین؟
            یا از یک up-down-counter ساده؟

            دیدگاه


              #7
              پاسخ : اینتراپت و انکودر

              آقا رضا ممنون.
              خب اگه 4.3mhz جواب باید بده که من میکرو رو دارم رو 8mhz کار میکنم ولی جواب نمیده. :cry2:
              میکرو فعلا کار دیگه ای هم نمیکنه.
              up-down-counter به درد کارم نمیخوره چون به هر حال باید تو هر 0.1 یه اینتراپت داشته باشم.
              به fpga هم مسلط نیستم.
              مطمئنید موضوع فقط فرکانس کاریه؟

              دیدگاه


                #8
                پاسخ : اینتراپت و انکودر

                مطمئنا. چون این تعداد وقفه در یک ثانیه یعنی تقریبا هر 14 میکرو ثانیه یک وقفه. اگه شما میکروی خودتون رو با 16 مگا هرتز هم ببندین بین هر دو وقفه فقط 222 سیکل وقت دارین. تازه ایده آلش. و این وقت بسیار کمیه. البته اگر فقط یک محاسبه ساده و تصمیم گیری به ازای یک مقدار عددی باشه که میشه با یک up-down-counter قابل cascade شدن و یک مقایسه کننده ساده وقفه مورد نیازتون رو تولید کرد. یعنی مثلا شما روی 3610 امین پالس کار دارین؟ خوب:

                1- مدار رو ریست میکنیم.
                2- مقدار 3610 رو روی مدار ست میکنیم.
                3- منتظر وقفه میمونیم.

                حالا این مدار میتونه با fpga پیاده سازی بشه (که مدلش خیلی خیلی ساده است) و یا با آی سی ها موجود توی بازار. میخوایین میشه هر دو تاشو طرح کرد. کاری نداره.
                اما بار زمانی شمردن پالسها رو به سخت افزار واگذار کنین بهتره.

                دیدگاه


                  #9
                  پاسخ : اینتراپت و انکودر

                  من یک مدل verilog آماده کردم که براحتی روی یک آی سی 9572XL-PQ44 جا شد. راه اندازیش هم کاری نداره. قیمت آی سی اش هم فکر نمیکنم دو سه تومن بیشتر بشه. تا 24 بیت هم رزولوشن میده.
                  اما مسلما میشه همین مدار رو با یک تعدادی آی سی روی یک برد حجیم تر بست.

                  دیدگاه


                    #10
                    پاسخ : اینتراپت و انکودر

                    سلام آقا رضا.ممنون
                    شاید من بد توضیح دادم،من روی تک تک پالسها کار دارم،یعنی تو هر پالسی میکرو یه اینتراپت بگیره و چندتا محاسبه ساده انجام بده.یعنی من به شمارش کل پالسها اصلا کاری ندارم که بخوام از up-down-counter استفاده کنم.فقط میخوام میکرو تغییر هر پالس رو بفهمه.
                    راستی من xmega هم بلدم که 32mhz هستن.فکر میکنی جواب بده؟
                    ممنووووون...

                    دیدگاه


                      #11
                      پاسخ : اینتراپت و انکودر

                      میشه بپرسم دقیقا مشکلت چی هست؟ چون من در یک پروژه مشابه گیر کرده بودم و با تغییر زاویه دیدم مشکل بطور کلی حل شد.

                      دیدگاه


                        #12
                        پاسخ : اینتراپت و انکودر

                        مشکلم همینه که نمیتونم تو هر بار تغییر 0.1 درجه اینتراپت بگیرم.
                        کل داستان:
                        یه موتور داریم که داره با یه سرعتی میچرخه.حالا من باید تو هر 0.1 درجه چرخش یه کاری بکنم.مثلا یه led رو toggle کنم.

                        دیدگاه


                          #13
                          پاسخ : اینتراپت و انکودر

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

                          دیدگاه


                            #14
                            پاسخ : اینتراپت و انکودر

                            آقا رضا برنامه رو فرستاده بودم.حالا دوباره میفرستم،خیلی ساده هستش:
                            be name khoda
                            $regfile = "m16def.dat"
                            $crystal = 8000000


                            Enable Interrupts
                            Enable Int0
                            Config Int0 = Rising
                            On Int0 Lbl1

                            Config Porta.2 = Output
                            Config Porta.0 = Input

                            Dim Num As Integer
                            Num = 0

                            Do
                            '
                            Loop
                            End

                            Lbl1:

                            If Num = 3600 Then
                            Toggle Porta.2 'tu har dor led toggle mishe
                            Num = 0

                            End If
                            If Pina.0 = 1 Then 'baraye ta'yin javate charkhesh
                            Num = Num - 1
                            Else
                            Num = Num + 1
                            End If

                            Return

                            دیدگاه


                              #15
                              پاسخ : اینتراپت و انکودر

                              من کد رو توی avrstudio چک کردم. حالت عادی با کریستال 4 مگا تقریبا حدود 40 میکرو ثانیه طول میکشه. بنا بر این قاعدتا نبایستی مشکل از کد باشه. بهتره که یک میکروی دوم ببندی و توی اون پالس های خروجی رو شبیه سازی کنی. و ببینی مشکل از مدارت نباشه. اگر همه چی ok بود در حین تست موتورت رو هم روشن کن. شاید مشکل از نویزی چیزی باشه. غیر از این چیزی به عقلم نمیرسه. (البته اگه چیزی مونده باشه!!)

                              دیدگاه

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