اطلاعیه

Collapse
No announcement yet.

اندازه گیری فرکانس با دقت بالا توسط avr

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

    اندازه گیری فرکانس با دقت بالا توسط avr

    جمیعا سلام
    عرض شود که میخوام فرکانس برق شهر رو (50 تا 60 Hz ) با دقت 0.1Hz ( ترجیحا 0.01Hz ) اندازه گیری کنم البته با ATMEGA32 و BASCOM . قبلا راجع به این موضوع توی انجمن جستجو کردم ولی در مباحث مطرح شده اندازه گیری فرکانسهای بالا با حداکثر دقت 1Hz مد نظر بوده.
    توی اینترنت هم عناوین زیادی مثل Frequency Counter یا Frequency Meter و ... رو سرچ کردم ولی اونا هم بیشتر برای فرکانسهای بالا بودند فقط یکی بود که بین 16 تا 100 Hz رو با دقت 0.01 Hz اندازه میگرفت اما افسوس که با PIC بود. (حالا اگه خواستین بگین لینکشو بزارم.)
    خوب فرض میکنیم که موج سینوسی رو توسط پ امپ مربعی کردیم و دادیم به AVR . حالا دو تا راه داریم :
    1- میتونیم تعداد پالسهای شمرده شده توسط کانتر توی یک ثانیه رو اندازه گیری کنیم .(که البته فکر میکنم در این روش حداکثر دقت 1Hz باشه)
    2- راه دوم اینه که بیایم زمان تناوب یک پالس رو اندازه بکیریم و از فرمول f = 1 / t استفاده کنیم.مثلا
    F = 50 Hz => 1 / 50 = 20 ms
    F = 50.1 Hz => 1 / 50.1 = 19.96 ms
    F = 50.2 Hz => 1 / 50.2 = 19.92 ms
    ...
    البته در این روش باید دید که AVR توانایی اندازه گیری اختلاف زمانی در حدود 0.04 ms رو داره؟
    حالا به نظر دوستان تئوری که توضیح دادم درسته؟
    اگه کسی راه بهتری به نظرش میرسه خوشحال میشیم بشنویم.
    مشتاقانه منتظر نظرات گهربارتون هستم.

    #2
    پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

    روشت بنظرم درسته، میکرو هم بنظرم دقت لازم روداره
    فقط ممکنه موقع تقسیم چون عدد اعشاریه یه مقدار دقت کم بشه
    فکرکنم اگه از double بجای single استفاده کنی دقتت بهترشه
    اگه از قابلیت کپچر تایمر1 (پایه ICP) بهره بگیری، میتونی بیشترین رزلوشن رو داشته باشی
    کریستالت رو هم 16مگ بزار و برو تو دل کار
    {خلاف قوانین - امضا ویرایش شد}

    دیدگاه


      #3
      پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

      می تونی یه فرکانس بالا مثلن 10 کیلو هرتز با یه ای سی دیگه تولید کنی و با کانتر بشمری
      اون وقت توی یک سیکل اون رو با فرکانس ت AND کنی
      این جوری توی یک سیکل 10 کیلو هرتز فرکانس داری



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

      دیدگاه


        #4
        پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

        سلام
        یعنی پالس رو بدم به پایه ICP و فرضا با هر لبه بالا رونده مقدار شمارده شده توسط تایمر یک رو بریزم داخل رجیستر مربوطه به عنوان T و دوباره تایمر رو Reset کنم و از فرمول f = 1 / t استفاده کنم؟
        منظور از کریستال رو 16 مگ بزارم یعنی پایه TOSC یا پایه XTAL یا کریستال داخلی $crystal=16000000 ؟
        میشه یکم جزئی تر توضیح بدی؟ :biggrin:

        دیدگاه


          #5
          پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

          نوشته اصلی توسط Saeed Bagherani
          می تونی یه فرکانس بالا مثلن 10 کیلو هرتز با یه ای سی دیگه تولید کنی و با کانتر بشمری
          اون وقت توی یک سیکل اون رو با فرکانس ت AND کنی
          این جوری توی یک سیکل 10 کیلو هرتز فرکانس داری



          یعنی چی؟ : :eek:
          من زیاد وارد نیستم. :redface:

          دیدگاه


            #6
            پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

            سلام
            دوست عزیز من اینو قبلا ساختم در آخر لینک دانلود رو برات می زارم ولی حالا اینجا یک سری توضیحات واست میدم:
            شما باید موج سینوسی را با یک پ امپ تبدیل به مربعی کنید و بعد بدید به پایه اینتراپت و با لبه ی بالا رونده پالس اول تایمر میکرو را فعال کنید و با لبه دوم تایمر را متوقف کنید حالا زمان یک سیکل را دارید و به راحتی از فرمول فرکانس که عکس زمان است می توانید فرکانس را محاسبه کنید. چون زمان تایمر بر حسب میکرو ثانیه است پس شما زمان/1000000=فرکانس
            روش دوم:
            شما خروجی پ امپ را بدید به کانتر و با لبه ی اول تایمر را فعال کنید و تایمر یک ثانیه شمارش کند بعد کانتر را متوقف کنید تعداد سیکل هایی که در یک ثانیه طی میشود فرکانس می گویند.
            این هم از لینک دانلود فرکانس متری که خودم طراحی کردم :
            http://www.hayatieng.com/index.php?option=com_content&view=article& id=60:ferecunce-meter&catid=44:1389-01-07-20-43-13&Itemid=77
            موفق باشید

            دیدگاه


              #7
              پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

              سلام
              اقای حیاتی ممنونم.من فایل مورد نظر رو دانلود کردم. یه فایل RAR با حجم 299kb بود ولی فقط شماتیک پروژه و PDF همراش بود و فایل HEX نداشت.( فولدرش خالی بود)
              لطفا یه بررسی بکنید.
              با تشکر :agree:

              دیدگاه


                #8
                پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

                نوشته اصلی توسط moostafa
                سلام
                اقای حیاتی ممنونم.من فایل مورد نظر رو دانلود کردم. یه فایل RAR با حجم 299kb بود ولی فقط شماتیک پروژه و PDF همراش بود و فایل HEX نداشت.( فولدرش خالی بود)
                لطفا یه بررسی بکنید.
                با تشکر :agree:
                ُسلام
                دوست عزیز من سورس رو دوباره در سایت گذاشتم می تونید از همون لینک قبل دانلود کنید.
                موفق باشید

                دیدگاه


                  #9
                  پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

                  سلام
                  برنامه رو گرفتم ، کار میکرد ولی چند تا سوال پیش اومد:
                  بیاین فعلا از بخش 7seg استفاده نکنیم و فرکانس رو فقط روی LCD نمایش بدیم ، بدین ترتیب کل دستورات داخل حلقه DO LOOP و CONFIG PORTC حذف خواهند شد.
                  دراین برنامه زمان یک ثانیه توسط Timer0 ساخته شده و برای این منظور از کریستال داخلی ($Crystal=8000000) استفاده شده که در اون تایمر در هر 32 میکرو ثانیه سرریز میشه.به عبارت دیگه در هر ثانیه 31250 بار سرریز میشه.اما کریستال داخلی زیاد دقیق نیست (نمونه ش رو میتونین توی دستورات WAIT یا DELAY ببینید) و در هنگام شبیه سازی حدود 8 ثانیه طول میکشه تا متغیر I به 31250 برسه (در حالی که باید 1 ثانیه طول بکشه) و در موقع نمایش ، فرکانس در 8 ضرب میشه. یعنی زمان Refresh فرکانس 8 ثانیه است که خیلی زیاده.اگه از کریستال خارجی استفاده کنیم دقت بیشتره.
                  1- اگه از Timer2 و مد اسنکرون اون استفاده کنیم و یه کریستال به پایه های TOSC1 و TOSC2 ببندیم مثل کریستال ساعت تا با اون زمان دقیق یک ثانیه رو ایجاد کنیم و متغیر Count رو از نوع Single یا Double بگیریم چی؟ (البته من این حالتو امتحان کردم جواب نداد ، لینک برنامه اش رو در اخر همین ارسال میذارم ، یه نگاهی بهش بندازین شاید فهمیدین اشکالش چیه؟)
                  2- از لحاظ کریستالی که به پایه های TOSC1 و TOSC2 میبندیم ، محدودیتی داریم یا نه؟ مثلا میشه یه کریستال 8 یا 12 مگا یا بالاتر بست؟
                  البته این توضیحات مربوط به زمانیه که تعداد پالسهای شمرده شده توسط کانتر رو توی یک ثانیه اندازه بگیریم که البته همون طور که در اولین ارسال هم گفتم نمیدونم کانتر چجوری فرق بین 0.1 Hz با 1Hz رو متوجه میشه؟ موقعی که یه لبه اومد ، کانتر یکی میشمره که این لبه میتونه بین 0. 1 Hz تا 0. 9 Hz طول بکشه.
                  راه بهتر همونه که زمان تناوب یک سیکل رو اندازه بگیریم. به نظر من اینجوری خیلی دقیق میشه ، ولی در این حالت نیازمند یه زمان با دقت میکرو ثانیه هستیم. توضیحات این روش رو در ارسال بعدی می نویسم.
                  http://qooy.com/files/1BQECBG5UD/Frekans.rar

                  دیدگاه


                    #10
                    پاسخ : اندازه گیری فرکانس با دقت بالا توسط avr

                    سلام
                    از اونجایی که فرکانس مورد سنجش حداکثر 60 هرتز است ، تصمیم گرفتم از روش دوم و مد Capture تایمر یک استفاده کنم.
                    در این برنامه ما توسط تایمر یک مدت زمان یک پالس رو اندازه میگیریم و از روی اون فرکانس رو می سنجیم.
                    برنامه در ظاهر درسته و باید کار کنه اما هنگام اجرا در Proteus اعداد کاملا اشتباه بر روی LCD نشان داده میشود و با پیغام خطای
                    Invalid opcode 0xFFFF at PC=0x8002
                    اجرای برنامه متوقف میشود.
                    ممنون میشم اگه دوستان مشکل رو متذکر شوند.

                    $
                    regfile = "m32def.dat"
                    $crystal = 8000000
                    Dim A As Byte , C As Single
                    Config Timer1 = Timer , Capture Edge = Rising , Noise Cancel = 0 , Prescale = 8
                    Enable Interrupts
                    Enable Timer1
                    Enable Icp1
                    On Icp1 Mm
                    A = 0
                    Start Timer1
                    Do
                    Loop
                    End
                    Mm:
                    If A = 1 Then : Goto Kk : End If
                    A = A + 1
                    Timer1 = 0
                    Return
                    Kk:
                    Cls
                    C = 1000000 / Icr1
                    Home
                    Lcd Fusing(c , "#.###&quot
                    A = 0
                    Icr1 = 0
                    Return

                    دیدگاه

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