نحوه اندازه گیری عرض پالس

pouyan-asgharian

عضو جدید
سلام دوستان....میخواستم بدونم کسی از نحوه اندازه گیری duty cycle اطلاعی داشته باشه؟سپاس فراوان
 

scienceaddict

عضو جدید
سلام دوست عزیز
شما نگفتید با چه میکروکنترلری ، اما به طور کلی دو روش وجود داره، روش اول اینه که پالس خارجی رو وصل میکنن به وقفه خارجی و وقفه رو حساس به لبه بالا رونده میکنن، وقتی پالس یک شد، میکرو میره تو ساب روتین وقفه و وقفه رو حساس به لبه پایین رونده میکنه و پرچم وقفه خارجی رو پاک میکنه و یه تایمر رو روشن میکنه، میکرو منتظر میمونه که لبه پایین رونده بیاد، بار دوم میکرو وقفه میخوره و میره مقدار تایمر رو تو رم ذخیره میکنه و وقفه رو دوباره به لبه بالا رونده حساس میکنه و پرچمش رو صفر میکنه و تایمر به کارش ادامه میده، بار سوم که وقفه خورد میکرو تایمر رو متوقف میکنه و مقدارش رو ذخیره میکنه، نسبت یک بودن رو که بار اول در وقفه دوم ذخیره کرده بود رو به نسبت کل پالس که تو وقفه سوم ذخیره کرده بود تقسیم میکنه و دیوتی سایکل بدست میاد(انقدر بدم میاد دیوتی سایکل رو ترجمه میکنن زمان وظیفه) ، بعضی ها هم میان تو وقفه دوم مقدار تایمر رو ذخیره میکنن و تایمر رو صفر میکنن، به این ترتیب مقدار اول تقسیم بر مجموع مقدار اول و دوم میشه دیوتی سایکل
روش دوم هم استفاده از مد کپچر هست که تو پی ای سی ها ماژول CCP و تو ای وی ار ها تایمر یک مد ICP این کارو انجام میدن، با کپچر هم مشابه وقفه هست ولی قطعا دقیق تر از وقفه، وقفه ی کپچر به لبه بالا رونده حساس میشه و بار اول تایمر رو صفر میکنن، بار دوم کافیه رجیستر های مربوط به کپچر رو ذخیره کرد و وقفه ی کپچر رو به بالارونده حساس کرد و بار سوم هم رجیستر های کپچر رو ذخیره کرد، تو روش اول چند ماشین سایکل هدر میره که مقادیر تایمر ها ذخیره بشه و ممکنه تایمر چند تا بشماره ولی تو کپچر به محض اینکه لبه بالارونده یا پایین رونده میاد سخت افزار داخلی میکرو مقدار تایمر رو ذخیره میکنه(تو پرانتز که تو 8051 ها نمیشه این کارو کرد چون کپچر تایمر دو 8051 وقفه نداره و اینکه لبه بالارونده و پایین رونده حالیش نیست اگه اشتباه نکنم فقط پایین رونده)
تنها نکتش اینه که همه اینا وقتی درسته که تایمرت سرریز نکنه ، برای همین تایمر های کپچر 16 بیتی ان، اما اگه فرکانس خیلی کم باشه و سرریز کنه باید تدابیری اندیشید که مثلا نرم افزاری تایمر رو 17 یا 18 بیتی اش بکنی که محاسباتت درست از اب در بیاد، اگر هم فرکانسش خیلی خیلی زیاد باشه ممکنه تو وقفه دوم تا میکرو بخواد حساس به لبه پایین رونده کنه پالس خارجی وقفه بالاوندشو انجام بده و وقفه ی بالارونده میس بشه، مشکلی داشتی بازم بگو دوستان کمکت میکنن، منم یه برنامه مال ایام شباب دارم میتونم برات اپ کنم

Good Luck
 
آخرین ویرایش:

pouyan-asgharian

عضو جدید
خیلی ممنون..کمک بزرگی بود..فقط اینکه اگه درست متوجه شده باشم داخل وقفه حساسیت اون رو به لبه تغییر میدیم.آیا مشکلی ایجاد نمیکنه؟مورد دوم در مود کپچر هم راستش واسم خوب جا نیفتاد.سپاس فراوان دوست عزیز
سلام دوست عزیز
شما نگفتید با چه میکروکنترلری ، اما به طور کلی دو روش وجود داره، روش اول اینه که پالس خارجی رو وصل میکنن به وقفه خارجی و وقفه رو حساس به لبه بالا رونده میکنن، وقتی پالس یک شد، میکرو میره تو ساب روتین وقفه و وقفه رو حساس به لبه پایین رونده میکنه و پرچم وقفه خارجی رو پاک میکنه و یه تایمر رو روشن میکنه، میکرو منتظر میمونه که لبه پایین رونده بیاد، بار دوم میکرو وقفه میخوره و میره مقدار تایمر رو تو رم ذخیره میکنه و وقفه رو دوباره به لبه بالا رونده حساس میکنه و پرچمش رو صفر میکنه و تایمر به کارش ادامه میده، بار سوم که وقفه خورد میکرو تایمر رو متوقف میکنه و مقدارش رو ذخیره میکنه، نسبت یک بودن رو که بار اول در وقفه دوم ذخیره کرده بود رو به نسبت کل پالس که تو وقفه سوم ذخیره کرده بود تقسیم میکنه و دیوتی سایکل بدست میاد(انقدر بدم میاد دیوتی سایکل رو ترجمه میکنن زمان وظیفه) ، بعضی ها هم میان تو وقفه دوم مقدار تایمر رو ذخیره میکنن و تایمر رو صفر میکنن، به این ترتیب مقدار اول تقسیم بر مجموع مقدار اول و دوم میشه دیوتی سایکل
روش دوم هم استفاده از مد کپچر هست که تو پی ای سی ها ماژول CCP و تو ای وی ار ها تایمر یک مد ICP این کارو انجام میدن، با کپچر هم مشابه وقفه هست ولی قطعا دقیق تر از وقفه، وقفه ی کپچر به لبه بالا رونده حساس میشه و بار اول تایمر رو صفر میکنن، بار دوم کافیه رجیستر های مربوط به کپچر رو ذخیره کرد و وقفه ی کپچر رو به بالارونده حساس کرد و بار سوم هم رجیستر های کپچر رو ذخیره کرد، تو روش اول چند ماشین سایکل هدر میره که مقادیر تایمر ها ذخیره بشه و ممکنه تایمر چند تا بشماره ولی تو کپچر به محض اینکه لبه بالارونده یا پایین رونده میاد سخت افزار داخلی میکرو مقدار تایمر رو ذخیره میکنه(تو پرانتز که تو 8051 ها نمیشه این کارو کرد چون کپچر تایمر دو 8051 وقفه نداره و اینکه لبه بالارونده و پایین رونده حالیش نیست اگه اشتباه نکنم فقط پایین رونده)
تنها نکتش اینه که همه اینا وقتی درسته که تایمرت سرریز نکنه ، برای همین تایمر های کپچر 16 بیتی ان، اما اگه فرکانس خیلی کم باشه و سرریز کنه باید تدابیری اندیشید که مثلا نرم افزاری تایمر رو 17 یا 18 بیتی اش بکنی که محاسباتت درست از اب در بیاد، اگر هم فرکانسش خیلی خیلی زیاد باشه ممکنه تو وقفه دوم تا میکرو بخواد حساس به لبه پایین رونده کنه پالس خارجی وقفه بالاوندشو انجام بده و وقفه ی بالارونده میس بشه، مشکلی داشتی بازم بگو دوستان کمکت میکنن، منم یه برنامه مال ایام شباب دارم میتونم برات اپ کنم

Good Luck
 

GNMS

عضو جدید
سلام دوستان....میخواستم بدونم کسی از نحوه اندازه گیری duty cycle اطلاعی داشته باشه؟سپاس فراوان

pouyan-asgharian عزیز با سلام

من با PIC این کار رو کردم. اما برای همه میکروکنترلرها درسته. برنامه ای که من نوشتم بصورت زیر کار میکرد:



  • یه متغیر کانتر بصورت گلوبال (Global) تعریف میکنی.
  • یه اینتراپت تایمر تعریف میکنی. سرعت تایمر باید طوری باشه که در طول یه پالس ورودی بتونی چند تا پالس بخونی. مثلا اگه فرکانس موجی که میخوای duty cycleاش رو بخونی 10 هرتز باشه، تایمرت رو مثلا 10 کیلو هرتز یا بیشتر تعریف کنی خوبه. توی ISR این اینتراپت هم یه دستور میزاری که مقدار کانترت رو یه واحد اضافه کنه.
  • یه اینتراپت ورودی تعریف میکنی که روی لبه بالا رونده تحریک بشه.
  • توی ISR این اینتراپت یه شرط if بصورت زیر میزاری
    • اگه اینتراپت بصورت لبه بالارونده تعریف شده باشه، مقدار کانترت رو تو یه متغیر ذخیره کن. (این متغیر تعداد پالسهایی که تو یه سیکل هست رو ذخیره میکنه) بعد مقدار کانتر رو صفر کن. و بعد اینتراپت رو بصورت لبه پایین رونده تعریف کن.
    • اگه اینتراپت بصورت لبه پایین رونده تعریف شده باشه، مقدار کانترت رو تو یه متغیر دیگه ذخیره کن. بعد اینتراپت رو بصورت لبه بالارونده تعریف کن.

  • توی برنامه اصلی همیشه مقدار متغیر دوم تقسیم بر متغیر اول مقدار duty cycle هست.

واسه دقت بیشتر هرچقدر فرکانس تایمرت رو بیشتر کنی، دقت کارت بالاتره. فقط باید حواست باشه که نوع متغیر کانترت رو طوری تعریف کنی که مطمئن باشی که Overflow نمیده.
بازم اگه سوال دیگه ای داشته باشی خوشحال میشم کمکت کنم.

GNMS
 
بالا