اطلاعیه

Collapse
No announcement yet.

کد مربوط به راه اندازی Quadrature Decoder

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

    کد مربوط به راه اندازی Quadrature Decoder

    با سلام خدمت استاد طراح
    چند وقت پیش در انجمن avr با توجه به مشکلات پیش آمده در خواندن مقدار انکدر و بعد از مشورت با شما یه مدار با xmega برای خوندن انکدر طراحی کردم . الان مدار رو مونتاژ کردم و از کدی که شما در سایتتون قرار دادین نیز استفاده کردم و تونستم با مدار خودم تعداد پالسهای انکدر رو بخونم . انکدر من در هر دور 334 پالس تولید میکنه . مقدار پریود رو برای کانتر مربوطه 1335 قرار دادم . اینطوری در هر دور مقدار TCC1_CNT صفر میشه و من نیاز دارم تا مقدار کل پالسهای شمرده شده رو برای نمایش مکان فعلی داشته باشم . اومدم وقفه مربوط به overflow شدن کانتر رو فعال کردم و در روتین وقفه مربوطه مقدار یه متغیری به نام TotalCNT رو یکی یکی اضافه کردم تا اینطوری بتونم تعداد کل پالسها رو داشته باشم . اما مشکل اینجاست که در موقع overflow شدن این وقفه فعال میشه ولی نیاز هست تا در هنگام به صفر رسیدن مقدار TCC1_CNT نیز یک وقفه فعال شود تا مقدار متغیر TotalCNT کم بشه . ممکنه در مورد فعال کردن وقفه در موقع underflow شدن راهنمایی بفرمایید ؟
    اصلا میشه مقدار پریود رو خیلی زیاد در نظر بگیرم (مثلا حدود 500000 ) تا در طول کل مسیر این مقدار مکررا صفر نشه ؟
    ممنون
    کد:
    ISR(TCC1_OVF_vect)
    {
     TotalCNT++;
    }
    
    
    void main()
    {
     
     unsigned int TIMER_value;
     unsigned char i;
     
     
     PORTA_PIN0CTRL=PORT_ISC_LEVEL_gc; // QDPH0
     PORTA_PIN1CTRL=PORT_ISC_LEVEL_gc; // QDPH90
     init_7seg();
     init_key(); 
     __enable_interrupt();
     show_7seg(DIGITS,0x00,0x00);
     TCC1_PER=1335;
     EVSYS_CH0MUX=EVSYS_CHMUX_PORTA_PIN0_gc;
     EVSYS_CH0CTRL=EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
     TCC1_CTRLD=TC_EVACT_QDEC_gc|TC_EVSEL_CH0_gc;
     TCC1_CTRLA=TC_CLKSEL_DIV1_gc;
    
     TCC1_INTCTRLA = ( TC1_OVFINTLVL0_bm);
    
    ...
    ...
    ...
    }

    لینک مدار مربوط به خوندن انکدر با xmega
    http://s1.picofile.com/file/78256671...uller.pdf.html
    "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
    در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

    #2
    پاسخ : کد مربوط به راه اندازی Quadrature Decoder

    اصلا میشه مقدار پریود رو خیلی زیاد در نظر بگیرم (مثلا حدود 500000 ) تا در طول کل مسیر این مقدار مکررا صفر نشه ؟
    برای امتحان اومدم مقدار این متغیر رو که 16 بیتی هم هستش به مقدار 500000 تغییر دادم و با یک warning در کامپایلر IAR اون رو پرگرام کردم .اما مقدار پریود به درستی در رجیستر مربوطه نوشته نشده بود . سوالم این بود که چگونه میشه مقادیر 16 بیتی رو روی این رجیستر نوشت ؟

    ممنون
    "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
    در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

    دیدگاه


      #3
      پاسخ : کد مربوط به راه اندازی Quadrature Decoder

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

      ممنون
      "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
      در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

      دیدگاه


        #4
        پاسخ : کد مربوط به راه اندازی Quadrature Decoder

        مطلب اول اینکه حداکثر ظرفیت یک عدد 16 بیتی 65535 است و 500000 بزرگتر از 16 بیت است. روش وقفه مورد استفاده را می توان در صورتی که بحث لرزش وجود نداشته باشد و سرعت چرخش از یک حد بیشتر نباشد، به گونه ای اصلاح کرد که overflow و underflow را تشخیص دهد. مثلا :

        کد:
        ISR(TCC1_OVF_vect)
        {
         if (TCC1_CNT<(TCC1_PER>>1) TotalCNT++;
         else TotalCNT--;
        }


        اما اگر لرزشی حول مکان سرریز تایمر در سیستم مکانیکی اتفاق بیافتد، روش وقفه جوابگو نیست و باید از روش چک کردن مقدار TCC1_CNT با استفاده از flag های مناسب استفاده شود که امروز برای توضیح در مورد جزئیات این روش فرصت ندارم و باید تا فردا صبر کنید.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : کد مربوط به راه اندازی Quadrature Decoder

          با سلام
          برنامه ای که شما در مورد چک کردن با فلگ گفته بودین رو نوشتم .ممکنه یه بررسی کنید و اگر وقت دارید برنامه خودتون رو هم بنویسید
          کد:
          while(1)
          {
          	if(TCC1_CNT==500)
          		{FlgZero=false;Flg1335=false;}
          	
          	if(TCC1_CNT==0 && !FlgZero & !Flg1335)
          		{FlgZero=true;Flg1335=false;}
          
          	if(TCC1_CNT==1335 && !FlgZero && !Flg1335)
          		{Flg1335=true;FlgZero=false;}
          
          	if(TCC1_CNT==0 && Flg1335==true)
          		{TotalCnt++;Flg1335=false;FlgZero=true;}
          	
          	if(TCC1_CNT==1335 && FlgZero==true)
          		{TotalCnt--;FlgZero=false;Flg1335=true;}
          
          }
          ممنون
          "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
          در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

          دیدگاه


            #6
            پاسخ : کد مربوط به راه اندازی Quadrature Decoder

            من مشکل شما را دقیق تر بررسی کردم و در این رابطه یکسری راهکار را در نظر دارم که نیازمند فرصتی برای انجام آزمایش های عملی است و سعی می کنم در زمان مقتضی این راه کارها را پیاده سازی کنم و نتیجه را به شما اطلاع دهم.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : کد مربوط به راه اندازی Quadrature Decoder

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

              خدا خیرتون بده استاد . من فقط میتونم شما رو دعا کنم . حالا ایشالا به تبعیت از شما چیزهای کمی رو که بلدم رو در سایت در اختیار دوستان قرار میدم . اول از TFT LCD با IL1963 شروع میکنم (البته اینو باید با کمک شما پیش بریم )
              "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
              در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

              دیدگاه


                #8
                پاسخ : کد مربوط به راه اندازی Quadrature Decoder

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

                کد:
                TCC1_copy=TCC1_CNT; 
                
                 if((TCC1_copy>9950)&&(TCC1_copy<10050)) 
                  {FlgZero=false;Flg19999=false;}	
                
                 else if(TCC1_copy<100 && !FlgZero && !Flg19999) 
                  {FlgZero=true;Flg19999=false;}
                
                 else if(TCC1_copy>19900 && !FlgZero && !Flg19999)
                  {Flg19999=true;FlgZero=false;}
                
                 if(TCC1_copy<100 && Flg19999==true)
                 {TotalCnt++;Flg19999=false;FlgZero=true;}
                	
                 else if(TCC1_copy>19900 && FlgZero==true)
                 {TotalCnt--;FlgZero=false;Flg19999=true;}


                مساله دیگر اینکه قبلا در مورد لزوم Capture برای دسترسی به تایمر اشاره شد، اما چنین موردی لازم نیست. زیرا نیمه بالای تایمر در هنگام دسترسی به نیمه پائین در رجیستر TEMP ذخیره می شود.
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


                  #9
                  پاسخ : کد مربوط به راه اندازی Quadrature Decoder

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

                  ممنون
                  "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                  در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                  دیدگاه


                    #10
                    پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                    اینم 2 تا عکس از دستگاهی که این مدار روش نصب شده .



                    "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                    در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                    دیدگاه


                      #11
                      پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                      با سلام
                      جدیدا یک انکدر گرفتم برای Autonix هستش . نوشته که تغذیه اش 12 ولت هستش . قاعدتا باید خروجی A,B,Z اون هم 12 ولت باشه . میخوام این سیگنالها رو به میکرو بدم . حالا میخوام به 5 ولت یا 3.3 ولت تبدیلشون کنم . به نظرم اومد که از آیسی 4050 استفاده کنم تا ورودی 12ولتی رو به 3.3 ولت تبدیل کنم . به نظر شما راه حل خوبیه ؟ قابل اطمینانه ؟ توی سرعتهای بالا ، پالس خراب نمیشه؟

                      ممنون
                      "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                      در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                      دیدگاه


                        #12
                        پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                        با توجه به مشخصات CD4050 امکان تبدیل سطح در آن وجود دارد. اما اعدادی هم برای تاخیر بین وضعیت های Low و High در تغذیه 5 ولت ذکر شده که بیش از 100 نانو ثانیه است و شاید در لرزش های اعمال شده به Encoder جوابگوی لبه ها ایجاد شده نباشد (احراز این مسئله مستلزم انجام آزمایش های عملی است).
                        یک روش ممکن دیگر برای تغییر سطح، استفاده از تقسیم مقاومتی با مقدار مناسب برای مقاومت ها است.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #13
                          پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                          با تشکر از استاد
                          نظر شما در مورد استفاده از اشمیت تریگر چیه؟
                          ممنون
                          "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                          در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                          دیدگاه


                            #14
                            پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                            ورودی پین دارای مقدار کمی هیسترزیس است و حالت اشمیت تریگر را دارد. اما در صورت قرار دادن اشمیت تریگری با عرض باند بیشتر یک احتمال که به نظرم می رسد این است که در لرزش های اعمال شده به انکودر، خطایی در قرائت ایجاد شود.
                            اوژن: به معنای افکننده و شکست دهنده است
                            دانایی، توانایی است-Knowledge is POWER
                            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                            دیدگاه


                              #15
                              پاسخ : کد مربوط به راه اندازی Quadrature Decoder

                              با سلام
                              گفتم از یک مقایسه کننده نسبتا سریع مثل LM319 استفاده کنم که response time اون حدود 80 نانو ثانیه هستش یعنی طبق نموداری که در دیتاشیت اون رسم شده زمان لازم برای حرکت از صفر به 5ولت حدود 80 نانوثانیه هستش و اینطوری ولتاژ ورودی 10 ولت رو به 5 ولت کاهش بدم . به نظر شما راه خوبیه ؟ شما مقایسه کننده سریعتری سراغ دارین ؟

                              ممنون
                              "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                              در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                              دیدگاه

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