PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کتابخونه فوق دقیق تاخیر با قابلیت کالیبره دستی برای میکرو ثانیه



esisafa
06-06-2014, 16:01
سلام دوستان

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

اگر دوستان مایل هستن فعلا همین مثالی که پیوست میکنم رو یک نگاهی بندازن تا بعدا توضیحات رو ادامه بدم

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

mzarkoob
06-06-2014, 21:23
سلام
الان من متوجه نشدم این روش چطور تاخیر دقیق میده
چرا از system tick استفاده نمی کنید؟

esisafa
06-06-2014, 21:26
در فایل اصلی برنامه قبل از اعلان کتابخونه 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
06-06-2014, 22:08
برای کالیبره کردن delay_us باید اولش cnt++ ها رو حذف کنید و در برنامه ی اصلی مقدار تاخیرها رو 1 میکرو ثانیه کنید.
مقداری که در اینجا 7 در حلقه for اول هست رو کم و زیاد کنید. با سیمولینک مدت زمانی که خروجی در سطح پایین هست باید در نزدیکترین حالت کمتر از 1 میکرو ثانیه باشه. برای 1 میکرو ثانیه کردن دقیق باید زیر for اول cnt++ اضافه کنید.
حالا در برنامه ی اصلی مقدار تاخیرها رو 2 میکروثانیه کنید و حلقه ی for سوم رو به روش بالا تنظیم کنید.

esisafa
06-06-2014, 22:15
سلام
الان من متوجه نشدم این روش چطور تاخیر دقیق میده
چرا از system tick استفاده نمی کنید؟

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

Aghaeifar
06-06-2014, 22:27
سلام
شما چطور اطمینان حاصل می کنید که هر cnt++ که اضافه یا حذف می کنید چقدر در تاخیرتون اثر می گذاره؟ خود دقت میکروثانیه بودن تاخیر رو چطور سنجش می کنید؟

esisafa
06-06-2014, 23:09
وقتی در سیمولاتور مشاهده کنیم که تاخیر 1 میکرو ثانیه هست، اونوقت 1 میکرو ثانیه هست.
حتی با دستور __nop میتونید دقت بیشتری از cnt++ داشته باشید. این دیگه کمترین حالت ممکن هست.

taherzade
27-10-2016, 19:24
سلام
الان من متوجه نشدم این روش چطور تاخیر دقیق میده
چرا از system tick استفاده نمی کنید؟

سلام مهندس
لطفا نحوه ایجاد تاخیر با systemtick رو در LPC1768 توضیح بدین. ممنون.

lida-app.ir
27-10-2016, 23:55
من بعید می دونم شما بتونین تایمری با دقت یک میکرو ثانیه دقیق با میکرو ایجاد کنین. من یک بار این مورد نیازم شد از یک fpga ارزان استفاده کردم.

taherzade
28-10-2016, 01:13
من بعید می دونم شما بتونین تایمری با دقت یک میکرو ثانیه دقیق با میکرو ایجاد کنین. من یک بار این مورد نیازم شد از یک fpga ارزان استفاده کردم.

در حد میکرو ثانیه نه. در حد میلی ثانیه هم باشه کافیه برام. ولی میخوام دقیق باشه.