به نام خدا : سلام خدمت شما بزرگواران، قبلا یادمه یه مطلب درباره FAST PWM گزاشتم (آموزش جامع میکروکنترلر AVR جلسه۱۱)، که توی اون مطلب پروژه هایی از کنترل دور موتور DC با هر سه تایمر گزاشته بودم، حالا تو این مطلب از آموزش AVR، میخوام جلسه دوم مد FAST PWM رو بزارم و این بار بر خلاف جلسه قبل که همش پروژه بود، تو این جلسه علاوه بر گزاشتن پروژه های AVR ، میخوام توضیح هم تا جایی که میشه بدم، این مطلب آموزش تایمر رو دارم مینویسم تا حالا شده ۶ هزار تا واژه(حالا نمیدونم واژه با کلمه فرق داره یا نه ) این مطالبی که از تایمر میبینید پروژه های تایمر هستن و آموزشش جداس که دارم کم کم آمادش میکنم…
آموزش جامع AVR جلسه ۱۵ Timer Counter FAST PWM Mode2
خب با نام خدا شروع میکنیم به نوشتن مطلب :
به نظرم اول پروژه ها رو بزارم و بعد شروع کنم به گفتن توضیحات و… این طور بهتره.
شماتیک هر سه پروژه یکسان هستش، ۳ پروژه = تایمر ۰ و ۱ و ۲
پروژه تغییر D.C با تایمر ۰ و مد FAST PWM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <mega16.h> #include <delay.h> void main(void) { int i; DDRB = (0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); PORTB = (0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // TIMER0 // Clock Timer0 = CLK/8 >>>>> CS00 = 0, CS01 = 1, CS02 = 0 // Mode = Fast PWM >>>>> WGM00 = 1, WGM01 = 1 // Clear OC0 on compare match, set OC0 at BOTTOM >>>>> COM00 = 0, COM01 = 1 TCCR0 = (0<<FOC0) | (1<<WGM00) | (1<<COM01) | (0<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00); TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0); TCNT0 = 0; OCR0 = 0; while(1) { for(i=0; i<= 255; i=i+20) { OCR0 = i; delay_ms(1000); } for(i=255; i>= 0; i=i-20) { OCR0 = i; delay_ms(1000); } }; } |
پروژه تغییر D.C با تایمر ۱ و مد FAST PWM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <mega16.h> #include <delay.h> void main(void) { int i; DDRD = (0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); PORTD = (0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // TIMER1 // Clock Timer1 = CLK/8 >>>>> CS10 = 0, CS11 = 1, CS12 = 0 // Mode = FAST PWM >>>>> WGM10 = 1, WGM11 = 1, WGM12 = 1, WGM13 = 0 // Toggle OC1A/OC1B on compare match >>>>> COM1B0 = 0, COM1B1 = 1, COM1A0 = 0, COM1A1 = 1 TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (1<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10); //TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0 ); //TCNT1L = 0X00; TCNT1H = 0X00; //OCR1AL = 0XF0; OCR1AH = 0X00; //OCR1BL = 0XFF; OCR1BH = 0X03; TCNT1 = 0; while(1) { for(i=0; i<=1023; i=i+100) { OCR1A = i; OCR1B = 1023-i; delay_ms(1000); } for(i=1023; i>=0; i=i-100) { OCR1A = i; OCR1B = 1023-i; delay_ms(1000); } }; } |
پروژه تغییر D.C با تایمر ۲ و مد FAST PWM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <mega16.h> #include <delay.h> void main(void) { int i; DDRD = (1<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); PORTD = (0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // TIMER2 // Clock Timer2 = CLK/8 >>>>> CS20 = 0, CS21 = 1, CS22 = 0 // Mode = FAST PWM >>>>> WGM20 = 1, WGM21 = 1 // Clear OC2 on compare match, set OC2 at BOTTOM >>>>> COM20 = 0, COM21 = 1 TCCR2 = (0<<FOC2) | (1<<WGM20) | (1<<COM21) | (0<<COM20) | (1<<WGM21) | (0<<CS22) | (1<<CS21) | (0<<CS20); TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0); //ASSR = (0<<AS2) | (0<<TCN2UB) | (0<<OCR2UB) | (0<<TCR2UB); TCNT2 = 0; OCR2 = 125; while(1) { for(i=0; i<=255; i=i+20) { OCR2 = i; delay_ms(1000); } for(i=255; i>=0; i=i-20) { OCR2 = i; delay_ms(1000); } }; } |
دانلود پروژه FAST PWM با Avr | سه پروژه این مطلب
محاسبه فرکانس و D.C در مد FAST PWM
خب رسیدیم به بحث جالبی، تو دیتاشیت مگا ۱۶ برا محاسبه فرکانس تایمر تو مد FAST PWM مثل این که دو تا فرمول دارم، یکی برا تایمر ۱۶ بیتی(تایمر۱) و یه فرمول هم برا تایمر های ۸ بیتی(تایمر ۰ و ۲)، حالا این که چرا دو تا فرمول دارم و نه یه دونه و این که از کجا اومدن این فرمول ها، در ادامه میخوام دربارش صحبت کنیم.
تو تایمر ۰ و ۲، تو مد FAST PWM تایمر از BOTTOM (همون ۰) میشموره تا MAX (همون ۲۵۶) و بعد دوباره مقدار تایمر ۰ شده و از BOTTOM میشموره ….
و تو این شمارش هر موقع مقدار تایمر (TCNTn) با مقدار ریجستر های مقایسه (OCRn) برابر بشه، پایه مقایسه ای(OCn) تغییر حلت داده(البته اگه روی toggle تنظیمش کرده باشین.) و تایمر به شمارش خودش ادامه میده و…
ولی نکته اینجاس که تو تایمر ۱۶ بیتی یعنی تایمر ۱، تایمر از BOTTOM میشموره تا TOP، که برا هر سه تایمر میتونید این موضوع رو تو ۳ جدول زیر(+توضیحات داده شده من ) ببینید.
PWM چیست؟!
بررسی نحوه تولید امواج DTMF بوسیله خروجی PWM میکروکنترلر
مطلب طولانی شد و طبق معمومل من باز غاط! زدم، اگه چیزی رو جا انداختم لطفا بگید.
آها یادم اومد، این که اون فرمول بالا از کجا اومد رو نگفتم، در زیر الان توضیح میدم :
فرمول محاسبه فرکانس در PWM
تو بالا یه فرمولی(عکس) گزاشتم که در زیر هم میبینیدش، حالا میخوام نحوه محاسبه این فرمول رو بگم و این که این فرمول از کجا اومده و…
در زیر محاسبات رو انجام دادم(رو کاغذ) و براتون میزارم در زیر تا برید حالشو ببرید، میبینید چقدر به فکرتون هستم
در شکل زیر منظور از
Fm = فرکانس میکرو
FT = فرکانس تایمر
TT = دوره تناوب تایمر
N = ضریب تقیسم فرکانسی
TOP = تو تایمر ۰ و ۲ برابر MAX هستش و تو تایمر ۱ میشه تعینش کرد.
بازم فک میکنم یه چیز رو جا انداختم ، اگه فهمیدید بگید.
خب دیگه مطلب طولانی شد، منم حوصلم بیشتر از شما سر رفته.
اگه از این مطلب خوشتون اومد و مفید بود برا تعجیل در فرج آقا و سلامتی رهبر و علمای اسلام و مسئولین خدمت گزار به کشور و اسلام، ۳ تا صلوات بفرستید.
زیاد مزاحمتون نمیشم.
یا علی.
مهمان
سلام و درود..مهدی جان من تازه واردم و AVR رو شروع کردم بر همین نمیتونم نظر بدم فقط میتونم بگم دمت گرم خدا خیرت بده تا همین الانشم خیلی استفاده کردم از مطالبت…جواب خیلی از سوالاتی رو که توی کتابا و جاهای دیگه نتونستم پیداکنم اینجااز شما یاد گرفتم
معلم خوبی هستی..بهترازاین نمیتونم تشکرکنم

مهمان
سلام اگر بخوایم یک سیگنال که دیوتی سایکلش تغییر میکنه رو اندازه گیری کنیم باید چکار کنیم
مهمان
جزاکم الله خیرا
مهمان
آقا مهدی سلام
در مورد مدل ال سی دی گرافیکی که امر فرمودی KS0108 ممنوننت میشم راه اندازیش را داخل اردوینو هر وقت که فرصت داشتی یادم بدی
با تشکر
مهمان
سلام خسته نباشی
میتونی یه زحمت بکشی داخل آموزش آردوینو یه آموزش راه اندازی ال سی دی گرافیکی هم بذاری
با تشکر
نویسنده این مطلب
سلام
چه مدلی؟
فعلا که دانشگاه هستم و قطعاتش پیشم نیست متاسفانه
ولی رفتم خونه چشم
فعلا شما مدل LCD رو بگید
مهمان
آقا مهدی (رئیس بزرگ) سلام دوباره
آقا آرم رو که یادمون ندادی .یه دردسر دیگه برات دارم.چه جوری میشه تو آردوینو ال سی دی گرافیکی را راه انداخت؟با توجه به کمبود پایه برد UNO چه کارش کنیم؟از برد مگا استفاده بشه؟ به چه صورت؟
الهی تب کنم شاید پرستارم تو باشی
با تشکر
نویسنده این مطلب
سلام سالار
بگرد کتابخونش رو برا آردوینو پیدا کن…..بعد راه اندازیش کاری نداره.
مهمان
هیچ منبع فارسی به این حجم کم ، کامل و عالی توضیح نداده است . ممنون ادامه دهید . من شخصا هر ۲ روز یک بار به سایت شما سر می زنم . شما عالی هستید . پردازش تصویر و کار با نرم افزار QT را هم کار کنید .
نویسنده این مطلب
سلام
….. فعلا دارم انگلیسیم رو قوی میکنم….چون مطلب فارسی برا دو مورد فوق کم هستش ب زبون فارسی
والا چند روز نور بالا زده بودیم پی کاراش بودیم(البته الان هم نور بالا میزنیم)…..لذا وقت نکردم مطلب بزارم تو سایت
اون دو تایی هم که گفتید توی برنامم هستش.
مهمان
تشکر
نویسنده این مطلب
خواهش
مهمان
آقا مهدی کلا دستخطت داره شنا میکنه!^_^
نویسنده این مطلب