در این پروژه میخواهیم از یکی از ویژگیهای ATmega32A برای تنظیم روشنایی یک لامپ LED یک وات استفاده کنیم. روشی که برای تنظیم سرعت LED استفاده میشود، روش (Pulse Width Modulation یا مدولاسیون عرض پالس) PWM است.
در این آموزش PWM میکروکنترلر AVR، مفاهیم PWM و تولید PWM با جزئیات توضیح داده میشود. یک مدار ساده را همانطور که در شکل نشان داده شده است، در نظر بگیرید.
اکنون اگر کلید در شکل بالا به طور مداوم در طی یک بازه زمانی بسته شود، در این مدت لامپ به طور مداوم روشن است. اگر در یک چرخه 10 میلیثانیه، کلید برای 8 میلیثانیه بسته شود و برای 2 میلیثانیه باز شود، لامپ تنها در زمان 8 میلیثانیه روشن خواهد ماند. اکنون میانگین نهایی در طی یک دوره 10 میلی ثانیه =( (زمان روشنایی + زمان خاموشی)/ زمان روشنایی ) میباشد. این فرمول دوره کاری (نسبت زمان کاری ماشین به کل بازهی زمانی) نامیده میشود و مقدار آن برای این مثال، 80٪ است ((8 + 2) /8). بنابراین متوسط ولتاژ خروجی 80٪ ولتاژ باتری خواهد بود.
در حالت دوم، در یک دوره 10 میلیثانیه ای، اگر کلید برای مدت 5 میلیثانیه بسته شود و به مدت 5 میلیثانیه باز شود، متوسط ولتاژ ترمینال در خروجی، 50٪ ولتاژ باتری خواهد بود. اگر ولتاژ باتری 5 ولت و دوره کاری 50٪ باشد، میانگین ولتاژ ترمینال، 2.5 ولت خواهد بود.
در حالت سوم، دوره کاری 20٪ و متوسط ولتاژ ترمینال 20٪ ولتاژ باتری است.
در ATMEGA32A ما چهار کانال PWM داریم، کانالهای OC0 ، OC1A ، OC1B و OC2. در اینجا میخواهیم از کانال OC0 PWM، برای تغییرات میزان روشنایی LED استفاده کنیم.
قطعات مورد نیاز
سخت افزار :
- میکروکنترلر ATmega32
- منبع تغذیه (5 ولت)
- پروگرامر AVR-ISP
- خازن 100uF
- LED یک وات
- ترانزیستور TIP127
- کلید (2 عدد)
- خازن 100nf (بر روی آن عدد 104 نوشته شده است) (2 عدد)
- مقاومت 100Ω و 1kΩ (دو عدد)
نرم افزار :
- Atmel studio
- Progisp یا flash magic
شماتیک مدار و تشریح نحوه کار
شکل بالا مدار دیمر LED را با میکروکنترلر AVR نشان میدهد.
در ATmega برای چهار کانال PWM، چهار پین تعیین کردهایم. ما فقط میتوانیم خروجی PWM را در این پینها بگیریم. از آنجا که از PWM0 استفاده میکنیم، باید سیگنال PWM را در پین OC0 (پین سوم PORTB) بگیریم. همانطور که در شکل نشان داده شده است، میتوانیم بیس ترانزیستور را به پین OC0 وصل کنیم تا پاور LED را هدایت کنیم. در اینجا چیز دیگری بیش از چهار کانال PWM وجود دارد، دو کانال 8 بیتی PWM. در اینجا قصد داریم از یک کانال 8 بیتی PWM استفاده کنیم.
یک خازن برای جلوگیری از نویز به هر یک از کلیدها وصل شده است. هر زمان که یک کلید فشرده شود، نویز کمی در پین مشاهده میشود. اگرچه این نویز در میلیثانیه ثبات مییابد؛ اما برای کنترلر قلههای تیز قبل از تثبیت به عنوان محرک عمل میکند. این اثرات را میتوان به صورت نرم افزاری یا به وسیله سخت افزار از بین برد. ما از روش سخت افزاری با اضافه کردن خازن دفع نویز استفاده میکنیم.
خازنها اثر نویز کلیدها را خنثی میکنند.
در ATMEGA دو روش برای تولید PWM وجود دارد :
- تصحیح فاز PWM
- PWM سریع
در اینجا میخواهیم همه چیز را ساده نگه داریم. بنابراین میخواهیم از روش PWM سریع برای تولید سیگنال PWM استفاده کنیم.
ابتدا فرکانس PWM را انتخاب کنید، که معمولاً بستگی به کاربرد برای یک LED هر فرکانس بیشتر از HZ 50 مناسب است. به همین دلیل ما کلاک شمارنده 1MHZ انتخاب میکنیم. بنابراین Prescaler را انتخاب نمیکنیم. Prescaler عددی است انتخاب شده تا یک کلاک شمارنده کمتر به ما بدهد. به عنوان مثال، اگر کلاک نوسانساز 8MHZ است، میتوانیم یک Prescaler از 8 را انتخاب کنیم تا یک کلاک 1MHZ برای شمارنده دریافت کنیم. Prescaler براساس فرکانس انتخاب میشود. اگر میخواهیم پالسهای با دوره زمانی بیشتری داشته باشیم، باید Prescaler بالاتری را انتخاب کنیم.
حال برای به دست آوردن PWM سریع از کلاک 50Hz از ATMEGA، باید بیتهای مناسب را در ریجیستر “TCCR0” فعال کنیم. این تنها رجیستری است که برای به دست آوردن PWM سریع 8 بیتی نیاز داریم.
اکنون،
- CS00، CS01، CS02 (زرد) – prescaler را برای تعیین کلاک شمارنده انتخاب کنید. جدول مربوط به prescaler مناسب در زیر نشان داده شده است. بنابراین برای 1prescaler (کلاک نوسان ساز = کلاک شمارنده):
1=CS00، دو بیت دیگر صفر هستند.
- WGM01 و WGM00 برای تعیین حالت تولید شکل موج، بر اساس جدول زیر، برای PWM سریع تغییر یافته است. ما WGM00 = 1 و WGM01 = 1 داریم.
- اکنون میدانیم که PWM سیگنالی با نسبت کار (duty ratio) متفاوت یا تعداد دفعات روشن و خاموش مختلف است. تاکنون فرکانس و نوع PWM را انتخاب کردهایم. موضوع اصلی این پروژه در این بخش نهفته است. برای بدست آوردن نسبت کار متفاوت، میخواهیم مقداری بین 0 تا 255 را انتخاب کنیم (2 به توان 8 به دلیل 8 بیتی بودن). ما مقدار 180 را انتخاب میکنیم. زیرا وقت شمارنده از 0 شروع به شمارش میکند و به مقدار 180 میرسد. ممکن است پاسخ خروجی آغاز شود. این پاسخ ممکن است وارونه یا غیروارونه باشد. به این معنی که میتوان خروجی را برای رسیدن به شمارش کاهش یا افزایش داد.
این انتخاب یعنی کاهش یا افزایش توسط بیتهای CM00 و CM01 تعیین میشود.
همانطور که در جدول نشان داده شده است، برای اینکه خروجی در مقایسه با آن بالا برود و خروجی تا حداکثر مقدار (همانطور که در شکل در پایین نشان داده شده است) بالا بماند. باید برای انجام این کار حالت وارونه را انتخاب کنیم، بنابراین COM00 = 1؛ COM01 = 1
همانطور که در شکل زیر نشان داده شده است، OCR0 (مقایسه خروجی ریجیستر 0) بایت است که مقدار انتخاب شده توسط کاربر را ذخیره میکند. بنابراین اگر 180=OCR0 را تغییر دهیم، کنترلر هنگامی که شمارنده از 0 به 180 برسد، تغییر (زیاد) را ایجاد میکند.
حال برای تغییر درخشندگی LED، باید DUTY RATIO در سیگنال PWM را تغییر دهیم. برای تغییر نسبت کار، باید مقدار OCR0 را تغییر دهیم. وقتی این مقدار OCR0 را تغییر میدهیم، شمارنده برای رسیدن به OCR0 زمان متفاوتی را در نظر میگیرد. بنابراین کنترلر در زمانهای مختلف خروجی را بالا میبرد. بنابراین برای PWM در سیکلهای کاری مختلف، باید مقدار OCR0 را تغییر دهیم. در مدار دو کلید داریم. یک کلید برای افزایش مقدار OCR0 و در نتیجه افزایش DUTY RATIO در سیگنال PWM، دیگری برای کاهش مقدار OCR0 و در نتیجه کاهش DUTY RATIO سیگنال PWM.
کد
/ C Code for ATmega32 Microcontroller PWM #include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> int main(void) { DDRD = 0; DDRB = 0xFF; TCCR0 |=(1<<WGM00)|(1<<WGM01)|(1<<COM00)|(1<<COM01)|(1<<CS00); OCR0 = 0; while(1) { if (bit_is_clear(PIND,5)) { if (OCR0<255) { OCR0++; } _delay_ms(50); } if (bit_is_clear(PIND,6)) { if (OCR0>0) { OCR0--; } _delay_ms(50); } } }
- منبع: ترجمه از سایت circuitdigest
دیگر پروژهای AVR را هم مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام خیلی عالی و مفید بود متشکرم