ايران ويج

نسخه‌ی کامل: راهنمایی برای کار با تایمر 1
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2

سلام، ببخشید من میخوام با تایمر 1، یه قطار موج مربعی با فرکانس 50Hz و دیوتی سایکل %10 بسازم. کد زیر رو نوشتم. اگه بهم کمک کنید که اشتباهم رو پیدا کنم، ازتون ممنون میشم.
اینم کد:
کد:
#include <mega32.h>
interrupt [TIM1_OVF] void timer1_ovf_isr(void) // فعال کردن اينتراپت براي دادن مقدار مشخص شده به رجيستر TCNT1A در هر بار
{
TCNT1=63035;
}
void main()
{
DDRD=0x30; // تعریف OCA1 به عنوان خروجی
PORTD=0x00;
TCCR1A=0x42; // انتخاب مد fast PWM و انتخاب OC1A به عنوان خروجي
TCCR1B=0x1a; // قرار دادن مقدار ICR1 در TOP وانتخاب تقسيم فرکانسي 64
ICR1L=0xff; // انتخاب 65535 براي رجيستر ICR1
ICR1H=0xff;
TCNT1=63035; // مقدار لازم براي توليد موج با فرکانس 50HZ
OCR1A=63285; // مقدار لازم براي توليد موج با ديوتي سايکل 10%
TIMSK=0x04;  // فعال کردن وقفه سرريز تايمر 1
#asm("sei")  // صدور مجوز وقفه
while(1);
}

اینم روابطی که ازشون استفاده کردم.

[تصویر:  rw0z_20150602_224851.jpg]

و اینم تصویر خروجی پروتئوسش

[تصویر:  rwz_untitled.png]

همونطور که میبینید، شکل موج خروجی با فرکانس 200Hz و دیوتی سایکل %50 تولید شده!
لطفا تو پیدا کرد مشکلش کمکم کنید. ممنون
سلام.

تایمر 1 یه تایمر 16 بیتی هست، اما وقتی قصد تولید موج PWM رو دارید، دقت بین 8 تا 10 بیت رو می تونید برای این منظور تنظیم کنید. در حالت fast PWM با دقت 10 بیت مقدار TOP برابر 0x03FF هست و نه 0xFFFF
از ICR هم نیاز نیست استفاده کنید.

موفق باشید.

ممنون از شما آقای sharin که همیشه تو حل سوالایی که داشتم کمکم کردین. خیلی ممنون
راجع به نکته ای که گفتین، یه سوال برام پیش اومد. اونم اینه که دو سطر آخر جدول زیر چه حالت هایی از مد fast PWM رو نشون میدن؟؟

[تصویر:  3tzq_20150603_205605_1.jpg]

چون مقدار TOP رو یه بار برابر رجیستر ICR1 و یه بار برابر رجیستر OCR1A قرار داده. پس این حالتا دقیقا چیکار میکنن؟؟؟
خواهش می شه ...
شخصا روشم اینه که ابزار کارم رو همیشه ساده انتخاب می کنم، اگر جوابگوی نیازم نبود، کنار می ذارمش و بعدی رو بر می دارم ...

از این 2 مد آخری استفاده نکردم، البته می شه کد زد و نتیجه اش رو چک کرد.
چیزی که برای Mode شماره 14 از جدول به نظرم می رسه، اینه که مقدار ICR1 همون top در نظر گرفته می شه ( فرضا بجای مقدار 0x03FF در مود 10 بیت، مقدار 0x0311 رو برابر Top می تونید انتخاب کنید. )
با این روش احتمالا دیگه نیاز نیست در زمان رفتن به وقفه TCCR رو مجدد مقدار دهی اولیه کرد و در این صورت همیشه از 0 شروع می کنیم به شمارش و لزوما نیازی به وقفه هم نیست.( با تعیین سقف برای Top به فرکانس مد نظر خواهیم رسید. )
البته برداشت من این بودهه و باید تست زد و در عمل دید که همین کار رو می کنه یا نه ...

موفق باشید.
متشکر
ببینید من میخوام یه قطار پالس با دیوتی سایکل و فرکانس متغیر و حداقل دقت 0.01Hz بسازم. میکرویی هم که ازش استفاده میکنم ATmega32 با فرکانس کاری 8MHz که به خاطر بقیه قسمتای برنامه م قابل تغییر نیست. به خاطر همین رفتم سراغ تایمر 1 که 16 بیتی و دقتش نسبت به تایمر 0 خیلی بیشتره، اما با حرفای شما متوجه شدم که اونم کارم رو راه نمیندازه، چون مقدارش از 65535 که فکر میکردم رسید به 1024. به نظر شما من برای ساخت این قطار پالس چیکار کنم؟؟؟؟؟ اگه میشه لطف کنید و راهنماییم کنید. ممنون
نمی دونم واقعا چه کاربردی هست که نیاز به این دقت بالا داره!
شاید اون قسمت مدار رو بتونید طوری طراحی کنید که دقت کمتری نیاز داشته باشه ...
در هر صورت بین فرکانس و دیوتی سایکل همیشه یک trade-off وجود دارهه و این دقت رو بعید می دونم از یه فرکانسی بالاتر بشه ثابت نگه داشت!
با این اوصاف اگر می بینید AVR جوابگوی شما نیست، انتخاب بعدی ARM هست.
میکروی lpc1768 که الان واحد PWM اش رو یه مرور سریع کردم ، رجیسترهای شمارنده اش 32 بیتی هستن. می تونید جزئیات رو برای این واحدش بررسی کنید ببینید جوابگوی نیاز شما هست یا خیر ... .

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

دوست عزيز فكر نكنم براي اين منظور ،به اون دقتي كه عنوان كردين نياز باشه،ضمن اينكه اگر براي مداري نظير كنترل توان بخواين استفاده كنين نهايت فركانس شما همون 50 هرتز هست....
و با خيال راحت ميتونيد از همين تايمر نهايت استفاده رو ببريد
ممنون،
ولی حرف شما وقتی درسته که فرکانس برق شهری دقیقا 50Hz باشه، ولی متاسفانه اینجور نیست. به همین علته که میخوام دقتش بالا باشه، چون اگه به فرض مثال فرکانس برق شهر 50.01Hz باشه و میکرو موج رو با فرکانس 50Hz بسازه، خطای زیر به وجود میاد:
فرکانس میکرو: 50Hz در نتیجه زمانی که طول میکشه تو یک دقیقه 3000=60*50 پالس فرستاده میشه. حالا برای فرکانس برق شهر، یعنی 50.01Hz ، همین 3000 پالس، 59.988 ثانیه طول میکشه، یعنی 0.0119976 خطا که میشه 59.988 درصد یک سیکل!!
این مقدار خطا برای یک دقیقه واقعا وحشتناکه. یعنی اگه به تریستور تو 30 درجه فرمان آتش بدی، بعد یک دقیقه زاویه آتش میشه 245.9568 درجه.
حالا فهمیدین که این همه دقت برا چیه؟؟؟؟
مهندس پس کار مدار تشخیص گذر از صفر چیه اونوقت ؟! :d
(۲۳-خرداد-۱۳۹۴, ۱۰:۰۱:۳۹)hamze_b نوشته است: [ -> ]ممنون،
ولی حرف شما وقتی درسته که فرکانس برق شهری دقیقا 50Hz باشه، ولی متاسفانه اینجور نیست. به همین علته که میخوام دقتش بالا باشه، چون اگه به فرض مثال فرکانس برق شهر 50.01Hz باشه و میکرو موج رو با فرکانس 50Hz بسازه، خطای زیر به وجود میاد:
فرکانس میکرو: 50Hz در نتیجه زمانی که طول میکشه تو یک دقیقه 3000=60*50 پالس فرستاده میشه. حالا برای فرکانس برق شهر، یعنی 50.01Hz ، همین 3000 پالس، 59.988 ثانیه طول میکشه، یعنی 0.0119976 خطا که میشه 59.988 درصد یک سیکل!!
این مقدار خطا برای یک دقیقه واقعا وحشتناکه. یعنی اگه به تریستور تو 30 درجه فرمان آتش بدی، بعد یک دقیقه زاویه آتش میشه 245.9568 درجه.
حالا فهمیدین که این همه دقت برا چیه؟؟؟؟

دوست عزيز اين روش ك اصلا قابل قبول نييييييست،
روش صحيح كار اينه ك شما گذر از صفر رو تشخيص بدين و در ادامه به مقدار مورد نظرتون سيگنال تحريك رو ب گيت اعمال كنيد،اينطوري نياز به اون دقت زياد نياز نيست،

بطور مثال براي 50 درصد توان فقط نيازه براي 5 ميلي ثانيه گيت رو تو هر نيم سيكل تحريك كني ؛ك فكر كنم ايجاد چنين تاخيري كار سختي نباشه.


موفق باشيد
صفحه‌ها: 1 2