اطلاعیه

Collapse
No announcement yet.

خواندن مدت زمان یک بودن یک سیگنال مربعی

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

    خواندن مدت زمان یک بودن یک سیگنال مربعی

    سلام
    من با بسکام کار میکنم ..
    میخوام یه برنامه بنویسم که بتونم مدت زمان یک بودن یک سیگنال مربعی رو بخونم ...
    از وقفه خارجی استفاده کنم؟؟چطوری؟؟
    اگه روش دیگه ای به نظر کسی میرسه بگه استفاده کنیم...
    ممنون
    گیج شدم..
    تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
    علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

    #2
    پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

    از تایمر 2 میتوان استفاده کرد
    شما تایمر را با مود async تنظیم میکنید و prescale را برابر با 128 قرار میدهید و به پایه های tosc1و tosc2کریستال 32.768کیلو هرتز (کریستال ساعت) وصل میکنید! تا بتونید زمان یک ثانیه را بسازید! (تایمر در هر 1ثانیه سریز می شود که میتوان با وقفه تایمر 2، به یه زیر برنامه پرید و در آنجا با دستور if که شرطش یک بودن پین مورد نظر هست متغییری را incr یا افزایش دهیم وبا ال سی دی نشان دهیم )
    آن متغییر مقدار زمان یک بودن آن سیگنال است!
    اگر سیگنال قطع شود زمان بر روی ال سی دی باقی می ماند!
    برنامه:
    کد:
    $regfile = "m32def.dat"
    $crystal = 1000000                     '1Mhz
    '-----------------------------------------
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinb.4 , Db5 = Pinb.5 , _
    Db6 = Pinb.6 , Db7 = Pinb.7 , Rs = Pinb.2 , E = Pinb.3
    Cls
    Cursor Off
    '-----------------------------------------
    Config Porta.0 = Input
    '-----------------------------------------
    Config Timer2 = Timer , Async = On , Prescale = 128
    Enable Interrupts
    Enable Timer2
    Start Timer2
    '-----------------------------------------
     Dim A As Byte
    '-----------------------------------------
    Enable Ovf2
    Do
    On Ovf2 Zeerbarname
    Loop
    End
    '----------------------------------------end------------------------------------
    Zeerbarname:
    If Pina.0 = 1 Then
    Cls
    Incr A
    Lcd A
    End If
    Return
    شماتیک در پروتوس که تا الان 5 ثانیه طول کشیده:
    1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
    من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
    !Electronic On! Programming On
    هوشمندانه سوال بپرسیم!
    http://ir02x6.persiangig.com/logo/eca/tanks_01.png

    دیدگاه


      #3
      پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

      ممنون از همکاریتون ولی این برنامه ای که گذاشتین اصولی نیست ها....
      از دوستان اگه کمک کنین ممنون میشم ...
      تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
      علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

      دیدگاه


        #4
        پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

        سلام دوست عزیز
        شما برای دقت بالا باید از مود capture استفاده کنین.
        کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

        دیدگاه


          #5
          پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

          میشه یه نمونه بذارین؟؟
          تیم کاوش در مسابقات بین المللی ایران اپن 2016.نمایشی.مین یاب.
          علم را باید در آزمایشگاه یاد گرفت نه در دانشگاه!

          دیدگاه


            #6
            پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

            برای اندازه گیری پهنای پالس یا همون مدت زمان یک بودن این مراحل رو باید طی کنید:
            1- مقداردهی اولیه به TCCR1A و TCCR1B برای انتخاب ضبط کردن بر روی لبه بالارونده.

            2- مقداردهی اولیه به ACSR برای انتخاب منبع رویداد مورد نظر

            3- بررسی پرچم ICF1 از TIFR برای اینکه ببینم لبه رسیده است یا نه. به محض ورود لبه، میکرو به طور اتوماتیک مقدار TCNT1 را بر روی ثبات ICR1 کپی می کند.

            4- ذخیره کردن ICR1 و تغییر لبه ضبط کردن به لبه پایین رونده

            5- - بررسی پرچم ICF1 از TIFR برای دریافت لبه دوم. به محض ورود لبه، میکرو به طور اتوماتیک مقدار TCNT1 را بر روی ثبات ICR1 کپی می کند.

            6- ذخیره کردن ICR1 برای لبه دوم، با کم کردن مقدار لبه دوم از مقدار لبه اول زمان مورد نظر بدست می آید.

            این هم یک نمونه کد:
            کد:
            void main(){
            	int t1;
            	PORTD=0xFF;
            	TCCR1A = 0;	//Timer mode = Normal
            	TCCR1B = 0X45;	//rising edge,prescale = 1024,No noise canc
            	
            	while((TIFR & (1<<ICF1)) == 0 );
            	t1 = ICR1L;
            	TIFR = (1 << ICF1);	//Clear ICF1 flag
            	TCCR1B = 0x05;		//Falling Edge
            	while((TIFR & (1<<ICF1)) == 0 );
            	t1=ICR1L - t1;
            	TIFR = (1 << ICF1);	//Clear ICF1 flag
            	while(1);
            }
            البته فرض این برنامه این بوده که فرکانس سیگنال ورودی 60 هرتز و فرکانس کلاک هم 8 مگاهرتز هست. برای بازه های دیگه شما نیاز دارید که مقدار ICR1H رو هم بخونید و تنظیمات تایمر یک رو براساس فرکانس ورودی خودتون قرار بدید.
            منبع:میکروکنترلرهای AVR تالیف محمد علی مزیدی
            ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

            امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

            دیدگاه


              #7
              پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

              نوشته اصلی توسط sinaitg
              سلام
              من با بسکام کار میکنم ..
              میخوام یه برنامه بنویسم که بتونم مدت زمان یک بودن یک سیگنال مربعی رو بخونم ...
              از وقفه خارجی استفاده کنم؟؟چطوری؟؟
              اگه روش دیگه ای به نظر کسی میرسه بگه استفاده کنیم...
              ممنون
              گیج شدم..
              سلام
              وقفه خارجی رو روی هر دو لبه فعال کن. سر لبه بالا رونده تایمرتو روشن کن و سر لبه پایین رونده تایمر رو خاموش کن و مقدار TCNT رو بخون
              تنظیمات تایمر بستگی به پهنای پالست داره ولی اگه تعداد سر ریزها رو هم بشماری دیگه مهم نیست که پهنای پالست در چه حدی باشه.
              مثلا پهنای پالس 1 ثانیس ولی تایمر سر 1 میلی ثانیه سر ریز میکنه
              اگه تعداد سرریزها رو بشماری، تا زمانی که تایمر خاموش بشه 1000 تا سر ریز انجام شده
              واسه شمردن تعداد سرریزها هم وقفه سرریز تایمر رو فعال کن و هر بار اجرا میشه یه متغیر رو اضافه کن
              در آخر مقدار اون متغیر تعداد سرریزها رو نشون میده

              دیدگاه


                #8
                پاسخ : خواندن مدت زمان یک بودن یک سیگنال مربعی

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

                دیدگاه

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