NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2709 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 11 از 11

موضوع: کتابخونه فوق دقیق تاخیر با قابلیت کالیبره دستی برای میکرو ثانیه

  1. #1
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض کتابخونه فوق دقیق تاخیر با قابلیت کالیبره دستی برای میکرو ثانیه

    سلام دوستان

    نیازمند تاخیر بسیار دقیق در حد میکرو ثانیه شدم که استفاده از تایمر هم فایده نداشت. مجبور شدم توابع تاخیر جدید بنویسم که با کالیبره فوق دقیق میشه. دوستان برای هر فرکانسی کافیه یکبار تنظیم کنن و نسخه ی جدید رو با توجه به روشی که میگم به همین تاپیک اضافه کنن تا اینکه کامل بشه.

    اگر دوستان مایل هستن فعلا همین مثالی که پیوست میکنم رو یک نگاهی بندازن تا بعدا توضیحات رو ادامه بدم
    فايل هاي پيوست شده فايل هاي پيوست شده
    ویرایش توسط esisafa : 06-06-2014 در ساعت 16:13

  2. کاربران : 3 تشکر کرده اند از شما esisafa برای ارسال این پست سودمند:


  3. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  4. #2
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    مشکل اصلی در تاخیر میکروثانیه اینه که با یک حلقه ی for در تابع delay_us اصلا دقیق نمیشه.
    دلیلش اینه که خود پرش به تابع و معرفی متغیرها و بازگشت از تابع تاخیر فقط یکبار اتفاق میافته ولی حلقه ی for چندین بار. همین باعث میشه که هیچ یک از مقادیر تاخیر 1 تا 10 میکرو ثانیه دقیق نباشن اما بعد از این تقریبا مشکل حل میشه.
    برای رفع این مشکل در تابع تاخیر میکرو ثانیه باید یکبار پردازش های کمتری انجام بشه تا جبران پردازشهای پرش و بازگشت تابع باشه ولی بقیه ی پردازشها یکسان هستن.
    همچنین یک حلقه ی for نمیتونه زمان دقیق رو تولید کنه و برای تنظیم دقیق باید پردازشهای کوچکتری هم انجام بشه. (دستورات cnt++)
    اگر در کتابخونه ی delay به تابع delay_us نگاه کنید بهتر متوجه میشید.

  5. #3

  6. #4
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    در فایل اصلی برنامه قبل از اعلان کتابخونه delay باید CoreClock رو مقدار بدین.
    کد:
    #define CoreClock 60000000
    #include "delay.h"
    این عدد فرکانس cpu هست نه کریستال.

    تابع delay_ms
    کد:
    void delay_ms(unsigned long t)
    {
        unsigned long cnt;
        
        do
        {
            for(cnt=0;cnt<(CoreClock/8000);cnt++);
            t--;
        }
        while(t>0);
    }
    تابع delay_ms که مشکل خاصی نداره و برای دقت بالاتر میشه عدد 8000 رو مقدار کمی کم و زیاد کرد.

    بحث اصلی سر تابع delay_us هست.
    کد:
    void delay_us(unsigned long t)
    {
        unsigned long cnt;
    #if    CoreClock==60000000
        for(cnt=0;cnt<7;cnt++); 
        cnt++;
        for(;t>1;t--)
        {
            for(cnt=0;cnt<9;cnt++);
            cnt++;cnt++;cnt++;
        }
    #endif
    }
    وقتی تابع فراخونی میشه و متغیر cnt معرفی میشه و هنگام برگشت از تابع، مقداری از زمان پردازنده استفاده میشه. جمع این زمانها و زمان صرف شده در حلقه ی For اول میشه 1 میکرو ثانیه. حلقه ی for دوم هم که فقط برای تاخیرهای بزرگتر از 2 میکروثانیه اجرا میشه، بقیه تاخیرها رو ایجاد میکنه. این همون نکته ی دقیق بودنه. علاوه بر اینا cnt++ هم برای دقیقتر کردن زمان تاخیر استفاده میشه.
    نحوه ی کالیبره کردن برای فرکانسهای دیگه هم بعدا میگم
    ویرایش توسط esisafa : 07-06-2014 در ساعت 00:56

  7. #5
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    برای کالیبره کردن delay_us باید اولش cnt++ ها رو حذف کنید و در برنامه ی اصلی مقدار تاخیرها رو 1 میکرو ثانیه کنید.
    مقداری که در اینجا 7 در حلقه for اول هست رو کم و زیاد کنید. با سیمولینک مدت زمانی که خروجی در سطح پایین هست باید در نزدیکترین حالت کمتر از 1 میکرو ثانیه باشه. برای 1 میکرو ثانیه کردن دقیق باید زیر for اول cnt++ اضافه کنید.
    حالا در برنامه ی اصلی مقدار تاخیرها رو 2 میکروثانیه کنید و حلقه ی for سوم رو به روش بالا تنظیم کنید.

  8. #6
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mzarkoob نمایش پست ها
    سلام
    الان من متوجه نشدم این روش چطور تاخیر دقیق میده
    چرا از system tick استفاده نمی کنید؟
    نحوه ی کالیبره کردن رو بخونید میفهمید چطور تاخیر دقیق میده.
    systick هم میشه. ولی arm7 نداره. همچنین چون زمان 1 میکروثانیه خیلی کمه سیستم درگیر اینتراپت های پی در پی میشه. اگر از سیستم عامل استفاده کنیم معمولا زمان tick بالای میلی ثانیه انتخاب میشه که نمیشه میکرو ثانیه استفاده کرد وگرنه اکثر زمان پردازنده برای همین هدر میره

  9. #7
    مدیر انجمن Aghaeifar آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    علی آقائی فر
    نوشته ها
    751
    تشکر
    552
    تشکر شده 975 بار در 440 پست

    پیش فرض

    سلام
    شما چطور اطمینان حاصل می کنید که هر cnt++ که اضافه یا حذف می کنید چقدر در تاخیرتون اثر می گذاره؟ خود دقت میکروثانیه بودن تاخیر رو چطور سنجش می کنید؟
    ما در انتظار رویت خورشیدیم ...

    اللهم عجل لولیک الفرج

  10. #8
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    وقتی در سیمولاتور مشاهده کنیم که تاخیر 1 میکرو ثانیه هست، اونوقت 1 میکرو ثانیه هست.
    حتی با دستور __nop میتونید دقت بیشتری از cnt++ داشته باشید. این دیگه کمترین حالت ممکن هست.

  11. تشکرها از این نوشته :


  12. #9
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2016
    نوشته ها
    20
    تشکر
    9
    تشکر شده 5 بار در 4 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mzarkoob نمایش پست ها
    سلام
    الان من متوجه نشدم این روش چطور تاخیر دقیق میده
    چرا از system tick استفاده نمی کنید؟
    سلام مهندس
    لطفا نحوه ایجاد تاخیر با systemtick رو در LPC1768 توضیح بدین. ممنون.

  13. #10
    عضو جدید
    تاریخ عضویت
    Aug 2016
    نوشته ها
    17
    تشکر
    1
    تشکر شده 7 بار در 7 پست

    پیش فرض

    من بعید می دونم شما بتونین تایمری با دقت یک میکرو ثانیه دقیق با میکرو ایجاد کنین. من یک بار این مورد نیازم شد از یک fpga ارزان استفاده کردم.

  14. #11
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2016
    نوشته ها
    20
    تشکر
    9
    تشکر شده 5 بار در 4 پست

    پیش فرض

    نقل قول نوشته اصلی توسط lida-app.ir نمایش پست ها
    من بعید می دونم شما بتونین تایمری با دقت یک میکرو ثانیه دقیق با میکرو ایجاد کنین. من یک بار این مورد نیازم شد از یک fpga ارزان استفاده کردم.
    در حد میکرو ثانیه نه. در حد میلی ثانیه هم باشه کافیه برام. ولی میخوام دقیق باشه.

موضوعات مشابه

  1. راهنمایی جهت جایگزینی سنسور مادون بجای شستی
    توسط pahpad.elect در انجمن الکترونیک
    پاسخ: 11
    آخرين نوشته: 06-05-2013, 18:53
  2. سیستم جایگزینی مادون بجای شستی
    توسط pahpad.elect در انجمن میکروکنترلرهای 8و16 بیتی
    پاسخ: 0
    آخرين نوشته: 01-05-2013, 17:27
  3. متولد چه سالی هستی ؟
    توسط arsalan681 در انجمن گفت و گوي آزاد
    پاسخ: 0
    آخرين نوشته: 20-02-2010, 16:34
  4. میکرو به درستی کار نمیکنه!
    توسط dostajn در انجمن AVR
    پاسخ: 10
    آخرين نوشته: 03-10-2008, 20:31

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •