اطلاعیه

Collapse
No announcement yet.

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

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

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

    با سلام
    اگر یک سیستم مبتنی بر xmega به دو عدد انکودر متصل باشد و انکودرها فقط به یک پورت مشخص متصل شده باشند (مثلا انکودر اول به PIN0.A و PIN1.A و انکودر دوم به PIN3.A و PIN4.A ) آیا امکان قرائت مقادیر انکودر از طریق واحد QDEC می باشد یا خیر؟
    مشخصات من در لینک زیر
    http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

    www.********

    دیدگاه


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

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

      دیدگاه


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

        با سلام
        در مورد شماتیک میتونید به راحتی از یک مقاومت و یک دیود زنر 3.3 ولتی استفاده کنید . مقاومت بالایی رو باید طوری انتخاب کنید که جریان حدود 5 میلی آمپر برای فعال کردن دیود زنر ایجاد بشه .
        مثلا یک مقاومت 3 کیلویی کافی به نظر میرسه . حالا تا نظر استاد چی باشه .
        ممنون
        "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
        در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

        دیدگاه


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

          نوشته اصلی توسط Mania59
          فقط جناب طراح در مورد شماتیکم نظری ندادید
          در شماتیک شما اگر مقدار تغذیه ثابت است، چرا از یک تقسیم ولتاژ قبل از گیت استفاده نمی کنید و دلیل وجود ترانزیستور در این حالت چیست؟

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

          دیدگاه


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

            نوشته اصلی توسط طراح
            در شماتیک شما اگر مقدار تغذیه ثابت است، چرا از یک تقسیم ولتاژ قبل از گیت استفاده نمی کنید و دلیل وجود ترانزیستور در این حالت چیست؟
            من که از یک تقسیم ولتاژ برای ورودی انکودر استفاده کردم . منظور تون قبل گیت برای چی بود ؟

            برای ترانزیستور فکر کردم اینطوری بتونم ولتاژ تثبیت شده ای رو به پایه میکرو بدم . (همیشه 5 ولت )

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

            راستی در Xmega ولتاژ تغذیه میکروی من 3.3 ولتی هست . می تونم برای منطق یک ( مثلا کلید ) از ولتاژ 5 ولت استفاده کنم ؟
            - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

            دیدگاه


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

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

              برای ترانزیستور فکر کردم اینطوری بتونم ولتاژ تثبیت شده ای رو به پایه میکرو بدم . (همیشه 5 ولت )

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

              راستی در Xmega ولتاژ تغذیه میکروی من 3.3 ولتی هست . می تونم برای منطق یک ( مثلا کلید ) از ولتاژ 5 ولت استفاده کنم ؟
              با سلام و با کسب اجازه از استاد ارجمند جناب کی نژاد
              بنده شماتیک شما رو دیدم و به نظر بنده شما می توانید مثلا برای تبدیل ولتاژ خروجی A انکودر به ولتاژ حدود 3.3 ولت از طریق یک تقسیم مقاومتی ساده استفاده نمایید البته با فرض اینکه ولتاژ از 17 ولت فراتر نرود و دیگر نیازی به گیت و ترانزیستور نیست. البته بعد از تقسیم مقاومتی حتما با یک مولتی متر چک نمایید که ولتاژ فراتر از 3.3 ولت نرود چون امکان آسیب دیدن پورت می باشد
              در صورتی که یک ولتاژ 5 ولت را بعنوان ورودی به پورتی از میکروی مذکور وصل نمایید پورت مربوطه میسوزد و دیگر قابل استفاده نمی باشد
              ولی میتوان یک پورت میکروی مذکور را بعنوان خورجی به ورودی یک آی سی دیگر که دارای تغذیه 5 ولت می باشد بعنوان مثال به ورودی یک max232 وصل نمود چراکه ولتاژ 3.3 ولت برای یک آی سی با تغذیه 5 حکم منطق یک را دارد
              مشخصات من در لینک زیر
              http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

              www.********

              دیدگاه


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

                :surprised:
                چطور می تونم کاری کنم که ولتاژ از 3.3 ولت فراتر نرود ؟
                می تونم از یه زنر استفاده کنم ؟ و اگر بله ولتاژ و جهت زنر باید چطوری باشه ؟ (یادم رفته ) :mrgreen:

                بازم ممنون از پاسختون
                - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                دیدگاه


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

                  نوشته اصلی توسط Mania59
                  :surprised:
                  چطور می تونم کاری کنم که ولتاژ از 3.3 ولت فراتر نرود ؟
                  می تونم از یه زنر استفاده کنم ؟ و اگر بله ولتاژ و جهت زنر باید چطوری باشه ؟ (یادم رفته ) :mrgreen:
                  ولتاژ ماکزیمم ورودی که می تونی به یه پورت I/O بدی VCC+0.3 هستش. البته در واقع فکر کنم نباید مشکلی پیش بیاد. چون من توی سایت استک دیدم که گفته بودن بیشتر(یا شاید بعضی) SoCها مشکلی با این موضوع ندارن. شما باید همیشه دیتاشیت میکرویی که می خرین رو دانلود کنید و واسه این مسائل تغذیه و... بهش مراجعه کنید. مثلا شما واسه این سوالتون بعد از دریافت دیتاشیت به بخش Electrical Characteristics مراجعه کنید همه جوابتون رو میگیرید. :nerd:

                  دیدگاه


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

                    نوشته اصلی توسط Mania59
                    :surprised:
                    چطور می تونم کاری کنم که ولتاژ از 3.3 ولت فراتر نرود ؟
                    می تونم از یه زنر استفاده کنم ؟ و اگر بله ولتاژ و جهت زنر باید چطوری باشه ؟ (یادم رفته ) :mrgreen:

                    بازم ممنون از پاسختون
                    شما لزوما نیاز نیست ولتاژ رو روی 3.3 ولت تنظیم کنید من خودم همیشه برای محافظت معمولا بین 2.9 الی 3.3 تنظیم میکنم چون بالاخره تقسیم مقاومتی کاملا وابسته به تلرانس مقاومتها و بنوعی حتی وابسته به دمای محیط پس بهتره که مثلا روی 3 ولت تنظیم کنید که با تغییر پارامتهای موثر بر تلرانس زیاد فراتر نرودچرا که بنظر من زیاد تو مقادیر حدی ولتاز و جریان کار کردن تجربه نشون داده که خوب نیست
                    مشخصات من در لینک زیر
                    http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

                    www.********

                    دیدگاه


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

                      با عرض سلام خدمت اساتید بزرگوار
                      همون طور که فرمودید کد ها رو برای راه اندازی Quadrature Decoders در برنامه محیط Atmel Studio با زبان C++ وارد نمودم و سعی کردم مطابق مدار خودم تغییراتی نیز در کد ها بدهم . مقاله AVR-1600 رو هم که جناب طراح فرمودند مطالعه کردم ولی متاسفانه هنوز نمی دونم چطور باید کاملش کنم .
                      خروجی A و B انکودر به ترتیب به پین های 3 و 4 از پورت C میکرو (ATXMega32A4) متصل هستند

                      کد:
                      int main(void)
                      {
                      	system_clocks_init();
                      	
                      	Output(DDRB,0);
                      	Output(DDRE,3);
                      	Input(DDRC,1);
                      	Input(DDRC,2);
                      	Input(DDRC,3);
                      	Input(DDRC,4);
                      
                      	usarte0_init();
                      
                      	//PORTC.3 & PORTC.4 for encoder A,B
                      	PORTC_PIN3CTRL=PORT_ISC_LEVEL_gc; // QDPH0
                      	PORTC_PIN4CTRL=PORT_ISC_LEVEL_gc; // QDPH90
                      	TCC0_PER = 1335;
                      	EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN3_gc;
                      	EVSYS_CH0CTRL=EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
                      	TCC0_CTRLD=TC_EVACT_QDEC_gc|TC_EVSEL_CH0_gc;
                      	TCC0_CTRLA=TC_CLKSEL_DIV1_gc;
                      	
                      	TCC0_INTCTRLA = ( TC0_OVFINTLVL0_bm);
                      
                      			
                      	
                      	while(1)
                      	{
                      		// --------------------------
                      			Metr = TCC0_INTCTRLA;
                      			//Afzayesh
                      			Metr += number;
                      			//Kahesh
                      			Metr -= number;
                      	  // --------------------------
                      			
                      		Set(PORTB, 0);
                      		fcpu_delay_ms(500);
                      		Reset(PORTB, 0);
                      		fcpu_delay_ms(500);
                      		
                         	 SendMetraj();
                      	}
                      }
                      قسمت های چشمک زدن LED و ارسال دیتای عدد متراژ به کامپیوتر درست کار می کند . کلاک هم با کریستال خارجی کار می کند از روی زمان صحیح LED متوجه شدم . اما کد های مربوطه به راه اندازی تایمر کانتر و EVent System رو نمی دونم و در ضمن در این برنامه من می خوام یه کدی مثلا

                      کد:
                      		// --------------------------
                      			Metr = TCC0_INTCTRLA;
                      			//Afzayesh
                      			Metr += number;
                      			//Kahesh
                      			Metr -= number;
                      	  // --------------------------
                      این طوری داشته باشم که بطور مداوم بروز شده و مقدار متغییر Mter رو برام کم و زیاد کنه . لطفا بفرمائید در چه جایی از کد باید آنرا بنویسم و آیا باید اینتراپتی برای این موضوع فعال شود یا خیر ؟ اگر بله لطفا روش آنرا نیز بفرمائید . با تشکر
                      - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                      دیدگاه


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

                        راستی روی بردم کریستال 10 مگاهرتز گذاشتم همین خوبه یا باید بیشتر باشه ؟

                        در ضمن اعتراف کنم که کد ها و راههای زیادی رو چک کردم و جواب نداد . خواهش می کنم کمکم کنید .
                        - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                        دیدگاه


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

                          جناب طراح سلام و خسته نباشید

                          از کدی که در سایت AVRfreaks گذاشته بودید استفاده کردم و خوشبختانه مشکلم حل شد و بلاخره تونستم یه تغییراتی رو ببینم خیلی ممنونم . اینم کد ولی یه سوالاتی دارم که امید وارم شما یا دوستان دیگه زودتر بهم جواب بدید که خیلی کارم گیر هست .
                          کد:
                          unsigned char DIGITS[6]={0,0,0,0,0,0};	
                          unsigned int TIMER_value;
                          unsigned char i;
                          
                          int main(void)
                          {
                          	system_clocks_init();
                          	
                          	Output(DDRB,0);
                          	Output(DDRE,3);
                          	Input(DDRC,1);
                          	Input(DDRC,2);
                          	Input(DDRC,3);
                          	Input(DDRC,4);
                          
                          	usarte0_init();
                          
                          	 PORTC_PIN3CTRL=PORT_ISC_LEVEL_gc; // QDPH0
                          	 PORTC_PIN4CTRL=PORT_ISC_LEVEL_gc; // QDPH90
                          	 TCC1_PER=19999;
                          	 EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN3_gc;
                          	 EVSYS_CH1MUX=EVSYS_CHMUX_PORTC_PIN2_gc;
                          	 EVSYS_CH0CTRL=EVSYS_QDIEN_bm|EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_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;
                          			
                          	
                          	while(1)
                          	{
                          		// --------------------------
                          			//Metr = TCC0_INTCTRLA;
                          			//Afzayesh
                          			//Metr += number;
                          			//Kahesh
                          			//Metr -= number;
                          	  // --------------------------
                          			
                          			 TIMER_value=TCC1_CNT;
                          			 for (i=0;i<5;i++)
                          			 {
                          				 DIGITS[i]=TIMER_value%10;
                          				 TIMER_value/=10;
                          			 }
                          			
                          		Set(PORTB, 0);
                          		fcpu_delay_ms(500);
                          		Reset(PORTB, 0);
                          		fcpu_delay_ms(500);
                          		
                             	 SendMetraj();
                          	}
                          }
                          1 - این خط برای چیه ؟
                          کد:
                          	 TCC1_PER=19999;
                          2- عدد تایمر رو چرا به 6 عدد دیگه تقسیم های متوالی کردید و باقی مانده ها رو درآوردید ؟
                          3- من چطور می تونم حالا از روی این اعداد جهت و مقدار حرکت رو تشخیص بدم ؟ تا بتونم متراژ حرکت کرده رو تشخیص بدم ؟

                          بازم ممنون
                          - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                          دیدگاه


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

                            1- این کد برای یک انکودر 5000 پالس نوشته شده و بنابراین باید 4N-1 که N=5000 است در TCC1_PER قرار بگیرد.

                            2- با محاسبه باقیمانده تقسیمات متوالی به 10، تک تک رقمهای معادل از روی مقدار تایمر بدست آمده است.

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

                            دیدگاه


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

                              با عرض سلام
                              و با تشکر از اینکه وقت گذاشتید و جواب سوالاتم را دادید .
                              استاد من یه چیزی رو متوجه نشدم و هر کاری می کنم هم به جایی نرسیدم من نمی دونم از این اعدادی که از تایمر بدست می یاد چطور می تونم متراژی رو که چرخ انکودر داره طی می کنه بدست بیارم ؟ oo:

                              یا اگه یه متراژی رو طی کرد و دوباره برعکس چرخید مقدارش رو کم کنم ؟

                              این کد من هست
                              کد:
                              int Counter = 0;
                              float Metr = 0 ;
                              float number = 0.025; //0.01
                              
                              unsigned int Sefr_value;
                              unsigned int TIMER_value;
                              unsigned char i;
                              int N_PalseEncoder = 500;
                              
                              
                              int main(void)
                              {
                              	system_clocks_init();
                              	
                              	Output(DDRB,0);
                              	Output(DDRE,3);
                              	Input(DDRC,1);
                              	Input(DDRC,2);
                              	Input(DDRC,3);
                              	Input(DDRC,4);
                              
                              	usarte0_init();
                              
                              	PORTC_PIN3CTRL=PORT_ISC_LEVEL_gc; // QDPH0
                              	PORTC_PIN4CTRL=PORT_ISC_LEVEL_gc; // QDPH90
                              	TCC1_PER= (4 * N_PalseEncoder) - 1 ;
                              	EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN3_gc;
                              	EVSYS_CH1MUX=EVSYS_CHMUX_PORTC_PIN2_gc;
                              	EVSYS_CH0CTRL=EVSYS_QDIEN_bm|EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_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;
                              	
                              	Sefr();
                              	
                              	while(1)
                              	{
                              		TIMER_value = TCC1_CNT;
                              		
                              		Set(PORTB, 0);
                              		fcpu_delay_ms(500);
                              		Reset(PORTB, 0);
                              		fcpu_delay_ms(500);
                              		
                              	  MetrajCal();
                              		SendMetraj();
                              	}
                              }
                              
                              
                              void MetrajCal()
                              {
                              	unsigned int Result ;
                              	Result = TIMER_value - Sefr_value;
                              	Metr = (Result * number);
                              }
                              
                              void Sefr()
                              {
                              	Sefr_value = TCC1_CNT;
                              	Metr = 0;
                              }
                              قبل از ورود به حلقه برنامه مقدار تایمر رو در متغییر صفر قرار می دم و در حلقه اصلی برنامه اون رو مرتب می خونم و در تابع MetrajCal سعی می کنم متراژ رو بدست بیارم که اختلاف مقدار تایمر رو در عددی ثابت که با آزمایش های مختلف بدست می یاد ضرب می کنم و میشه متراژ . ولی درست کار نمی کنه تا تقریبا 4 متر کار می کنه و بعدش دوباره اعداد از ابتدا شروع می شن . :angry:
                              - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                              دیدگاه


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

                                با سلام و با کسب اجازه از استاد کی نژاد
                                در خصوص تبدیل مقدار قرائت شده انکودر و تبدیل آن به متراژی که شما فرمودید, شما در ابتدا باید بررسی کنید که به ازای هر بار چرخش 360 درجه انکودر چه مقدار جابجایی دارید.
                                سپس با توجه به رزولوشن 5000 پالس انکودر مذکور و در نتیجه به ازای یک دور چرخش کامل انکودر , واحد QDEC مقدار 20000 را در خروجی خود قرار میدهد( البته با فرض صفر بودن آن در شروع حرکت)
                                فلذا با یک نسبت تناسب ساده مقدار جابجایی را می توان بدست آورد.
                                در خصوص اینکه گفتید بعد از حدود 4 متر دوباره مقدار انکودر صفر میشه خوب طبیعیه چون واحد QDEC به سقف مقدار خودش که 19999 می باشد رسیده و overflow میشه
                                اگه مقدار بیشتری برای اندازه گیری مد نظرتون هست می بایست بجای ضربدر 4 نمودن عدد 5000, آنرا در اعداد بیشتری ضرب کنید ( البته سقف آن بستگی به نوع متغیر مورد استفاده داره)
                                و همچنین ضریب را در نسبت تناسب لحاظ کنید
                                مشخصات من در لینک زیر
                                http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

                                www.********

                                دیدگاه

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