اطلاعیه

Collapse
No announcement yet.

تایمر 16 بیتی AVR

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

    تایمر 16 بیتی AVR

    با سلام به همه دوستان و اساتید محترم :agree: من یه سوال دارم که شاید خیلی ساده باشه ولی من درکش نکردم دوستان لطفا راهنمایی کنن

    وقتی تایمر رو نسبت به لبه بالا رونده تنظیم میکنیم تایمر تا چه زمانی پالس رو اندازه میگیره؟ منظورم اینه که از لبه بالا رونده اول تا لبه بالا رونده دوم رو اندازه میگیره یا به محض اینکه به اولین لبه پایین رونده برسه متوقف میشه؟
    برای پرواز کردن ابتدا باید پریدن را آموخت

    #2
    پاسخ : تایمر 16 بیتی AVR

    مثلا برای تایمر 1 که برای ضبط ورودی در لبه بالارونده تنظیم شده باشه هربار که پالس ورودی به لبه بالارونده میرسه مقدار ثبات tcnt1 در ثبات ICR1 ذخیره میشه

    فقط همین !

    حالا شما مثلا برای اینکه دوره تناوب رو بدست بیارید باید با بررسی پرچم ICF1 دوبار مقدار ICR1 رو بخونید و از هم کم کنید تا دوره تناوب موج بدست بیاد
    من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
    آلبرت اینشتین
    منبع: http://fa.wikiquote.org

    دیدگاه


      #3
      پاسخ : تایمر 16 بیتی AVR

      نوشته اصلی توسط S i l i c o n
      مثلا برای تایمر 1 که برای ضبط ورودی در لبه بالارونده تنظیم شده باشه هربار که پالس ورودی به لبه بالارونده میرسه مقدار ثبات tcnt1 در ثبات ICR1 ذخیره میشه

      فقط همین !

      حالا شما مثلا برای اینکه دوره تناوب رو بدست بیارید باید با بررسی پرچم ICF1 دوبار مقدار ICR1 رو بخونید و از هم کم کنید تا دوره تناوب موج بدست بیاد
      دوست عزیزم Silicon ممنونم از جوابت حالا بیشتر سوال میکنم

      من پریود و میزان تناوب مدارم رو دارم (10ms) تنها چیزی که تغییر میکنه dutycycle مدارم هست
      طبق فرمایش شما اگه از تایمر 1 که 16 بیتی هست استفاده کنم میتونم تا مقدار 65536 شمارش کنه تا به سرریز برسه
      با توجه به اینکه از کریستال 4MHz استفاده میکنم میتونم تا 16ms رو اندازه گیری کنم درسته؟ حالا من چطوری عرض پالسم زمانی که در سطح 1 منطقی هست اندازه بگیرم؟
      برای پرواز کردن ابتدا باید پریدن را آموخت

      دیدگاه


        #4
        پاسخ : تایمر 16 بیتی AVR

        برای اندازه گیری عرض پالس از روش ریر عمل کنید :

        1. tccr1a و tccr1b را برای ضبط روی لبه بالا رونده مقدار دهی کنید

        2. پرچم icf1 از TIFR رو بررسی کنیم ببینیم به لبه رسیده یا نه

        3. به محض رسیدن به لبه بالا رونده مقدار ICR1 رو در جایی ذخیره میکنیم

        4 . مقدار tccr1b را برای ضبط روی لبه پایین رونده تغییر میدهیم

        5. پرچم icf1 را بررسی می کنیم برای دریافت لبه پایین رونده

        6. به محض رسیدن به لبه پایین رونده مقدار ICR1 را ذخیره میکنیم

        7. با تفریق مقدار لبه اول از لبه دوم عرض پالس بدست می آید
        من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
        آلبرت اینشتین
        منبع: http://fa.wikiquote.org

        دیدگاه


          #5
          پاسخ : تایمر 16 بیتی AVR

          جناب Silicon ممنون از راهنمایی دقیقتون ، به نظر شما کد زیر جوابگوی مشکل من هست؟ البته این کد با توجه به AVR135 اتمل نوشته شده، ممنون میشم نظرتونو بفرمایید.

          کد:
          #include <avr/io.h>
          #include <avr/interrupt.h>
          //Counts overflovs
          volatile uint16_t T1Ovs1, T1Ovs2;
          //Variables holding three timestamps
          volatile uint16_t Capt1, Capt2, Capt3;
          //capture Flag
          volatile uint8_t Flag;
          //Initialize timer
          void InitTimer1(void)
          {
          //Set Initial Timer value
          TCNT1=0;
          //First capture on rising edge
          TCCR1B|=(1<<ICES1);
          //Enable input capture and overflow interrupts
          TIMSK1|=(1<<ICIE1)|(1<<TOIE1);
          }
          void StartTimer1(void)
          {
          //Start timer without prescaller
          TCCR1B|=(1<<CS10);
          //Enable global interrutps
          sei();
          }
           
          //capture ISR
          ISR(TIMER1_CAPT_vect)
          {
          if (Flag==0)
            {
              //save captured timestamp
              Capt1=ICR1;
              //change capture on falling edge
              TCCR1B&=~(1<<ICES1);
              //reset overflows
              T1Ovs2=0;
            }
          if (Flag==1)
            {
              Capt2=ICR1;
              //change capture on rising edge
              TCCR1B|=(1<<ICES1);
              //save first overflow counter
              T1Ovs1=T1Ovs2;
            }
          if (Flag==2)
            {
              Capt3=ICR1;
              //stop input capture and overflow interrupts
              TIMSK1&=~((1<<ICIE1)|(1<<TOIE1));
            }
          //increment Flag
          Flag++;
          }
          //Overflow ISR
          ISR(TIMER1_OVF_vect)
          {
          //increment overflow counter
          T1Ovs2++;
          }
          int main(void)
          {
          //dutycycle result holder
          volatile uint8_t DutyCycle;
          InitTimer1();
          StartTimer1();
            while(1)
            {
              //calculate duty cycle if all timestamps captured
              if (Flag==3)
              {
                  DutyCycle=(uint8_t)((((uint32_t)(Capt2-Capt1)+((uint32_t)T1Ovs1*0x10000L))*100L)
                    /((uint32_t)(Capt3-Capt1)+((uint32_t)T1Ovs2*0x10000L)));
                  //send Duty Cycle value to LCD or USART
                  //clear flag
                  Flag=0;
                  //clear overflow counters;
                  T1Ovs1=0;
                  T1Ovs2=0;
                  //clear interrupt flags to avoid any pending interrupts
                  TIFR1=(1<<ICF1)|(1<<TOV1);
                  //enable input capture and overflow interrupts
                  TIMSK1|=(1<<ICIE1)|(1<<TOIE1);
              }
            }
          }
          البته در این کد با استفاده از T1Ovs1,2 سرریز احتمالی رو محاسبه کرده اما در عمل و پروژه ما (سنسور شتاب) به دلیل استفاده از تقسیم فرکانسی و پریود 10ms نیازی به این بخش نیست.
          برای پرواز کردن ابتدا باید پریدن را آموخت

          دیدگاه


            #6
            پاسخ : پاسخ : تایمر 16 بیتی AVR

            نوشته اصلی توسط sepehr-azad
            جناب Silicon ممنون از راهنمایی دقیقتون ، به نظر شما کد زیر جوابگوی مشکل من هست؟ البته این کد با توجه به AVR135 اتمل نوشته شده، ممنون میشم نظرتونو بفرمایید.
            خواهش میکنم
            دوست عزیز متاسفانه من فقط بیسیک و تا حدی اسمبلی بلدم زبون c یاد ندارم
            دوستان دیگه کمکتون میکنن
            من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
            آلبرت اینشتین
            منبع: http://fa.wikiquote.org

            دیدگاه


              #7
              پاسخ : تایمر 16 بیتی AVR

              ممنونم Silicon جان ، اساتید و دوستایی که به زبان C اشراف دارن لطف کنن راهنمایی کنن و نظرشون رو بگن
              برای پرواز کردن ابتدا باید پریدن را آموخت

              دیدگاه

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